簡體   English   中英

如何保護PHP圖像上載腳本免受攻擊?

[英]How can I protect a PHP image upload script from exploits?

我創建了(使用Stack 提供的腳本和一些幫助以及朋友的一些幫助;我對PHP知之甚少)一個簡單的頁面,用於本地非營利性出版物,人們可以上傳照片。

我對安全性不是很好(基於無知,而不是故意疏忽)但我采取了以下步驟來保護這個頁面:

•PHP腳本設置為僅接受.jpg,.png和.tif文件進行上傳;
•保存表單內容的子文件夾具有設置為700的權限,並且保存上傳照片的子文件夾具有設置為700的權限;
•根據文檔,我的主機具有以下配置,以確保只有.php文件以.php運行:

<FilesMatch \.php$>
    SetHandler php52-fcgi
</FilesMatch>

•我在相關(主要和保存的內容)文件夾中放置了.htaccess文件:

RemoveHandler .php
RemoveHandler .inc
RemoveHandler .pl
RemoveHandler .cgi
RemoveHandler .py
RemoveHandler .fcgi

然而,一夜之間,有人找到了這個測試頁面,並提交了一個看起來非常良性的測試信息和小.jpg。 這是一個私人測試頁面,其中包含一個非直觀的網址,只有我和其他三個人都知道; 其他人都沒有發過這個測試。

這顯然讓我擔心會發生一些奇怪的事情,我擔心我對安全性的了解不足以確保這個頁面是安全的。

有什么明顯的東西讓我失蹤嗎?

在處理上傳時,您應該記住,您可以在$ _FILES數組中找到的所有數據都是偽造的。 它正在通過HTTP進行傳輸,因此將image / jpg mime提供給可執行文件非常容易。

1-檢查真正的啞劇

PHP附帶了一些功能來檢查文件的真實mime。 為此你應該使用fileinfo

$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic");
$filename = "/var/tmp/afile.jpg";
echo $finfo->file($filename);

2-檢查圖像的屬性

您顯然只想上傳圖片,因此收到的文件必須有寬度和高度:

使用getImageSize()獲取有關圖像的所有必需信息。 如果返回false,則該文件可能不是圖像,您可以將其刪除。 getImageSize也可以給你一個mime類型,但我不知道它是否可以信任。

2.5-重新處理圖像

正如user628405所建議的那樣,用GD重新處理圖像可能是更安全的事情。

$img = imagecreatefrompng('vulnerable.png'); 
imagepng($img, 'safe.png');

顯然它必須根據圖像類型進行調整。 在php文檔中查看所有imagecreatefrom *。

3-上傳文件夾除了你已經做過的事情:

確保您的上傳文件夾不在網上。 驗證上載的文件,然后根據需要將其移動到其他文件夾並重命名該文件。 它將阻止黑客執行惡意文件(如果網址無法訪問,則無法執行)。

進一步閱讀: https//www.owasp.org/index.php/Unrestricted_File_Upload

不要依賴客戶端的任何數據,包括內容類型!

不要將上載的文件保存在Web根目錄中。 只能通過腳本訪問上傳的文件,以便更好地控制。

不要使用原始文件名和擴展名保存上傳的文件! 將此數據存儲在數據庫中以便以后檢索。

你可以檢查文件的MIME類型,但是不要擔心,只要你的php處理程序只能執行.php文件而你正在處理不保存腳本中上傳的.php文件,你不會暴露任何文件安全漏洞。

這對於.php文件以及服務器上安裝的任何其他服務器端腳本語言當然有效。

更好的想法是保留您要接受的擴展名以保存在文件系統上。

我會忽略MIME類型和傳入文件的文件擴展名。 這些可以偽造。

如果您要沿着那條大道走下去,請將這些文件存儲在目錄中。

確保該目錄僅用於圖像(音樂),然后通過查看文件格式獲取腳本以在其上放置正確的擴展名。

還要確保該目錄不能執行PHP(或其他任何東西)。

這將保證您的安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM