2008-09-25 67 views
5

我想知道什麼安全問題也有以實現PHP evaluator這樣的:評估用戶代碼的安全性問題是什麼?

<?php eval($_POST['codeInput']); %> 

這是在作出PHP sandbox所以消毒對DB input等的情況下是不是一個巨大的問題。

用戶摧毀服務器上的文件託管在是。

我見過Ruby simulators所以我很好奇什麼是安全智慧(至少含糊的細節)。


謝謝大家。我甚至不確定接受哪個答案,因爲它們都很有用。

Owen's answer總結了我所懷疑的(服務器本身會有風險)。

arin's answer給出了潛在問題的一個很好的例子。

Geoff's answerrandy's answer反映了您需要編寫自己的評估程序以實現模擬類型功能的一般觀點。

回答

5

可能成爲真正的大麻煩,如果你eval()倒是有點像

<?php 
    eval("shell_exec(\"rm -rf {$_SERVER['DOCUMENT_ROOT']}\");"); 
?> 

這是一個極端的例子,但這種情況下,您的網站將只是被刪除。希望你的權限不會允許它,但是,它有助於說明需要進行消毒&檢查。

18

不這樣做。

他們基本上可以訪問任何你可以在PHP做(看看周圍的文件系統,獲取/設置任何類型的變量,打開連接到其他機器中插入代碼運行,等...)

+0

是的,我想知道他們會有什麼樣的文件訪問。這是問題所在。謝謝。 – 2008-09-25 23:46:32

4

有很多東西你可以說..關注是不特定於PHP。

這裏的答案很簡單:

任何輸入到你的機器(或數據庫)需要進行消毒。

你發佈的代碼片段幾乎可以讓用戶運行他們想要的任何代碼,所以這是特別危險的。

有上代碼注入這裏一個不錯的介紹性文章:

Wikipedia on Code Injection

+0

這不是代碼注入我非常擔心 - 我希望人們能夠完成他們自己的代碼。我更擔心他們是否可以訪問我的服務器或其他東西。 – 2008-09-25 23:47:07

+0

啊。那麼,你原來的問題的片段不是要走的路。如果您的用戶要編寫代碼,您可以編寫一個交互式頂層,限制您實現的功能,爲每個用戶提供一個您管理的UNIX帳戶,或者最簡單:讓他們在自己的機器上運行代碼。 – keparo 2008-09-27 03:53:15

4

如果你允許任意代碼在你的服務器上運行,它不再是你的服務器。

+0

足夠公平,對任何隱約參與測試平臺模擬器的想法都是足夠的。我見過在線Ruby評估者,只是好奇而已。 – 2008-09-25 23:47:47

-1

正如已經回答的那樣,您需要清理輸入。我想你可以使用某種正則表達式來刪除不需要的命令,比如「exec」,並且基本上PHP提供的每個惡意命令(或者可能被利用的)都是如此,這很多。

+2

請勿使用黑名單進行消毒!始終使用白名單。 – Lewis 2008-09-25 08:27:12

+0

我不認爲劉易斯的評論過分強調 - 如果你試圖「淨化你的投入」 - 使用黑名單,例如正則表達式 - 在這種情況下,它幾乎沒有用處 - 我會輕鬆解決你試圖實現的任何正則表達式,無論如何平凡地運行我的代碼。 – AviD 2009-08-19 08:35:51

3

親愛的上帝NO。即使在標題上我也會畏縮。允許用戶運行任何類型的任意代碼就像是交給他們

我知道我上面的人就已經表示,遞給服務器。但相信我。這永遠不會有人能告訴你清理你的輸入。

如果你真的,真的想讓用戶運行某種代碼。通過創建用戶可以使用的某種psudo語言來爲用戶提供可用命令的子集。 a-la bbcode或markdown的工作方式。

2

待辦事項允許您的服務器,週期上執行未經過濾的代碼。

如果你想創建一個工具,允許交互式演示一種語言,例如這裏看到的工具:http://tryruby.hobix.com/我會努力編寫自己的語言的子部分。理想情況下,您將使用它向新程序員演示簡單的概念,因此,如果您正確實施所有功能,則無關緊要。

通過這樣做,您可以通過白名單控制已知可接受輸入的輸入。如果輸入不在白名單中,則不執行。

祝你好運!

3

如果您要構建online PHP interpreter,則需要構建實際的REPL解釋器,而不是使用eval。

否則,永遠不會執行任意用戶代碼。永遠。

6

eval()功能是很難消毒,即使你那裏做肯定會變通的辦法。即使你過濾了exec,你所需要做的就是以某種方式將字符串exec粘貼到變量中,然後執行$variable()。你需要真正削弱語言才能達到某種想象的安全。