2016-01-05 29 views
0

我正在面對使用Yii2框架進行文件上傳的問題,但我認爲這個問題比框架問題更深入。我有一個應用程序,允許用戶做pdf文件上傳,直到這裏我的應用程序工作正常,但我有麻煩時,一些smartass重命名文件擴展名從任何東西到PDF。該應用程序不驗證這種伎倆。如何阻止僞造文件後綴上傳?

我試圖沒有成功,以驗證mimetype。現在我正在尋找另一種方式。

任何人都知道如何阻止這種欺騙?

+1

可能重複的[如何檢查上傳的文件類型是pdf](http://stackoverflow.com/questions/11039095/how-to-check-the-uploaded-file-type-is-pdf) – dev0

+1

最可靠的方法是在php pdf庫中打開文件,然後將其保存到新的位置 - 如果它不是pdf文件,PDF閱讀器將失敗/拋出異常。雖然這比檢查MIME類型還要多(如上面鏈接問題中提到的@ dev0) – Steve

+0

@ dev0不適用於我。該應用程序不斷上傳。 –

回答

0

的問題,用解決的更多信息功能mime_content_type

入住這裏php.net

這個函數,函數返回真正的MIME類型。

0

最好的辦法是檢查文件的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); 
?> 
+0

感謝您的幫助,但無論如何它不適合我。 –

1

其更好地保持它的簡單,只需使用該

<?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 
    } 
} 
?> 

[這段代碼沒有進行測試]

參考這些鏈接,您將獲得有關什麼地方出了錯

http://php.net/manual/en/function.mime-content-type.php

http://php.net/manual/en/ref.fileinfo.php

+0

謝謝我會在下週末試試這個。 –