2012-08-27 75 views
1

我有一個Amazon ec2實例(linux)。安全服務其他人的PHP

我希望你(是的,你)能夠上傳一個PHP文件,然後在www.mydomain.com/yourname上直播。我也希望能夠爲許多其他人(www.mydomain.com/theirname)做到這一點。

我很擔心你(或者他們,我們不要點手指)可以做惡意的事情(有意或無意)。例如,一個無限循環,在根目錄之外讀取/寫入,關閉服務器,運行系統命令等等。如果我想成爲惡意軟件,我會嘗試這些。

有沒有什麼辦法可以設置PHP/apache /用戶權限,或者在提供服務之前通過代碼進行搜索,這樣一來,惡意至少會變得非常困難?

+0

我會說沒有絕對安全的東西,所以一個好的經驗法則是在不同的服務器上運行用戶提供的代碼,而不是運行主應用程序的代碼。另外,建立一個負載均衡服務器是一個不錯的主意。 – petwho

回答

8

別的不說,你一定要調整你的php.ini包括此:

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source 

這將阻止利用這個.INI

任何PHP文件中的這些功能的執行

我也將使open_basedir支持自己的目錄內的用戶鎖定到使他們不能使用這樣的:

require_once '../../another_user/index.php';

$notMyFile = file_get_contents('../../another_user/config.php');

5

有這樣做的沒有防彈方式。

首先,沒有系統調用。

其次,每個腳本超時。

而且,您可能還希望將外部「退出按鈕」放在手中,以便在出現問題時可以拔下插頭。

PHP是一個非常大的語言,並有其他人在您的服務器上運行代碼是很難安全地做的很難

+3

這就是爲什麼你應該爲每個用戶/腳本分配一個單獨的虛擬機,並在完成後摧毀虛擬機。 –

+2

我仍然可以從虛擬機中敲出地獄,並推動你的使用量,這樣EC2賬單將會殺死你。 –

1

看一看Runkit沙盒

實例化Runkit_Sandbox類創建了它自己的範圍和程序堆棧一個新的線程。使用傳遞給構造函數的一組選項,此環境可能被限制爲主要解釋器可以執行的一個子集,併爲執行用戶提供的代碼提供更安全的環境。

http://php.net/manual/en/runkit.sandbox.php

請記住,您提供給沙盒環境中的任何資源,最終會被濫用。例如,如果用戶不應該能夠影響對方的結果,並且您確實爲用戶提供了數據庫,請爲他們的沙箱中的每個不同的數據庫提供不同的憑據。