如何实现ThinkPHP令牌验证

  介绍

这篇文章主要讲解了“如何实现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令牌验证