2013-03-19 104 views
1

所以我有一個客戶想要一個攝影網站,用戶可以在這裏回覆攝影比賽上傳他們的照片。雖然技術上這不是問題,但我想知道允許任何用戶能夠將任何圖像上載到我的服務器上的相關風險。我有感覺風險高...PHP圖片上傳表單的風險?

我想用這樣的http://www.w3schools.com/php/php_file_upload.asp

的如果我這樣做讓匿名用戶上傳文件,我怎麼能保證目錄圖像(和潛在破壞性文件)將被上傳到?

+3

請不要使用[w3fools](http://w3fools.com)中的任何內容。他們的代碼是廢話,非常不安全。它們不是任何方式/形狀/形式的有用資源。他們基本上只是一個垃圾網站,有很好的搜索引擎優化。 – 2013-03-19 11:55:14

+0

@MarcB注意。然而,我寫的東西在複雜性方面與該腳本相似。這不會是一個副本工作。 – Starkers 2013-03-19 11:58:15

+0

http://stackoverflow.com/questions/15433563/something-wrong-with-the-quotations/15434585#15434585 – DaveRandom 2013-03-19 12:09:35

回答

0

上傳的文件存儲在臨時位置,該位置可以在$_FILES變量中找到。

當您的腳本接受上傳的文件時,您可以使用move_uploaded_file()將其移動到您選擇的位置。

因此,即使用戶是匿名的,您仍然可以控制如何處理上傳以及是否接受它們(例如,基於內容,大小等)。

此外,(匿名)用戶提供文件和伴隨的詳細信息。所以,如果你盲目地使用這些細節,你很容易受到攻擊(一個用戶的意圖不好可能會提供錯誤的細節,使其變得合法)。所以,如果你需要這些細節,自己收集它們(而不是使用$_FILES)!

欲瞭解更多信息,請參閱PHP documentation

0

你將不得不研究一下,但主要是這些是主要的提示:

  • 你可以有基本的安全是實際查看圖像的MIME類型和擴展名。雖然這當然很容易僞造。

  • 使用二進制安全功能,如readfile()fopen()file_get_contents(),我不記得確切哪些,但曾經有處理文件,研究哪些是,避免他們的安全問題,一些PHP函數。

  • 這裏有一些使用preg_match()和類似的函數來檢查您正在閱讀的文件中是否有類似的腳本。使用它們來確保沒有隱藏的腳本。這將放緩過程中的位爲preg_match()可能是資源昂貴的讀取大文件,但它不應該是很明顯的

  • 你也可能會引發反病毒對上傳的電子郵件服務做文件上運行。

據我瞭解潛在的破壞性圖像通常包含的腳本語言,如PHP代碼或JavaScript來嘗試跨站腳本攻擊,也有很多危險的擺在那裏,所以我想你不能保證100 %de安全的文件,但要定期看看所有新的危險和方法來避免它們。

1

如果你想確保圖像是,如果正確地創建了GD資源可以加載使用GD http://www.php.net/gd

真實的圖像,然後將圖像是實像

使用首先檢測MIME :

getimagesize($filename); 

然後,例如,如果它是一個JPEG負載到GD:

$gdresource = imagecreatefromjpeg($filename); 

如果$gdresource是有效的/無警告生成,圖像是有效的,沒有損壞...... getimagesize()是(可能)還不夠好,檢測損壞的圖像

此外,另一個重要的注意事項......不靠$_FILES['blabla']['name'],因爲它可能包含非有效的utf-8序列(假設您使用的是utf-8),並且它可能是潛在的攻擊機制,因爲任何用戶輸入

因此您需要驗證/清理以及

$originalFileName = $_FILES['blabla']['name']; 
$safeOriginalFileName = iconv('UTF-8', 'UTF-8//IGNORE', $originalFileName); 
// more additional checks here. for example filename is empty "" 
move_uploaded_file(...., $safeOriginalFileName); 

也請記住,$_FILES['blabla']['name']包含文件擴展名,可能不正確。所以你需要剝離出來,並用實際正確的擴展名(您以前使用解決getimagesize() + imagecreatefrom*()

$safeOriginalFileName = basename($safeOriginalFileName); // removes the extension 
$safeOriginalFileName = $safeOriginalFileName . ".jpg"; // correct extension 

希望這有助於:)


也爲DaveRandom指出,不要」 t也依賴於$_FILES['blabla']['type'],請改用我建議的getimagesize() + imagecreatefrom*()