首先我要吐槽一個問題:爲何在博客園發佈的文章老是被其餘網站採集過去,而他們採集過去後,排名比博客園還好,好比這篇文章,我把標題複製到百度搜索,結果第一頁的搜索結果所有都是採集個人,而我在博客園發佈的這篇文章居然直接沒有收錄,大哥們啊,搞清楚好嗎,我這是原創文章。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')
完成