2012-09-07 111 views
7

我創建了一個簡單的頁面(使用a script以及Stack的一些幫助和朋友的一些幫助;我對PHP知之甚少)一個簡單的頁面供當地非盈利出版物供人們上傳照片。如何保護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。這是一個帶有非直觀URL的私人測試頁面,只有我和其他三個人都知道;其他人都沒有發送這個測試。

這顯然讓我擔心有些事情會發生,我擔心我對安全性不夠了解,以確保此頁面安全。

有什麼明顯的我失蹤了嗎?

+0

用戶給出的文件名(在'$ _FILES ['upload'] ['name']')是不可信的,可以很容易地改變。不要檢查這些擴展名。如果檢查'getimagesize()'是否返回有效結果,請檢查mime類型。如果可能,生成你自己的文件名 – MarcDefiant

回答

8

在處理上傳時,應該記住,您可以在$ _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-上傳文件夾 另外的什麼你已經這樣做:

確保您上傳的文件夾不可用從網絡。驗證上傳的文件,然後將其移至其他文件夾(如果需要)並重命名該文件。 它將防止黑客執行惡意文件(如果無法通過url訪問,則無法執行)。

延伸閱讀:https://www.owasp.org/index.php/Unrestricted_File_Upload

+2

有一次,當有人用'<?php phpinfo();>插入到二進制數據中時,我上傳到了我的web服務器PNG文件中。此代碼不可執行,但仍可通過include()函數訪問。不幸的是,'getimagesize()'返回了非假值。我管理這種情況,通過'$ img = imagecreatefrompng('vulnerable.png')重新保存所有上傳的圖像; imagepng($ img,'safe.png');' – CodingHamster

+0

我對這一切都很陌生,不怕做我自己的家庭作業,但有幾個問題:首先,我會添加fileinfo和getImageSize命令,以及腳本的「案例文件」部分中的文件重命名位? – JeanSibelius

+0

所有檢查必須儘快在'$ _FILES ['my_files'] ['tmp_name']'變量上完成;如果一切順利,你可以移動文件,重新命名,並做任何你需要做的事情。 – grunk

0

您可以檢查文件的MIME類型,但不要擔心,只要您的PHP處理程序只能執行.php文件,並且您正在考慮不在您的腳本中保存上傳的.php文件,不要泄露任何安全漏洞。

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

一個更好的主意是保留一個白色的擴展名,你可以保存在你的文件系統上。

+1

這與場地上傳並不直接相關,但您可以上傳帶有一些蘋果形式的PHP代碼的圖像作爲評論。如果網站上存在LFI漏洞,您可能會包含圖像並執行惡意代碼。 – MarcDefiant

0

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

如果你沿着那條街道存放這些文件在一個目錄中。

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

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

這會讓你安全。

4

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

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

請勿使用原始文件名和擴展名保存上傳的文件!將這些數據存儲在數據庫中供稍後檢索。

相關問題