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

將下面的代碼添加到主題的 functions.php 即可:
/**
* WordPress 注冊表單添加驗證問題
* http://www.ydqwiac.cn/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 提供了解決辦法。
要實現(xiàn)多個隨機問題,需要添加兩個數(shù)組,分別存放著問題和答案,再增加一個兩個函數(shù)都能取到的隨機數(shù)(也就是在注冊表單開始之前進行一個Session)即可。代碼如下:
/**
* WordPress 注冊表單添加驗證問題(支持多個隨機問題)
* http://www.ydqwiac.cn/add-a-security-question-to-the-register-screen.html
*/
function rand_reg_question(){
$register_number=rand(0,1); // 設置隨機數(shù)的返回范圍
$_SESSION['register_number']=$register_number;
}
add_action('login_head','rand_reg_question');
global $register_questions;
global $register_answers;
// 添加問題數(shù)組
$register_questions=array('中國的首都在哪里?','Google是哪個國家的公司?');
// 添加答案數(shù)組(與上面的問題對應)
$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 行修改問題和答案,如果你修改了問題的數(shù)量,請記得修改第 6 行的 隨機數(shù)返回范圍 rand(0,1) ,比如 3 個問題,修改為 rand(0,2) ,更多說明,請參考 rand() 函數(shù)文檔。
聲明:本站所有文章,如無特殊說明或標注,均為本站原創(chuàng)發(fā)布。任何個人或組織,在未征得本站同意時,禁止復制、盜用、采集、發(fā)布本站內(nèi)容到任何網(wǎng)站、書籍等各類媒體平臺。如若本站內(nèi)容侵犯了原著者的合法權益,可聯(lián)系我們進行處理。





請教一下,站點使用了主題自帶的注冊和登陸頁面,非系統(tǒng)界面,具體怎么安裝驗證問題的功能?已經(jīng)試過,將代碼添加到主題的 functions.php 里無任何效果,現(xiàn)在煩死了,每天都有大量的yahoo郵箱注冊的垃圾賬戶,封IP也解決不了!
請聯(lián)系主題作者,他比較熟悉主題代碼
第二個他忘寫session_start()了
有沒有在注冊頁面添加一個QQ郵箱是否訂閱的功能呢?
多個問題的還有問題,得矯正一下
已添加問題,但是自定義的注冊頁面(露兜的那個)顯示不出,如何添加到特定頁面呢?
第一段正常。第二段隨機的代碼添加后,注冊后臺能正常顯示問題,但是答案不論怎么填都是提示 錯誤: 您的回答不正確。
請博主測試。
我也碰到了同樣的問題
應該是答案也隨機了
這些代碼添加到哪個文件里呢?函數(shù)文件還是注冊模版文件?謝謝
添加到主題的 functions.php 即可
嗯 謝謝 我的是自定義注冊頁面 我想要的效果是在我的注冊頁面里顯示一個這樣的驗證,我想問我這樣的代碼應該怎么加?謝謝了
怎么隨機呢,表示不會PHP,哈哈
我也不知道如何隨機,但是設定一個問題即可,弄那么多干啥呢
文章已經(jīng)更新,可以支持多個隨機問題啦