经常需要利用验证码进行初步验证,比如登录、注册、留言版等都需要验证码,放置某些机器恶意填写无数表单提交,导致数据库被消耗或者网站资源被消耗,严重的还导致用户数据丢失被盗等。而验证码可以一定程度上减少恶意攻击的行为。
thinkphp提供了验证码类,可以很方便地实现和调用。下面是一个简单的tp验证码栗子:
<?php
namespace Home\Controller;
use Think\Controller;
class VerifyController extends Controller {
//生成验证码
public function index(){
$Verify = new \Think\Verify();
$Verify->fontSize = 25;//字体大小
$Verify->length = 4;//长度
$Verify->reset = ture;//是否重置
$Verify->useNoise = false;//是否关闭像素点
$Verify->entry();//显示
}
//检测验证码
function check_verify($code, $id = ''){
$config = array(
'reset' => ture, // 验证成功后是否重置,—————这里才是有效的。
);
$verify = new \Think\Verify($config);
if($verify->check($code, $id)){
$data=1;
$this->ajaxReturn($data);
}else{
$data=2;
$this->ajaxReturn($data);
}
$verify = new \Think\Verify();
return $verify->check($code, $id);
}
}
//以下是js部分,用来点击刷新验证码、验证验证码,利用了ajax方式验证
<script type="text/javascript">
$("#Verify").click(function() {
var verifyURL = "<?php echo U('/Home/Verify/');?>";
var time = new Date().getTime();
$("#Verify").attr({
"src" : verifyURL
});
});
$("#code").blur(function() {
$.post("<?php echo U('/Home/Verify/check_verify');?>", {
code : $("#code").val()
}, function(data) {
if (data !== 1) {
//验证码输入不正确
alert("验证码错误。");
}
});
});
</script>
在页面调用验证码:
<img src="{:U('/Home/Verify/')}" alt="验证码" title="刷新" id="Verify" name="code">
验证码错误解决:
如果验证码输入正确而又提示错误,那么就是可能是你的session没有开启了。因为tp的验证码类利用了session,关闭了就不行了。默认情况下TP的'SESSION_AUTO_START' =>true,是开启session的,我已经在配置里面设置为false。所以无法生成session,每次ajax返回的date都是2,这就是为什么验证码输入正确而提示错误的原因。解决也很方便,在登录页面或者直接在入口文件加入session_start();即可。