2009-05-05 69 views
2

我正在使用create_function在服務器端運行一些用戶代碼。我正在尋找這兩個中的任何一個:傳遞給create_function的PHP沙箱/清理代碼

  1. 有沒有一種方法來清理傳遞給它的代碼,以防止有害執行?
  2. 或者,有沒有一種方法可以指定這個代碼在沙箱環境中運行,以便用戶不能隨便玩弄其他任何東西。

謝謝!

+3

什麼php.net/manual/en/runkit.sandbox.php? – stefs 2009-05-05 16:55:15

+0

我認爲這完全是無稽之談。如果由於socket_ *功能被禁用,人們將使用郵件擴展發送垃圾郵件,如果他們發現他們不能使用服務器來中繼攻擊。哦,他們不是?酷,現在我可以發送垃圾郵件*和*從這一個攻擊其他服務器.... – soulmerge 2009-05-05 20:26:40

+4

我非常惱火與所有的「答案」只是說這是一個壞主意。您是否找到了沙盒用戶提供的代碼的方式? – Kimble 2010-04-08 09:30:49

回答

2

您無法可靠地清理用戶輸入 - 一個確定的黑客會發現一些晦澀的方法來規避您的清理代碼。

沙盒可能是可能的,但同樣是殘酷的。如果你真的想要安全,你應該爲每個呼叫創建一個沙箱。畢竟,有人可能會執行對沙箱中所有其他用戶有害的僞代碼。

我不認爲你真的想這樣做。這樣想:你正在提供對服務器的編程訪問!

3

您可以使用tonkenizer找出代碼將執行的操作,然後將某些功能和操作列入白名單。我認爲這將結束是非常困難的(或不可能),使之萬無一失,特別是考慮到PHP的靈活性:

$f = "shell_exec"; 
$arg = 'rm -rf /'; 

$f($arg); // ouch 
call_user_func($f, $arg); // ouch 
eval("$f('$arg');"); // ouch 

$newF = create_user_function('', "$f('$arg');"); 
$newF(); // ouch 

唯一一種沙箱的,會給你100%的安全性(當然,99.9%... )是一個虛擬機,你可以隨後扔掉。

1

您可以考慮創建一個用戶可以使用的自定義(ized)語言。然後,您可以創建支持的函數庫,這很可能只是PHP本地函數的包裝器。但即使如此,使其防黑客或僅僅是工作,充其量也是一件乏味的工作。也許你應該重新評估爲什麼你希望用戶能夠首先訪問代碼?如果你需要某個人討論這個問題(或者更新你的問題,我猜?),我很樂意幫忙。:)

希望你能解決它!

-Dave

+0

我真的在尋找一種方法來創建簡單但具有表達力的條件表達式,用戶可以輕鬆編寫。然而,我們缺乏時間,而製作語法等並不是真正的選擇。 – kpowerinfinity 2009-05-05 16:57:41

+0

您可以考慮編寫一個用戶可以/想要使用的小型動作庫,並強制沙箱只允許這些自定義函數。任何其他(直接php)函數請求都會導致失敗,但是your_trim()和your_str_replace()(例如)可以正常工作。這意味着你必須創建這些自定義函數/包裝器,但它不應該花太長時間,我希望..? – Dave 2009-05-05 22:20:28

+0

如果創建中綴語法過於困難,請創建前綴語法,這應該更容易。我在幾十行Icon中爲我的模板引擎寫了一個。 – staticsan 2009-05-14 06:55:51

2

你可以嘗試使用櫟,一個基於Java的PHP解釋器,營造一個安全沙盒的PHP環境。您可以使用Rhino對JavaScript進行相同的操作,所以我認爲這可能與Quercus有關。

0

整體上壞主意和太危險的國際海事組織,不管你採取什麼保護措施。更好地創建一個僅限於用戶被允許執行的僞語言。

+1

那麼,這不是要求的嗎?有些用例可能會有用。例如,這可以在教育機構中使用。 – Kimble 2010-04-08 09:32:06

3

我們使用標記器靜態分析代碼,以及修改代碼以對某些事情執行運行時檢查。這是通過標記器和基於標記器的腳本完成的。由於tokenizer與PHP實際使用的是相同的,因此它可以提高你的運氣,而不是寫你自己的。

我見過使用正則表達式的人試圖分析一種語言。這是一個非常糟糕的主意。

但...

由於PHP是一個非常容易理解的語法,並且您可以訪問標記器,所以您可以通過禁用可變函數來實際阻止大部分不良情況,並且只允許調用少量列入白名單的函數。如果你不需要面向對象,甚至更好。然而,我們並沒有足夠的信心去解決100%的問題,我們使用這種方法爲支付客戶的用戶提供支持的沙盒,而不是用地球上的每個用戶使用鍵盤,也許是惡意。

我也認爲這裏的人把100%的想法作爲「糟糕的做法」公開化需要得到一個線索。有理由這樣做。