2014-10-20 105 views
0

標題總結得非常好。什麼是防止執行與文件交互的函數的可靠方法?我們正在談論 邪惡 eval()PHP eval() - 可靠地過濾文件功能

我可以完全訪問即將被評估的字符串。我在考慮簡單地刪除後端操作符,並將文件函數名稱(以及exec)替換爲完全沒有任何效果的文件函數名稱,但我不確定此方法的可靠性。

實施例:

PHP代碼

eval("file_get_contents('passwords.ini')"); 

目前,這是通過取代,執行之前:

PHP代碼

eval("fn_zero('passwords.ini')"); 

EDIT

關於 的eval()。我在這裏做的是在基於模塊的內容管理系統中執行管理員創建的數據庫存儲的PHP代碼。編輯代碼需要與主管理員登錄分離的額外級別的身份驗證,它不是完全不可信的用戶輸入。

管理員可以宰殺他/她的網站,如果這是他/她的意圖,那不是我的問題。我關心的是防止查看CMS的底層PHP代碼。

附錄:每個網站都有自己的根目錄和數據庫。他們不能以這種方式傷害對方。

+1

請記住以下引用:如果eval()是答案,那麼您肯定會問錯誤的問題。 ' - Rasmus Lerdorf,BDFL的PHP​​' – bodi0 2014-10-20 13:47:11

+3

你能告訴我們你想實現的功能嗎?因爲eval()可能是一個壞主意。 sidenote:Personaly我從來不需要eval來解決任何問題。 – 2014-10-20 13:48:26

+0

我的任務是爲基於模塊的CMS構建「可編程模塊」。管理員可以 - 像畫廊,格式化文本等預定義的 - 創建自定義模塊,並顯示在自己的容器中。我不在乎他們是否屠宰他們的網站,因爲他們(應該)知道後果。我主要做的是阻止訪問底層的CMS php代碼。 – 2014-10-20 13:50:01

回答

1

要回答這個問題的問,「消毒」的EVAL輸入是不可能的。簡單的例子:

eval("\$f=strrev('stnetnoc_teg_elif');\$f('passwords.ini');"); 

可行選項,以執行用戶提供的代碼是sandboxing或用戶級VM等https://github.com/ircmaxell/PHPPHP