2010-07-28 52 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");