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')
最佳答案
