WordPress 註冊表單添加驗證問題(支持多個隨機問題)

通常網站的註冊表單都使用驗證碼來進行驗證,但是有沒有考慮過使用驗證問題來驗證呢?使用問題驗證的好處在於:防止機器人註冊(和驗證碼一樣),隻有知道答案的人才能註冊(可用於限制用戶註冊)。下面將添加一個驗證問題:中國的首都是哪裡?答案是個正常人都知道:北京。

security-question-wpdaxue_com

將下面的代碼添加到主題的 functions.php 即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * WordPress 註冊表單添加驗證問題
 * https://www.wpdaxue.com/add-a-security-question-to-the-register-screen.html
 */
add_action( 'register_form', 'add_security_question' );
function add_security_question() { ?>
	<p>
	<label><?php _e('中國的首都是哪裡?') ?><br />
		<input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" /></label>
	</p>
<?php }
 
add_action( 'register_post', 'add_security_question_validate', 10, 3 );
function add_security_question_validate( $sanitized_user_login, $user_email, $errors) {
	// 如果沒有回答
	if (!isset($_POST[ 'user_proof' ]) || empty($_POST[ 'user_proof' ])) {
		return $errors->add( 'proofempty', '<strong>錯誤</strong>: 您還沒有回答問題。'  );
	// 如果答案不正確
	} elseif ( strtolower( $_POST[ 'user_proof' ] ) != '北京' ) {
		return $errors->add( 'prooffail', '<strong>錯誤</strong>: 您的回答不正確。'  );
	}
}

/**
* WordPress 註冊表單添加驗證問題
* https://www.wpdaxue.com/add-a-security-question-to-the-register-screen.html
*/
add_action( ‘register_form’, ‘add_security_question’ );
function add_security_question() { ?>
<p>
<label><?php _e(‘中國的首都是哪裡?’) ?><br />
<input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" /></label>
</p>
<?php } add_action( ‘register_post’, ‘add_security_question_validate’, 10, 3 );
function add_security_question_validate( $sanitized_user_login, $user_email, $errors) {
// 如果沒有回答
if (!isset($_POST[ ‘user_proof’ ]) || empty($_POST[ ‘user_proof’ ])) {
return $errors->add( ‘proofempty’, ‘<strong>錯誤</strong>: 您還沒有回答問題。’ );
// 如果答案不正確
} elseif ( strtolower( $_POST[ ‘user_proof’ ] ) != ‘北京’ ) {
return $errors->add( ‘prooffail’, ‘<strong>錯誤</strong>: 您的回答不正確。’ );
}
}

註:第 8 行是問題,第 19 行是正確的答案。

如果你想限制用戶註冊,將問題和答案設置為隻有某些人知道的即可(比如隻在某個Q群告知)

2013-10-08 更新:

有朋友詢問如何添加多個隨機問題,感謝 @Rilun 提供瞭解決辦法。

要實現多個隨機問題,需要添加兩個數組,分別存放著問題和答案,再增加一個兩個函數都能取到的隨機數(也就是在註冊表單開始之前進行一個Session)即可。代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * WordPress 註冊表單添加驗證問題(支援多個隨機問題)
 * https://www.wpdaxue.com/add-a-security-question-to-the-register-screen.html
 */
function rand_reg_question(){
	$register_number=rand(0,1); // 設置隨機數的返回范圍
	$_SESSION['register_number']=$register_number;
}
add_action('login_head','rand_reg_question');
 
global $register_questions;
global $register_answers;
// 添加問題數組
$register_questions=array('中國的首都在哪裡?','Google是哪個國傢的公司?');
// 添加答案數組(與上面的問題對應)
$register_answers=array('北京','美國');
 
add_action( 'register_form', 'add_security_question' );
function add_security_question() {
	global $register_questions;
	$register_number=$_SESSION['register_number'];
	?>
	<p>
		<label><?php echo $register_questions[$register_number];?><br />
			<input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" />
		</label>
	</p>
<?php }
 
add_action( 'register_post', 'add_security_question_validate', 10, 3 );
function add_security_question_validate( $sanitized_user_login, $user_email, $errors) {
	global $register_answers;
	$register_number=$_SESSION['register_number'];
	if (!isset($_POST[ 'user_proof' ]) || empty($_POST[ 'user_proof' ])) {
		return $errors->add( 'proofempty', '<strong>錯誤</strong>: 您還沒有回答問題。' );
	} elseif ( strtolower( $_POST[ 'user_proof' ] ) != $register_answers[$register_number] ) {
		return $errors->add( 'prooffail', '<strong>錯誤</strong>: 您的回答不正確。' );
	}
}

/**
* WordPress 註冊表單添加驗證問題(支援多個隨機問題)
* https://www.wpdaxue.com/add-a-security-question-to-the-register-screen.html
*/
function rand_reg_question(){
$register_number=rand(0,1); // 設置隨機數的返回范圍
$_SESSION[‘register_number’]=$register_number;
}
add_action(‘login_head’,’rand_reg_question’); global $register_questions;
global $register_answers;
// 添加問題數組
$register_questions=array(‘中國的首都在哪裡?’,’Google是哪個國傢的公司?’);
// 添加答案數組(與上面的問題對應)
$register_answers=array(‘北京’,’美國’); add_action( ‘register_form’, ‘add_security_question’ );
function add_security_question() {
global $register_questions;
$register_number=$_SESSION[‘register_number’];
?>
<p>
<label><?php echo $register_questions[$register_number];?><br />
<input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" />
</label>
</p>
<?php } add_action( ‘register_post’, ‘add_security_question_validate’, 10, 3 );
function add_security_question_validate( $sanitized_user_login, $user_email, $errors) {
global $register_answers;
$register_number=$_SESSION[‘register_number’];
if (!isset($_POST[ ‘user_proof’ ]) || empty($_POST[ ‘user_proof’ ])) {
return $errors->add( ‘proofempty’, ‘<strong>錯誤</strong>: 您還沒有回答問題。’ );
} elseif ( strtolower( $_POST[ ‘user_proof’ ] ) != $register_answers[$register_number] ) {
return $errors->add( ‘prooffail’, ‘<strong>錯誤</strong>: 您的回答不正確。’ );
}
}

註:請編輯 14 和 16 行修改問題和答案,如果你修改瞭問題的數量,請記得修改第 6 行的 隨機數返回范圍 rand(0,1) ,比如 3 個問題,修改為 rand(0,2) ,更多說明,請參考 rand() 函數文檔。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *