2010-07-28 163 views
3

我正在開發一個需要文件上傳的項目。我想確保它是安全的,並且只有PDF文件正在上傳。我已經在檢查文件擴展名,但我想確保該文件真的是一個PDF文件。在PHP中上傳驗證MIME類型的pdf文件

在php中檢查MIME類型的最佳方法是什麼?我使用PHP 5.2.5,似乎無法獲得fileinfo或mime_content_type()的工作。

爲FileInfo的我不斷收到這樣的:

Warning: finfo_open() [function.finfo-open]: Failed to load magic database 
at '(null)'. in [snipped filename] on line 35 
+0

爲什麼不FILEINFO/mime_content_type工作? – 2010-07-28 12:50:49

回答

5

MIME類型是不可靠的檢查文件的類型。客戶的瀏覽器可能會錯誤地報告它。

檢查Magic Number。 PDF文件以「%PDF」(25 50 44 46)開頭。

+0

從$ _FILE變量中讀取mime類型會從瀏覽器中獲取它。這就是我正在做的。我想要做的是讀取文件的標題,看看它是否真的是一個PDF文件。 – Samuel 2010-07-28 12:54:13

+0

是的。這就是這裏所建議的。 – recursive 2010-07-28 12:56:50

+0

@recursive記錄,這個答案的第二行是不存在,當我發佈評論。 – Samuel 2010-07-28 12:59:19

-2

獲取MIME類型的簡單方法是直接從$ _FILES。 如果MIME類型包含單詞'pdf',那麼你可以認爲它是一個有效的PDF。

$contentType = $_FILES['myFile']['type']; 
if(isValidPDF($contentType)) { 
    die('It is a PDF'); 
} else { 
    die('It is not a PDF'); 
} 

function isValidPDF($mime) { 
    return strpos($mime, 'pdf') !== false; 
} 
+0

這是一種不安全的方法。 $ _FILES從瀏覽器中獲取它的MIME類型,而不是文件本身。 – buggedcom 2010-09-12 14:22:40

1

事實上,MIME類型的不確保用戶上傳了一個有效文件,因爲這可以,如果你知道如何容易僞造的最佳途徑。

但文件被公佈的時候,可以隨時查詢MIME類型是這樣的:

$Type = $_FILES['someFile']['type']; 

也許你可以使用一個PHP類,以確定它是一個有效的PDF類似FPDF(http://www.fpdf.org/

好吧,祝你好運:)反正

1

這可能意味着,MAGIC環境變量沒有設置,和你的魔法文件不是位於/ usr /共享/其它/魔法。無論是設置魔術的價值指向正確的magic文件,或者魔術文件作爲第二個參數傳遞給您的FINFO構造

$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); 

$finfo = finfo_open(FILEINFO_MIME, "/usr/share/misc/magic");