WordPress登录使用随机安全码

By | 2017年12月7日

前面的《WordPress登录验证码》,在登录时使用最简单的验证,发现仍有漏网之鱼尝试登录。

现在改为了随机安全码登录,原理是:

载入登录页面后,在后台生成随机数字,然后通过telegram接口发送通知,同时保存到session中,页面提交POST时,验证用户输入的安全码是否和session中的一样。

一个简单的随机安全码功能就这完成了。

在主题的functions.php中加入:

session_start();
 function send_get($urlstring){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $urlstring);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
	$result = curl_exec($ch);
	curl_close($ch);
	return $result;
}
function notice_telegram($text){
	$text = "博客登录安全码:".$text;
	$url = "https://xxxx/send.php?tgid=xxxx&text=".urlencode($text);//这里修改为自己服务器的文件和id
	send_get($url);
}

function myplugin_add_login_fields() {
		
        $num1=rand(123,5678);
	$num2=rand(345,9823);
	$code = $num1 + $num2;
	$_SESSION['seccode'] = $code;
	notice_telegram($code);
	echo "<p><label for='math' class='small'>验证码</label><br />输入随机安全码<input type='password' name='seccode' class='input' value='' size='25' tabindex='4'></p>";
}
add_action('login_form','myplugin_add_login_fields');

function login_val() {
	if(!isset($_POST['seccode']))
		return;
	
	$seccode=$_POST['seccode'];
	switch($seccode){
		case $_SESSION['seccode']:
		      unset($_SESSION['seccode']);
		      break;
		case null:wp_die('错误: 请输入安全码.');break;
		default:wp_die('错误: 安全码错误,请重试.');
	}
}
add_action('login_form_login','login_val');