2011-03-20 51 views
1

我們有一個CMS編輯器,允許在其中使用php,但是我們需要限制訪問某些命令,如file_get_contents,file()和global。執行有限制的PHP代碼

有人可以幫我一個布爾響應正則表達式嗎?模板中的文本存儲在一個字符串中。

我知道,可能不適合這種理想的方法,但它是所有我能想出現在:)

+4

你肯定會遇到問題。那麼'$ a ='文件'; $ A();'? – knittl 2011-03-20 08:50:46

+0

相關:http://stackoverflow.com/questions/3115559/exploitable-php-functions/ – Unicron 2011-03-20 09:00:53

回答

5

你想要做什麼幾乎是不可能的。如果你允許人們在你的機器上執行代碼,那麼保護自己免受攻擊是非常困難的。

這裏是我對它的嘗試:SandboxSource code

它的功能基本上是維護一個列表,用於文件系統訪問,shell訪問,aso(我允許一些函數用於讀取像show_source這樣的文件系統,如果你想用它來實現某些功能,就不應該允許它。 )

它也試圖通過將其更改爲$func = 'unlink'; ${'___xyz'.!$___xyz=Sandbox::checkVarFunction($func)}(__FILE__) aso來防止更多隱藏的攻擊,如$func = 'unlink'; $func(__FILE__); aso

PS:你可能不想讓人們在你的網站上運行PHP代碼。風險太大了。相反,我會讓人們在編輯器中使用模板語言。一個好的候選人將是Twig,因爲它有一個內置的沙箱,它允許您限制使用某些標籤,功能,...

+0

我實際上只是要求提供源代碼:)謝謝! – Joe 2011-03-20 09:12:57

+0

@Joe你可以通過執行'hightlight_file('./ src/Sandbox.php');'; – alexn 2011-03-20 10:49:08

-2

您可以使用preg_match這一點。使用方法:

if(preg_match("#(file_get_contents|file)\(#i",$text)) 
+0

怎麼樣'$ evil =「fi」。「le」。「_ get_contents」; $邪惡($網址);'? – Unicron 2011-03-20 08:58:50

+0

沒錯,甚至沒有想到那麼遠。有點奇怪,公開允許php代碼。 – Jens 2011-03-20 09:09:21

2

這將是非常困難的,以保護自己完美。

在我看來,你有幾種選擇:

  1. 搜索預定義的字符串這是不是在你的內容(如的file_get_contents)允許並顯示一條錯誤消息說,用戶不能保存,因爲這個。然而,這會導致「黑客」,你最終會搜索所有可能的字符,如(),在某些情況下可能有效。使用token_get_all並嘗試將內容解析爲PHP。然後,您可以遍歷整個源代碼,通過令牌循環查看,並查看是否找到您不接受的令牌。

  2. 寫下你自己的語言或DSL。這種語言應該只能做到你想要的。根據您的要求,這可能是最簡單和最可維護的方法。