完整安全圖像上載腳本我不知道這是否會發生,但我會嘗試一下。過去一小時,我研究了圖像上傳安全性。我了解到有很多功能可以測試上傳。在我的項目中,我需要保證上傳的圖像。也可能有相當大的數量,并且可能需要大量帶寬,因此購買API不是一種選擇。所以我決定獲得一個完整的PHP腳本,用于真正的安全圖像上傳。我也認為這對許多人有幫助,因為找不到真正安全的人是不可能的。但我不是php的專家,所以添加一些功能對我來說真的很頭疼,所以我會請求這個社區幫助來創建一個真正安全圖像上傳的完整腳本。關于它的真正偉大的話題在這里(但是,它們只是告訴我們需要做什么,但不是如何做到這一點,正如我所說我不是PHP的高手,所以我無法做到這一切我自己): PHP圖像上傳安全檢查列表https://security.stackexchange.com/questions/32852/risks-of-a-php-image-upload-form總之,他們告訴這是安全圖像上傳所需要的(我將從上面的頁面引用):使用.httaccess禁止PHP在上傳文件夾中運行。如果文件名包含字符串“php”,則不允許上傳。僅允許擴展名:jpg,jpeg,gif和png。僅允許圖像文件類型。禁止具有兩種文件類型的圖像。更改圖像名稱。上傳到子目錄而不是根目錄。也:使用GD(或Imagick)重新處理圖像并保存處理后的圖像。所有其他人都對黑客來說很有趣“正如rr指出的那樣,使用move_uploaded_file()進行任何上傳“順便說一句,你想要對你的上傳文件夾非常嚴格。那些地方是許多漏洞發生的黑暗角落之一。這適用于任何類型的上載和任何編程語言/服務器。檢查https://www.owasp.org/index.php/Unrestricted_File_Upload第1級:檢查擴展名(擴展名文件以)結尾第2級:檢查MIME類型($ file_info = getimagesize($ _ FILES ['image_file']; $ file_mime = $ file_info ['mime'];)級別3:讀取前100個字節并檢查它們是否具有以下范圍內的任何字節:ASCII 0-8,12-31(十進制)。級別4:檢查標題中的幻數(文件的前10-20個字節)。你可以在這里找到一些文件頭字節:http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Examples您可能還想在$ _FILES ['my_files'] ['tmp_name']上運行“is_uploaded_file”。請參見http://php.net/manual/en/function.is-uploaded-file.php這是它的重要組成部分,但仍然不是全部。(如果您知道更多可能有助于使上傳更安全的內容,請分享。)這就是我們現在所做的事情所以,我要問的是通過發布代碼片段來幫助我(以及其他所有人)使這個圖像上傳腳本變得超級安全?;蛘咄ㄟ^共享/創建添加了所有片段的完整腳本。
2 回答

隔江千里
TA貢獻1906條經驗 獲得超10個贊
使用PHP上傳文件既簡單又安全。我建議學習一下:
pathinfo - 返回有關文件路徑的信息
move_uploaded_file - 將上傳的文件移動到新位置
copy - 復制文件
finfo_open - 創建新
fileinfo
資源
要在PHP中上傳文件,您有兩種方法:PUT
和POST
。要將該POST
方法與HTML一起使用,您需要enctype
在表單上啟用如下:
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"></form>
然后在你的PHP中你需要得到你上傳的文件,$_FILES
如下所示:
$_FILES['file']
然后你需要從temp(“upload”)移動文件move_uploaded_file
:
if (move_uploaded_file($_FILES['file']['tmp_name'], YOUR_PATH)) { // ...}
上傳文件后,您需要檢查文件的擴展名。最好的方法是這樣使用pathinfo
:
$extension = pathinfo($_FILES['file']['tmp_name'], PATHINFO_EXTENSION);
但是擴展程序并不安全,因為您可以上傳帶擴展名.jpg
但帶有mimetype 的文件,text/php
這是一個后門程序。所以,我建議finfo_open
像這樣檢查真正的mimetype :
$mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $_FILES['file']['tmp_name']);
并且不要使用,$_FILES['file']['type']
因為有時,根據您的瀏覽器和客戶端操作系統,您可能會收到, application/octet-stream
并且此mimetype不是您上傳文件的真實mimetype。
我認為您可以使用此方案安全地上傳文件。
對不起我的英文,再見!
- 2 回答
- 0 關注
- 392 瀏覽
添加回答
舉報
0/150
提交
取消