这篇文章主要讲解了“如何实现ThinkPHP令牌验证”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习”如何实现ThinkPHP令牌验证”吧!
ThinkPHP内置了表单令牌验证功能,可以有效防止表单的远程提交等安全防护。
表单令牌验证相关的配置参数有:
& # 39; TOKEN_ON& # 39;=祝辞;的确,,//,是否开启令牌验证, & # 39;TOKEN_NAME& # 39;=祝辞& # 39;__hash__& # 39;,,//,令牌验证的表单隐藏字段名称, & # 39;TOKEN_TYPE& # 39;=祝辞& # 39;MD5 # 39;,,//令牌哈希验证规则,默认为MD5
如果开启表单令牌验证功能,系统会自动在带有表单的模板文件里面自动生成以TOKEN_NAME为名称的隐藏域,其值则是TOKEN_TYPE方式生成的哈希字符串,用于实现表单的自动令牌验证。
自动生成的隐藏域位于表单形式结束标志之前,如果希望自己控制隐藏域的位置,可以手动在表单页面添加__TOKEN__标识,系统会在输出模板的时候自动替换。如果在开启表单令牌验证的情况下,个别表单不需要使用令牌验证功能,可以在表单页面添加__NOTOKEN__,则系统会忽略当前表单的令牌验证。
如果页面中存在多个表单,建议添加__TOKEN__标识,并确保只有一个表单需要令牌验证。
模型类在创建数据对象的同时会自动进行表单令牌验证操作,如果你没有使用创建方法创建数据对象的话,则需要手动调用模型的autoCheckToken方法进行表单令牌验证。如果返回假,则表示表单令牌验证错误。例如:
User 美元;=,M (“User");,//,实例化用户对象,//,手动进行令牌验证, if (! $ User→autoCheckToken ($ _POST)) {,//,令牌验证错误, }
在ThinkPHP框架的View.class。php里定义了一个公共的模板替换函数
protected function templateContentReplace(内容),{ ,//系统默认的特殊变量替换 ,replace 美元;=,阵列( ,& # 39;. ./公共# 39;,=祝辞,APP_PUBLIC_PATH,//,项目公共目录 ,& # 39;__PUBLIC__& # 39;,=祝辞,WEB_PUBLIC_PATH,//,站点公共目录 ,& # 39;__TMPL__& # 39;,=祝辞,APP_TMPL_PATH,,//,项目模板目录 ,& # 39;__ROOT__& # 39;,=祝辞,__ROOT__,,//,当前网站地址 ,& # 39;__APP__& # 39;,=祝辞,__APP__,,//,当前项目地址 ,& # 39;__UPLOAD__& # 39;,=祝辞,__ROOT__强生# 39;/上传# 39; ,& # 39;__ACTION__& # 39;,=祝辞,__ACTION__,,//,当前操作地址 ,& # 39;__SELF__& # 39;,=祝辞,__SELF__,,//,当前页面地址 ,& # 39;__URL__& # 39;,=祝辞,__URL__, ,& # 39;__INFO__& # 39;,=祝辞,__INFO__, ,); ,如果(定义(& # 39;group_name # 39;)) ,{ ,美元取代[& # 39;__GROUP__& # 39;],=, __GROUP__;//,当前项目地址 ,} ,如果(C (& # 39; TOKEN_ON& # 39;)), { 美元,如果(大小写敏感(内容,& # 39;{__TOKEN__} & # 39;)), { ,//指定表单令牌隐藏域位置 ,美元取代[& # 39;{__TOKEN__} & # 39;],=, $ this→buildFormToken (); 美元,}elseif(大小写敏感(内容,& # 39;{__NOTOKEN__} & # 39;)) { ,//标记为不需要令牌验证 ,美元取代[& # 39;{__NOTOKEN__} & # 39;],=, & # 39; & # 39;; ,}elseif (preg_match (& # 39;/& lt; \/形式(\ s *)祝辞/如果# 39;,内容,美元与美元)),{ ,//智能生成表单令牌隐藏域 ,取代美元($匹配[0]],=,$ this→buildFormToken()。$匹配[0]; ,} ,} ,//允许用户自定义模板的字符串替换 ,如果(is_array (C (& # 39; TMPL_PARSE_STRING& # 39;)),) ,replace 美元;=,array_merge(取代美元,C (& # 39; TMPL_PARSE_STRING& # 39;)); ,content 美元;=,str_replace(中的(取代美元),元素(取代美元),美元内容); 美元,return 内容; 以前,}>上面的如果(C (& # 39; TOKEN_ON& # 39;))是对令牌验证的开启状态进行判断,若开启则调用buildFormToken()方法,$ _SESSION [$ tokenName]=$ tokenValue;其实就是给$ _SESSION [& # 39; __hash__& # 39;)赋值。如果不想进行令牌验证,只要在页面的& lt;/form>之前加入{__NOTOKEN__}就行了,它会被函数替换成空。
在ThinkPHP的Model.class。php类里定义了令牌的验证函数
//,表单令牌验证 ,如果(C (& # 39; TOKEN_ON& # 39;),,,, ! $ this→autoCheckToken(数据)美元),{ ,$ this→error =, L (& # 39; _TOKEN_ERROR_& # 39;); ,return 假; ,} ,//自动表单令牌验证 ,public function  autoCheckToken(元数据),{ ,name 美元;=,C (& # 39; TOKEN_NAME& # 39;); ,如果(收取($ _SESSION[名字]美元)),{ ,//当前需要令牌验证 美元,如果(空($ data[名字]),| |,$ _SESSION[名字]美元,!=,$ data[名字]美元),{ ,//非法提交 ,return 假; ,} ,//验证完成销毁会话 ,设置($ _SESSION[名字]美元); ,} ,return 真实; ,}如何实现ThinkPHP令牌验证