当我尝试处理文件上传,基于文件的MIME类型或文件扩展名,我应该运行验证?
什么是文件验证这些2种方式利弊?
而且,任何其他的安全问题,我应该关注的?
在这些日子里,我依靠MIME类型但得到的答复与最先进的选票在这个岗位
文件上传问题在PHP中说:
千万不要依靠提交浏览器的MIME类型!
当我尝试处理文件上传,基于文件的MIME类型或文件扩展名,我应该运行验证?
什么是文件验证这些2种方式利弊?
而且,任何其他的安全问题,我应该关注的?
在这些日子里,我依靠MIME类型但得到的答复与最先进的选票在这个岗位
文件上传问题在PHP中说:
千万不要依靠提交浏览器的MIME类型!
好了,到这里所有的geniouses哇哇哇一些关于“螺丝扩展,检查MIME FILEINFO RLZ!”,我已经准备了一些教程:
总之,你应该永远不依靠MIME类型。 您的Web服务器不关心的MIME类型,它决定了通过扩展做的最终downvoted @col。 弹片的答案是正确的实际。 通过检查的东西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!';
}
Mime类型是不可靠的来源,因为它是从浏览器(也任何人可以手动创建HTTP请求)发送。 PHP不确认的扩展和防雷型(http://ru.php.net/manual/en/features.file-upload.post-method.php)的等价。 可以用口音文件名“image.php”和MIME类型“图像/ GIF” HTTP请求。
如果你要上传的文件保存到硬盘,后来给这个文件的公共访问的扩展总是使用验证。
无适合用于准确地找出一个文件的类型。 原因是 - *分机 - 用户可以很容易地改变仅通过重命名文件扩展名。 * MIME类型 - 要更改mime类型,一些附加/扩展可以做到这一点,因为它是从客户机侧进入(这样可以发送到服务器之前,改变),而不是由服务器生成。
现在核查,问题的答案取决于你为什么要验证的文件类型。
大多数时候,我们需要确保上传的文件不应该得到执行。 出于这个原因,你需要确保你的服务器如何处理/执行文件。 - 如果您的服务器检查验证扩展,您还需要验证你是不是存储与扩展名的文件,可以得到执行。 - 如果您的服务器使用MIME类型,提防的事实,由客户端和相同的文件服务器使用MIME类型发送的MIME类型可以是不同的。 因此,使用相同的逻辑服务器使用,以找出MIME类型。
为了准确地确定什么已经上传,你不检查文件的扩展名,也不是由浏览器发送的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进一步实施将您链接(代码字面上2号线一旦你完成)。
如果你不能让它毕竟这项工作,张贴在这里的评论,我会提供安全检测一下已经上传需要完整的代码。
Fileinfo的