2011-05-13 119 views
3

我在000webhost上有一個PHP/MySQL網站(http://www.boisvert.me.uk;但現在正在審查中),我擔心它的安全性。我想要做的事會讓任何網站變得脆弱;這是PHP爲兒童提供尖銳的剪刀的等同物。我對減少網站漏洞有各種各樣的想法,但更多的建議是值得歡迎的。PHP/MySQL安全問題

特別是,有兩個腳本:

  • 上載腳本。其目的是允許註冊站點用戶上傳某些XML文件(教程)。很顯然,要做到這一點,網站上的一個文件夾可以爲訪問者提供寫入權限。我不喜歡那樣,但我沒有看到解決辦法,我可以在腳本中添加檢查(類型,大小),以確保上傳的文件僅限於XML和一些圖像。有沒有其他要點可以改進?

  • 腳本2是PHP的解釋器 - 用戶可以在表單中輸入PHP並執行(不保存)。我希望用戶可以嘗試訪問數據庫,因此粗略的字符串替換可以確保我不需要泄露MySQL訪問信息。但是攻擊者可以使用這個解釋器來訪問文件區域並上傳不受歡迎的材料。我的解決方案是將解釋器放在一個單獨的域中,其中沒有文件可以上傳。

任何意見,以改善這一點是值得歡迎的,酒吧「不要這樣做」。我知道這很危險。所以過馬路。謝謝你的幫助。

+5

沒有冒犯,但第二點聽起來更像是「越過高速公路」:)如果它是可公開訪問的,那麼您將服務器置於非常危險的狀態。單獨的*域*不會保護您,因爲PHP的用戶可能有權訪問服務器上的其他網站。見例如[可利用的PHP函數](http://stackoverflow.com/q/3115559) – 2011-05-13 08:20:49

+0

這是一種什麼樣的目標受衆?這是一個有幾十名學生的小型大學課程,還是完全公共服務? – 2011-05-13 08:39:08

+0

我本來喜歡它是公開的,基於下面的答案它不會。 – boisvert 2011-05-13 09:01:02

回答

3

第一點是由以前的答案(也可能多次在這個網站的其他地方)

對於第二點所覆蓋,我會如果你覺得你就必須有這樣的提出一些建議。你可以編譯自己的PHP二進制文件,排除你不希望用戶需要的所有選項(可能省略除MySQL以外的所有內容)。然後,您應該創建一個php.ini文件,該文件禁用任何潛在危險的函數(使用disable_functions配置選項 - 查看其他答案)。將內存使用量和CPU時間限制爲合理的數字(對於希望允許用戶運行的簡單腳本)。現在我們應該可以使用類似system("chroot /path/to/secure/dir ./php tempfile.php");這樣的chrooted環境運行所有這些。/path/to/secure/dir應該是您將用戶PHP腳本寫入臨時文件的目錄。它應該包含PHP可執行文件和安全的php.ini文件。這些文件和安全目錄應該由運行該腳本的用戶(尤其是PHP可執行文件和php.ini文件)以外的用戶擁有,並且不能由任何人寫入。安全目錄應位於Web根目錄之外。

現在,我不會假裝,我已經想到了一切,但我希望這些想法可能是您的安全環境的基礎。

1

那麼,腳本2絕對不是我眼中的一種。除非你完全確定你可以避免任何你不想在你的服務器上運行的腳本(並且相信我,那根本就沒有完成)。我會擺脫這個想法。在這種情況下,您更有可能會編寫腳本並存儲代碼,直到它已經由您審閱,然後用戶可以執行它。

我不知道你想給他們的數據庫訪問什麼,但也許你可以通過建立某種形式的話說控制多一點:

(1) give me data from [table] 
(2) based on these critera 
(3) from startdate to enddate 

不知道這適合的你需要..但如果它只是你想給他們的數據庫訪問,那麼使用搜索功能來做這件事更加可控,然後讓他們執行一些PHP代碼。

如果您的安全性不夠好,您的第一個問題只是一個風險。打開上傳文件夾不是最大的風險,沒有人可以將文件放在那裏。這種風險是一種糟糕的安全措施,它允許上傳文件(例如PHP文件),以後可以運行。因此,除了檢查文件類型,文件擴展名,文件大小,文件頭等,您可能還希望將這些文件放在網站根文件夾之外。如果它們只是圖像和XML文件,則可以通過它獲取文件內容(file_get_contents)的方式編寫PHP腳本,並根據它讀取的內容創建一個xml/image文件。

+0

難點在於,數據庫訪問的目的是教授PHP/MySQL,因此搜索功能的限制不會削減它。 – boisvert 2011-05-13 08:34:02

1

在第一種情況下,如果您檢查以確保上傳的文件是XML或圖像,並且不允許任何其他類型,那麼就可以。我沒有看到任何問題。

你想要做的第二件事就是關注我。即使您將PHP解釋器放在單獨的域中,仍然很危險,因爲任何人都可以使用它來發送垃圾郵件或解釋他們自己的腳本以刪除您的文件或其他內容。我看到的唯一解決方案是不允許使用PHP命令和表達式列表,儘管您必須確保列表已滿。對不起沒有其他想法...

1

在PHP

回覆你的第二個問題,您可以創建由

  • 中途安全的解決方案禁用所有功能,可以執行外部命令
  • 禁止的fopen網址包裝,以防止http://請求
  • 禁用mail命令,curl和所有其它可能有問題的命令的nd包裝 - 一個有用的列表在這裏:Exploitable PHP functions
  • 安裝suhosin補丁
  • 爲每個用戶創建數據庫;發佈僅限於該數據庫的mySQL證書。 (你不能保護個人數據庫。)

這些都不能在共享主機上完成,但是,這東西需要根訪問服務器。在共享主機上,我會說你想做的事情是不可能的。

使用VM

另一個想法:我不知道是什麼背景/預算/目標項目的觀衆 - 如果你可以只用一個網絡託管公司,這是不可能的 - 但如果它是一所大學的項目(=學生人數有限,時間跨度較長),你有沒有考慮在創建每個用戶的虛擬機的形式,真正的沙盒解決方案?

每個用戶都可以有自己的虛擬機預裝PHP和MySQL就可以了,做他們喜歡就可以了。你可以阻止它訪問外部世界,並在學生完成之後處理每個虛擬機。

從一個預先定義的圖像創建每個虛擬機應該是可能的,但很明顯這將需要龐大的硬件資源和系統管理員的工作,所以它可能不適合您的方案解決。

+0

非常有幫助,是的,我接受你的建議是「中途安全」,但總是會如此。我不必使用共享主機。 – boisvert 2011-05-13 08:49:42

+1

接受qbert的,因爲你有很多聲望:)但你的答案給了我很多幫助。 – boisvert 2011-05-13 10:00:39

0

的替代已成爲自兩年前更加成熟:使用的引擎收錄/遠程執行工具之一。

目前我用phpfiddle。其遠程執行API支持MySQL連接和更值得教學的更有用的技術。這是一個test - 我的主機很慢,但PHPFiddle部分就好了。所以我在網上提供了一些我必須嚴格控制的PHP教程。

當然,早期答案中的安全性評論仍然適用。 PHP Fiddle實現了類似於它自己的PHP編譯的東西,只包含了所需的模塊。