2015-02-07 118 views
1

在php手册中说,$_FILES['userfile']['type']在客户端的控制下(所以也许它可以编辑,我猜)。
如何检查上传文件的安全类型

php manual.

$_FILES['userfile']['type']
的mime类型的文件,如果浏览器提供这个信息。
一个例子是“image/gif”。
然而,这种MIME类型在PHP方面没有被检查,因此不会将其值视为理所当然。

这:

您可以使用$_FILES['userfile']['type']变量扔掉不匹配某种类型标准的任何文件,但只把这个当作第一一系列的检查,因为这值完全在客户端的控制下,而不是在PHP端进行检查。



所以,我怎么可以检查,以防止有害的文件上传的文件类型上传?

+1

你要检查什么类型的有害的:文件?恶意软件,JavaScripts?只要你不运行任何文件,serverside你会保存吗? – 2015-02-07 10:30:48

+0

你已经复制和粘贴确切的方式如何检查.... – 2015-02-07 10:33:09

+0

你已经复制和粘贴确切的方式如何检查.... – 2015-02-07 10:33:10

回答

2

正如你自己发现的,你应该彻底检查每个文件以避免安全问题。

主要取决于您想要允许的文件类型。我会走这两步:

1.检查内容类型。

这里没有什么可以添加的,你已经发布了在你的问题中做到这一点的方式。但是,这可能是假的,所以请不要忘记....

2.验证文件内容。

您应该仔细检查文件内容。如果你正在处理图像,你可以使用phps图像功能来保证安全。

例子:

$x = getimagesize($_FILES['uploadfile']['tmp_name']); 
if (isset($x)) { 
    if($x['mime'] != 'image/gif' && $x['mime'] != 'image/jpeg') { 
     echo 'Not a valid GIF or JPEG'; 
     exit(0); 
    } 
} 
+0

非常感谢你:) – Elec 2015-02-07 10:46:46

+1

我真的不知道如何防止任何人伪造标题或MIME类型并继续上传他们想要的东西。 – 2015-02-07 11:00:17

+0

从左到右检查布尔表达式,所以'isset($ x)'应该是第一个。 – Gumbo 2015-02-07 11:00:43