让模板禁止解析系统方法。如{: $think等(更新)

浏览:868 发布日期:2015/12/21 分类:技术分享
当开放模板权限给第三方用户的时候,防止用户通过模板输入恶意php代码。

1.通过设置 'TMPL_DENY_PHP'=>true,可以禁用原生php。

2.通过设置 'TAGLIB_BUILD_IN' => '自定义taglib' , 通过自定义的标签库可以不解析<php>标签。

3.可是一些如{:phpinfo()} 还是会被执行。所以我试着解决一下这个问题,需要修改核心程序代码:

① 先自定义一个全局config 'TEMP_SAFE' => '1',
②打开文件ThinkPHP3.2.3\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和|函数被解析:
搜索代码: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')tagLib.php文件,也要修改一个地方:
搜索:if('Think.' == substr($name,0,6))改成: if('Think.' == substr($name,0,6) and C('TEMP_SAFE')!='1')
最佳答案
评论( 相关
后面还有条评论,点击查看>>