我正在面對使用Yii2框架進行文件上傳的問題,但我認爲這個問題比框架問題更深入。我有一個應用程序,允許用戶做pdf文件上傳,直到這裏我的應用程序工作正常,但我有麻煩時,一些smartass重命名文件擴展名從任何東西到PDF。該應用程序不驗證這種伎倆。如何阻止僞造文件後綴上傳?
我試圖沒有成功,以驗證mimetype。現在我正在尋找另一種方式。
任何人都知道如何阻止這種欺騙?
我正在面對使用Yii2框架進行文件上傳的問題,但我認爲這個問題比框架問題更深入。我有一個應用程序,允許用戶做pdf文件上傳,直到這裏我的應用程序工作正常,但我有麻煩時,一些smartass重命名文件擴展名從任何東西到PDF。該應用程序不驗證這種伎倆。如何阻止僞造文件後綴上傳?
我試圖沒有成功,以驗證mimetype。現在我正在尋找另一種方式。
任何人都知道如何阻止這種欺騙?
最好的辦法是檢查文件的MIME類型:
http://php.net/manual/en/function.finfo-file.php
<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if(finfo_file($finfo,$filename) == 'application/pdf'){
// input file is pdf
}
finfo_close($finfo);
?>
感謝您的幫助,但無論如何它不適合我。 –
其更好地保持它的簡單,只需使用該
<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if(finfo_file($finfo,$filename) == 'application/pdf'){
// input file is pdf
}
?>
既然你說其不工作爲你,你可以試試這些
如果你使用的是Linux服務器你可以n使用shell命令來檢查他們的mime類型
<?php
function detectMimeType($filename='')
{
$filename = escapeshellcmd($filename);
$command = "file -b --mime-type -m /usr/share/misc/magic {$filename}";
$mimeType = shell_exec($command);
return trim($mimeType);
}
?>
或者你也可以試試這個方法。在這裏,我們假設該PDF文件以PDF%字符串開頭。[通常它與%PDF開始。
<?php
function detectFileType($filename='')
{
$handle = fopen($filename, "rb");
$contents = fread($handle, 4);
fclose($handle);
if($contents == "%PDF")
{
return "application/pdf";
}
else
{
return "application/octet-stream"; //unknown type
}
}
?>
[這段代碼沒有進行測試]
參考這些鏈接,您將獲得有關什麼地方出了錯
謝謝我會在下週末試試這個。 –
可能重複的[如何檢查上傳的文件類型是pdf](http://stackoverflow.com/questions/11039095/how-to-check-the-uploaded-file-type-is-pdf) – dev0
最可靠的方法是在php pdf庫中打開文件,然後將其保存到新的位置 - 如果它不是pdf文件,PDF閱讀器將失敗/拋出異常。雖然這比檢查MIME類型還要多(如上面鏈接問題中提到的@ dev0) – Steve
@ dev0不適用於我。該應用程序不斷上傳。 –