2011-06-10 59 views
0

如何防止php上傳文件到./tmp/文件夾,如果他們不是正確的類型。如何防止php上傳文件:

例如使用下面的代碼w3school網站上給出的示例代碼檢查文件長度:

if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/pjpeg")) 

不過這是後文件已被上傳到臨時,我是正確的? 有什麼辦法可以做到這一點在PHP或我必須在客戶端做到這一點?

回答

2

在上傳到服務器之前,PHP無法知道文件的類型,因此PHP可以掌握它。爲此,文件需要存儲在臨時文件夾中。另外,PHP不會檢查你,你將不得不檢查你的腳本(爲了這個目的文件需要保存在某個地方)。

要防止上傳無效文件,您需要檢查客戶端。這通常涉及Flash或其他插件,因爲Javascript被沙箱化,無法訪問硬盤上的文件(在這個網站上搜索此規則的例外情況)。

任何客戶端驗證是毫無意義的,因爲它是客戶端,您的服務器不能信任客戶端信息。就此而言,$_FILES['file']['type']信息也完全由客戶端提供,因此您不應該信任該信息。檢查自己的文件的MIME類型以驗證。有關如何執行此操作的示例,請參閱How to get the content-type of a file in PHP?

0

我不認爲這是可能做到在客戶端或服務器端。文件上傳將上傳到一個臨時目錄,並在那裏解析它。

0

正如其他人所說的,只有在文件上載之後,才能訪問文件類型。假設這是對「用戶體驗」的目的(而不是安全的目的),你可以使用JavaScript來檢查文件名和看它的擴展名:

document.getElementById("file-input").file 

將返回文件名,可以後的解析一切''看看它是gif,jpg等等。顯然,這個擴展只是一個容器(甚至可能被惡意用戶誤認爲是標籤),而不是'真正的'文件類型。

如果你真的想要在PHP中做到這一點,你可以有一個JavaScript傳遞名稱值作爲表單中的隱藏輸入,並且您的PHP可以通過基於此值的文件上傳停止。但是,在Javascript中這樣做會更有意義,因爲這又不是安全措施。