在PHP上验证上传的mime类型的pdf文件

时间:2010-07-28 12:48:47

标签: php pdf file-upload

我正在开发一个需要上传文件的项目。我想确保它是安全的,并且只上传PDF文件。我已经在检查文件扩展名,但我想确保该文件确实是一个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

4 个答案:

答案 0 :(得分:5)

mime类型对于检查文件类型不可靠。客户端的浏览器可能会错误地报告。

检查Magic Number。 PDF文件以“%PDF”(25 50 44 46)开头。

答案 1 :(得分:1)

实际上,MIME类型并不是确保用户上传有效文件的最佳方式,因为如果您知道如何,这可能很容易被伪造。

但是当发布文件时,你总是可以这样检查mime类型:

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

也许您可以使用php类来确定它是有效的PDF类似FPDF(http://www.fpdf.org/

好吧,祝你好运:)

答案 2 :(得分:1)

这可能意味着未设置MAGIC环境变量,并且您的魔术文件不在/ usr / share / misc / magic。将MAGIC的值设置为指向正确的魔术文件,或将魔术文件作为第二个参数传递给finfo构造函数

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

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

答案 3 :(得分:-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;
}