我們有一個CMS編輯器,允許在其中使用php,但是我們需要限制訪問某些命令,如file_get_contents,file()和global。執行有限制的PHP代碼
有人可以幫我一個布爾響應正則表達式嗎?模板中的文本存儲在一個字符串中。
我知道,可能不適合這種理想的方法,但它是所有我能想出現在:)
我們有一個CMS編輯器,允許在其中使用php,但是我們需要限制訪問某些命令,如file_get_contents,file()和global。執行有限制的PHP代碼
有人可以幫我一個布爾響應正則表達式嗎?模板中的文本存儲在一個字符串中。
我知道,可能不適合這種理想的方法,但它是所有我能想出現在:)
你想要做什麼幾乎是不可能的。如果你允許人們在你的機器上執行代碼,那麼保護自己免受攻擊是非常困難的。
這裏是我對它的嘗試:Sandbox。 Source code。
它的功能基本上是維護一個列表,用於文件系統訪問,shell訪問,aso(我允許一些函數用於讀取像show_source
這樣的文件系統,如果你想用它來實現某些功能,就不應該允許它。 )
它也試圖通過將其更改爲$func = 'unlink'; ${'___xyz'.!$___xyz=Sandbox::checkVarFunction($func)}(__FILE__)
aso來防止更多隱藏的攻擊,如$func = 'unlink'; $func(__FILE__);
aso
PS:你可能不想讓人們在你的網站上運行PHP代碼。風險太大了。相反,我會讓人們在編輯器中使用模板語言。一個好的候選人將是Twig,因爲它有一個內置的沙箱,它允許您限制使用某些標籤,功能,...
您可以使用preg_match這一點。使用方法:
if(preg_match("#(file_get_contents|file)\(#i",$text))
這將是非常困難的,以保護自己完美。
在我看來,你有幾種選擇:
搜索預定義的字符串這是不是在你的內容(如的file_get_contents)允許並顯示一條錯誤消息說,用戶不能保存,因爲這個。然而,這會導致「黑客」,你最終會搜索所有可能的字符,如()
,在某些情況下可能有效。使用token_get_all並嘗試將內容解析爲PHP。然後,您可以遍歷整個源代碼,通過令牌循環查看,並查看是否找到您不接受的令牌。
寫下你自己的語言或DSL。這種語言應該只能做到你想要的。根據您的要求,這可能是最簡單和最可維護的方法。
你肯定會遇到問題。那麼'$ a ='文件'; $ A();'? – knittl 2011-03-20 08:50:46
相關:http://stackoverflow.com/questions/3115559/exploitable-php-functions/ – Unicron 2011-03-20 09:00:53