今天自制了一个CI中的依赖SESSION验证的验证码机制,总算了解了长时间一个“心愿”,今天总算下决心解决了!
CI官方文档中的使用是将验证码传到数据库 然后结合数据库进行验证,这肯定是最为安全的,可以防止SESSION欺骗,而且可以解决不支持SESSION的浏览器进行正常验证
但是太繁琐了,于是自己想了一个通过将生成的验证码相关信息存入SESSION,登录的时候直接通过SESSION进行验证就可
这样来说比较简单,所以上代码:
控制器部分,我是把login和verifylogin做成了两个不同的function
login部分代码:
public function login(){
$vals = array(
'word' => rand(1000, 10000),
'img_path' => './captcha/',
'img_url' => base_url().'captcha/',
//'font_path' => './path/to/fonts/texb.ttf',
'img_width' => '150',
'img_height' => 30,
'expiration' => 7200
);
$cap = create_captcha($vals);
//将验证码信息存入SESSION 别忘了控制器构造函数引入$this -> load -> library('session');
$_SESSION["captcha_word"] = $cap["word"];
$_SESSION["captcha_time"] = $cap["time"];
$_SESSION["captcha_image"] = $cap["image"];
$_SESSION["captcha_image_h"] = $cap["image"];
$data["captcha"] = $cap;
$this -> load ->view("Admin/login",$data);
}
verifylogin部分代码
if($_SESSION["captcha_word"]!=$_POST["captcha"] && (time()-$_SESSION["captcha_time"])<7200){//7200超时限制
$res = false;
}
就可以对验证码判断并判断$res的正确性进行登录,
当然这样会发现SESSION中存储的验证码可能会被读取并解密,日后会附上MD5+SALT的相关补充。