首先我要吐槽一个问题:为何在博客园发布的文章老是被其余网站采集过去,而他们采集过去后,排名比博客园还好,好比这篇文章,我把标题复制到百度搜索,结果第一页的搜索结果所有都是采集个人,而我在博客园发布的这篇文章居然直接没有收录,大哥们啊,搞清楚好吗,我这是原创文章。php
如题,在有些项目中,咱们须要把模板开放给第三方用户编辑,那么此时模板里面能使用php代码,将会是很重大的安全隐患。安全
那么如何禁止模板里面使用php代码呢?官方没有给出一个配置项,这是很遗憾的一件事情,没办法,那么咱们只能本身修改代码禁止模板使用php了。函数
一、禁止模板使用<?php ?>标签,经过如下配置项完成网站
'TMPL_DENY_PHP' => true, //禁用原生php
二、禁止模板使用<php></php>标签this
打开文件:ThinkPHP/Library/Think/Template/TagLib/Cx.class.phpspa
注释大概21行的代码,意思就是注释php的解析标签,这样这个标签就会被原样输出,不会被解析:code
三、禁止模板使用<if> 和 <elseif> 标签blog
因为if 标签和 elseif 标签里面可使用函数,因此他们两个一样很危险。须要禁止图片
打开文件:ThinkPHP/Library/Think/Template/TagLib/Cx.class.php博客
注释大概2四、25行代码:
四、禁止模板对变量使用函数,例如{:$addtime|date="Y-m-d",###}
像这样的函数用法,虽然方便,可是咱们一样要禁止,不然仍是存在安全隐患,由于能够把须要执行的函数写在|后面啊。
打开文件:ThinkPHP/Library/Think/Template.class.php
找到 parseVarFunction 函数,大概566行。按照我下面的图片同样注释
五、禁止语法 {:函数名或变量}
如{:phpinfo()}、等 在冒号后面能够写,任意变量,和任意函数,这个也很危险。一样须要屏蔽
①先自定义一个全局config 'TEMP_SAFE' => '1',
'TEMP_SAFE' => '1', //不解析{:} 与 {$Think}
②打开文件:ThinkPHP\Library\Think\Template.class.php
来到大概479行,把以下代码:
if('$' == $flag && '.' != $flag2 && '(' != $flag2){ //解析模板变量 格式 {$varName} return $this->parseVar($name); }elseif('-' == $flag || '+'== $flag){ // 输出计算 return '<?php echo '.$flag.$name.';?>'; }elseif(':' == $flag){ // 输出某个函数的结果 return '<?php echo '.$name.';?>'; }elseif('~' == $flag){ // 执行某个函数 return '<?php '.$name.';?>'; }elseif(substr($tagStr,0,2)=='//' || (substr($tagStr,0,2)=='/*' && substr(rtrim($tagStr),-2)=='*/')){ //注释标签 return ''; }
替换成:
$safe = C('TEMP_SAFE'); if('$' == $flag && '.' != $flag2 && '(' != $flag2){ //解析模板变量 格式 {$varName} return $this->parseVar($name); }elseif(substr($tagStr,0,2)=='//' || (substr($tagStr,0,2)=='/*' && substr(rtrim($tagStr),-2)=='*/')){ //注释标签 return ''; }elseif($safe !='1'){ if('-' == $flag || '+'== $flag){ // 输出计算 return '<?php echo '.$flag.$name.';?>'; }elseif(':' == $flag){ // 输出某个函数的结果 return '<?php echo '.$name.';?>'; }elseif('~' == $flag){ // 执行某个函数 return '<?php '.$name.';?>'; } }
六、应对$Think和|函数被解析
打开文件:ThinkPHP\Library\Think\Template.class.php
搜索代码:
if('Think.' == substr($var,0,6)){
改为
$safe = C('TEMP_SAFE'); if('Think.' == substr($var,0,6) and $safe!='1'){
搜索:
if(count($varArray)>0)
改为:
if(count($varArray)>0 and $safe!='1')
打开文件:ThinkPHP\Library\Think\Template\TagLib.class.php
搜索:
if('Think.' == substr($name,0,6))
改为:
if('Think.' == substr($name,0,6) and C('TEMP_SAFE')!='1')
完成