当我尝试处理文件上传时,是否应该根据文件MIME类型或文件扩展名运行验证?
Pros& amp;是什么?这两种文件验证方式的缺点?
而且,我应该关注任何其他安全问题吗?
在这些日子里,我依赖于MIME类型,但在这篇文章中回答最多的投票
永远不要依赖浏览器提交的MIME类型!
答案 0 :(得分:30)
好的,所以对于这里所有关于“SCREW EXTENSIONS,CHECK MIME!FILEINFO RLZ!”的人来说,我已经准备了一些教程:
总之,您永远不应该 EVER 依赖于MIME类型。您的网络服务器并不关心MIME类型,它决定了 EXTENSION 要做什么,最终是downvoted @Col。 Shrapnel 的答案其实是对的。在执行时,通过检查MIME提供给您的任何信息绝对与您的网络服务器无关。
编辑:不那么罕见的代码就像你想要的那样,会为这种类型的攻击打开一个网站:
<?php
$mimetype = mime_content_type($_FILES['file']['tmp_name']);
if(in_array($mimetype, array('image/jpeg', 'image/gif', 'image/png'))) {
move_uploaded_file($_FILES['file']['tmp_name'], '/whatever/something/imagedir/' . $_FILES['file']['name']);
echo 'OK';
} else {
echo 'Upload a real image, jerk!';
}
答案 1 :(得分:1)
Mime-type不是可靠的来源,因为它从浏览器发送(任何人都可以手动创建HTTP请求)。 PHP没有检查扩展和mine-type的等价性(http://ru.php.net/manual/en/features.file-upload.post-method.php)。您可以使用文件名“image.php”和mime-type“image / gif”来强调HTTP请求。
如果您希望将上传的文件保存到HDD并稍后公开访问此文件,请始终使用扩展程序验证。
答案 2 :(得分:1)
无适用于准确查找文件类型。原因是 - *扩展 - 用户只需重命名文件即可轻松更改扩展名。 * Mime类型 - 要更改mime类型,某些附加/扩展可以这样做,因为它来自客户端(因此可以在发送到服务器之前更改),而不是由服务器生成。
现在进行验证,问题的答案取决于您要验证文件类型的原因。
大多数情况下,我们需要确保上传的文件不会被执行。因此,您需要确定服务器如何处理/执行文件。 - 如果您的服务器检查扩展以进行验证,您还需要验证您是否存储了可以执行扩展名的文件。 - 如果您的服务器使用mime-types,请注意客户端发送的mime-type和服务器用于同一文件的mime-type可能不同。因此,请使用服务器使用的相同逻辑来查找mime类型。
答案 3 :(得分:0)
为了准确确定上传的内容,您不会检查文件扩展名,也不会检查浏览器发送的mime类型。
在* nix环境中,你有了检查给定文件的mime类型的实用程序,通常位于magic.mime文件中(/usr/share/magic.mime或类似的东西,具体取决于你的设置)。
从magic.mime复制/粘贴,以便您可以看到它的工作原理:
# Magic data for KMimeMagic (originally for file(1) command)
#
# Note on adding additional MIME types:
#
# [RFC2045,RFC2046] specifies that Content Types, Content Subtypes, Character
# Sets, Access Types, and conversion values for MIME mail will be assigned and
# listed by the IANA.
# http://www.iana.org/assignments/media-types/
#
# Any unregistered file type should be listed with a preceding x-, as in
# application/x-foo (RFC2045 5.1), or a x., as in application/x.foo (RFC4288
# 4.3). Any non x-prefixed type should be registered with IANA and listed at
# the above address. Any other behavior is a MIME standards violation!
#
# It is preferred that when a registered MIME type exists, that
# the registered Content-Type and Subtype be used to refer to a file of
# that type, so don't use application/x-zip when application/zip is
# registered.
#
# If an active RFC suggests that a MIME registration for a new type is in
# progress, make a note of it pointing to that RFC.
#
# The format is 4-5 columns:
# Column #1: byte number to begin checking from, ">" indicates continuation
# Column #2: type of data to match
# Column #3: contents of data to match
# Column #4: MIME type of result
# Column #5: MIME encoding of result (optional)
我将链接到一个链接,该链接将帮助您在PHP中进一步实现(一旦完成,就会有两行代码)。
如果你在完成所有这些工作后无法使其发挥作用,请在评论中发布,我将提供安全检测上传内容所需的完整代码。