Thinkphp3.2实用篇之计算型验证码示例
程序员文章站
2024-03-07 10:16:08
是不是觉得普通的验证码已经没办法满足,接下来介绍如何将tp现有的验证码改为计算型验证码:
首先找到:thinkphp\library\think\verify.class...
是不是觉得普通的验证码已经没办法满足,接下来介绍如何将tp现有的验证码改为计算型验证码:
首先找到:thinkphp\library\think\verify.class.php
在其中加入以下代码:
public function entry_add($id = '') { $this->length='3'; // 图片宽(px) $this->imagew || $this->imagew = $this->length*$this->fontsize*1.5 + $this->length*$this->fontsize/2; // 图片高(px) $this->imageh || $this->imageh = $this->fontsize * 2.5; // 建立一幅 $this->imagew x $this->imageh 的图像 $this->_image = imagecreate($this->imagew, $this->imageh); // 设置背景 imagecolorallocate($this->_image, $this->bg[0], $this->bg[1], $this->bg[2]); // 验证码字体随机颜色 $this->_color = imagecolorallocate($this->_image, mt_rand(1,150), mt_rand(1,150), mt_rand(1,150)); // 验证码使用随机字体 $ttfpath = dirname(__file__) . '/verify/' . ($this->usezh ? 'zhttfs' : 'ttfs') . '/'; if(empty($this->fontttf)){ $dir = dir($ttfpath); $ttfs = array(); while (false !== ($file = $dir->read())) { if($file[0] != '.' && substr($file, -4) == '.ttf') { $ttfs[] = $file; } } $dir->close(); $this->fontttf = $ttfs[array_rand($ttfs)]; } $this->fontttf = $ttfpath . $this->fontttf; if($this->useimgbg) { $this->_background(); } if ($this->usenoise) { // 绘杂点 $this->_writenoise(); } if ($this->usecurve) { // 绘干扰线 $this->_writecurve(); } // 绘验证码 $code = array(); // 验证码 $symbol=array('+','-'); $codenx = 0; // 验证码第n个字符的左边距 $now_symbol=$symbol[rand(0,1)]; for ($i = 0; $i<$this->length; $i++) { if($i==1){ $code[$i] = $now_symbol; $codenx += mt_rand($this->fontsize*1.2, $this->fontsize*1.6); imagettftext($this->_image, $this->fontsize,0, $codenx, $this->fontsize*1.6, $this->_color, $ttfpath.'2.ttf', $code[$i]); } else{ $code[$i] = $this->codeset[mt_rand(0, strlen($this->codeset)-1)]; $codenx += mt_rand($this->fontsize*1.2, $this->fontsize*1.6); imagettftext($this->_image, $this->fontsize, mt_rand(-40, 40), $codenx, $this->fontsize*1.6, $this->_color, $this->fontttf, $code[$i]); } } // 保存验证码 $key = $this->authcode($this->sekey); $str=implode('', $code); eval("\$re=$str;"); $code = $this->authcode($re); $secode = array(); $secode['verify_code'] = $code; // 把校验码保存到session $secode['verify_time'] = now_time; // 验证码创建时间 session($key.$id, $secode); header('cache-control: private, max-age=0, no-store, no-cache, must-revalidate'); header('cache-control: post-check=0, pre-check=0', false); header('pragma: no-cache'); header("content-type: image/png"); // 输出图像 imagepng($this->_image); imagedestroy($this->_image); }
public function check_add($code, $id = '') { $key = $this->authcode($this->sekey).$id; // 验证码不能为空 $secode = session($key); if($code===false || empty($secode)) { return false; } //验证码是否是数字 if(!is_numeric($code)) { return false; } // session 过期 if(now_time - $secode['verify_time'] > $this->expire) { session($key, null); return false; } if($this->authcode($code) == $secode['verify_code']) { $this->reset && session($key, null); return true; } return false; }
生成方法:
public function verify(){ import('org.util.verify'); $verify = new verify(); $verify->usenoise = true; $verify->codeset = '0123456789'; $verify->usecurve = false; $verify->entry_add(); }
验证方法:
if (!check_verify($verify,'','add')) { $this->error('验证码错误!'); return; }
调用的公共方法:
// 检测输入的验证码是否正确,$code为用户输入的验证码字符串 function check_verify($code, $id = '',$type=''){ import('org.util.verify'); $verify = new verify(); if($type='add'){ return $verify->check_add($code, $id); } else{ return $verify->check($code, $id); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。