前面的《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');