2011-06-10 56 views
0

如何防止php上传文件到./tmp/文件夹,如果他们不是正确的类型。如何防止php上传文件:

例如使用下面的代码w3school网站上给出的示例代码检查文件长度:

if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/pjpeg")) 

不过这是后文件已被上传到临时,我是正确的? 有什么办法可以做到这一点在PHP或我必须在客户端做到这一点?

回答

2

在上传到服务器之前,PHP无法知道文件的类型,因此PHP可以掌握它。为此,文件需要存储在临时文件夹中。另外,PHP不会检查你,你将不得不检查你的脚本(为了这个目的文件需要保存在某个地方)。

要防止上传无效文件,您需要检查客户端。这通常涉及Flash或其他插件,因为Javascript被沙箱化,无法访问硬盘上的文件(在这个网站上搜索此规则的例外情况)。

任何客户端验证是毫无意义的,因为它是客户端,您的服务器不能信任客户端信息。就此而言,$_FILES['file']['type']信息也完全由客户端提供,因此您不应该信任该信息。检查自己的文件的MIME类型以验证。有关如何执行此操作的示例,请参阅How to get the content-type of a file in PHP?

0

我不认为这是可能做到在客户端或服务器端。文件上传将上传到一个临时目录,并在那里解析它。

0

正如其他人所说的,只有在文件上载之后,才能访问文件类型。假设这是对“用户体验”的目的(而不是安全的目的),你可以使用JavaScript来检查文件名和看它的扩展名:

document.getElementById("file-input").file 

将返回文件名,可以后的解析一切''看看它是gif,jpg等等。显然,这个扩展只是一个容器(甚至可能被恶意用户误认为是标签),而不是'真正的'文件类型。

如果你真的想要在PHP中做到这一点,你可以有一个JavaScript传递名称值作为表单中的隐藏输入,并且您的PHP可以通过基于此值的文件上传停止。但是,在Javascript中这样做会更有意义,因为这又不是安全措施。