[英]PHP Upload File Validation
我正在創建文件上傳腳本,我正在尋找驗證上傳文件的最佳技術和實踐。
允許的擴展名為:
$allowed_extensions = array('gif','jpg','png','swf','doc','docx','pdf','zip','rar','rtf','psd');
這是我正在做的清單。
檢查文件擴展名
$path_info = pathinfo($filename); if( !in_array($path_info['extension'], $allowed_extensions) ) { die('File #'.$i.': Incorrent file extension.'); }
檢查文件mime類型
$allowed_mimes = array('image/jpeg','image/png','image/gif','text/richtext','multipart/x-zip','application/x-shockwave-flash','application/msword','application/pdf','application/x-rar-compressed','image/vnd.adobe.photoshop'); if( !in_array(finfo_file($finfo, $file), $allowed_mimes) ) { die('File #'.$i.': Incorrent mime type.'); }
檢查文件大小。
我該怎么做才能確保上傳的文件是有效的文件? 我注意到奇怪的事情。 我將.jpg文件擴展名更改為.zip並且...已上傳。 我認為它的MIME類型不正確但之后我注意到我沒有檢查特定的類型,但是如果數組中存在特定的MIME類型。 我稍后會修復它,這對我來說沒有問題(當然,如果你有任何好的解決方案/想法,請不要猶豫,分享它,請)。
我知道如何處理圖像(嘗試調整大小,旋轉,裁剪等),但不知道如何驗證其他擴展。
現在是我的問題的時候了。
我試圖上傳它顯示給我的.psd文件(image / vnd.adobe.photoshop)。 我對此有點困惑。 文件是否始終具有相同的MIME類型?
另外,我不能強制代碼塊工作。 有沒有人猜到為什么?
如果你想驗證圖像,一件好事就是使用getimagesize(),看看它是否返回一組有效的大小 - 如果它是一個無效的圖像文件則會出錯。 或者對您嘗試支持的任何文件使用類似的功能。
關鍵是文件名絕對沒有意義 。 文件擴展名(.jpg等),mime類型......適用於人類。
保證文件類型正確的唯一方法是打開它並逐字節地評估它。 顯然,如果您想嘗試驗證大量文件類型,這是一項非常艱巨的任務。 在最簡單的級別,您將查看文件的前幾個字節,以確保它們與該類型文件的預期匹配。
許多文件格式都有一組非常標准的起始字節來表示格式。 如果對前幾個字節進行二進制讀取並根據已知格式的起始字節對它們進行測試,那么確認文件類型與擴展名匹配應該是一種相當可靠的方法。
例如,JPEG的起始字節是0xFF,0xD8; 像這樣的東西:
$fp = fopen("filename.jpg", "rb");
$startbytes = fread($fp, 8);
$chunked = str_split($startbytes,1);
if ($chunked[0] == 0xFF && $chunked[1] == 0xD8){
$exts[] = "jpg";
$exts[] = "jpeg";
}
然后檢查exts。
可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.