本文针对ThinkPHP3.2版本,如说TP5,请绕行。
TP自带验证码方法、自带验证码校验方法,使用极为方便,但是如果有多次校验需求时(例如:ajax首先验证一次,提交表单时再验证一次),自带的校验方法不可取,原因自带的校验方法在第一次验证之后会把SESSION中的验证码清空,故第二次验证彻底无效。
打印SESSION中的信息可以发现,存在SESSION中的验证码是一个经过加密的字串,这意味着我们单纯的用POST接收到的code是不能和SESSION中的code直接做对比,为此我们需要摸透TP验证码的加密规则。
打开TP的验证码类文件(ThinkPHP\Library\Think\Verify.class.php),在配置参数中会看到验证码的加密秘钥,默认是'ThinkPHP.CN',这是加密的会用到的重要参数
加密规则:
1、使用md5首先把加密秘钥(上文提到)加密,然后用substr截取加密后的字串,TP默认从第5个字符开始截取,截取8个字符;
2、使用md5加密输入的验证码字符串,然后用substr截取加密后的字串,TP默认从第8个字符开始截取,截取10个字符;
3、把第一次截取到的8个字符和第二次截取到的10个字符拼接成一个串,再次使用md5把刚得到的字串加密,既得到SESSION中保存的验证码加密字串
(ThinlPHP验证码加密方法)
明白了它的加密规则,做项目时便可以自行验证,多次验证也都OK
除此之外还可以修改TP验证码校验的方法来实现多次校验,下图是自带的校验方法
我们可以看到红框圈中的部分,一旦验证成功便会把SESSION中的code清空,把session($key, null)此行代码注释掉即可,这种做法不推荐。
打赏