Thinkphp模板開放給第三方編輯權限時,如何禁止模板使用php代碼

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

完成

相關文章
相關標籤/搜索