我正在编写一个脚本,该脚本将处理用户上传到服务器的内容,作为附加的安全层,我想知道:

有没有办法检测文件的真实扩展名/文件类型,并确保它不是用不同扩展名掩盖的另一种文件类型?

每种类型/扩展是否有字节标记或某种唯一标识符?

我希望能够检测到有人没有在他们上传的文件上应用不同的扩展名。

谢谢你,

有帮助吗?

解决方案

不是真的,无

您需要阅读每个文件的前几个字节并把它解释为一组有限的已知文件类型的报头。大多数文件具有不同的文件标头,某种元数据在MP3的情况下的前几个字节或前几个千字节。

您计划将不得不简单地尝试解析文件为每个接受的文件类型。

有关我的计划,我上传的图片发送到ImageMagick的在try-catch块,如果它吹起来,然后我想这是一个不好的形象。这应该被认为是不安全的,因为我加载任意的(提供的用户)二进制数据转换成一个外部程序,其通常是攻击向量。在这里,我相信ImageMagick的不做任何事情在我的系统。

我建议编写自己的处理程序要使用,以避免任何攻击向量的显著的文件类型。

编辑:我在PHP看到有一些工具来为你做这个

此外,MIME类型是什么用户的浏览器声称该文件是。这是方便和有用的阅读和那些在代码中作用于他们,但它不是一个安全的方法,因为任何人都将假MIME头很容易向您发送坏文件。这是不大不小的第一道防线,让您的代码,从barfing在PNG需要一个JPEG的,但如果有人在一个.exe文件嵌入病毒,并把它命名为JPEG,没有理由不有欺骗的MIME类型。

其他提示

PHP有几个,这取决于PHP的版本,您使用的读取文件内容的方式来确定它的MIME类型:

有一个看看 Fileinfo的功能如果你正在运行PHP 5.3 +

$finfo = finfo_open(FILEINFO_MIME); 
$type = finfo_file($finfo, $filepath);
finfo_close($finfo);  

可选地,检查出 mime_content_type 以旧的版本。

$type = mime_content_type($filepath);

请注意,只是验证文件类型,如果你想成为真正的安全是不够的。有人可能,例如,上传它利用在一个共同的渲染器中的漏洞有效的JPEG文件。为了防止这种情况,你需要保持良好的病毒扫描程序。

PHP 有一个 超全球 $_文件 它包含大小和文件类型等信息。看起来该类型是从某种标头而不是扩展名中获取的,但我可能是错的。

有一个例子 w3schools 网站.

当我有机会时,我会测试一下它是否可以被欺骗。

更新:

其他人可能都知道这一点,但 $_FILES 可能会被欺骗。我能够这样确定它:

$arg = escapeshellarg( $_FILES["file"]["tmp_name"] );
system( "file $arg", $type );
echo "Real type:  " . $type;

它基本上使用Unix的 文件 命令。可能有更好的方法,但我已经有一段时间没有使用 PHP 了。如果可能的话,我通常避免使用系统命令。

这可能仍然是伪造的。我会确保你不能(或没有)运行上传到自动在服务器中的文件。

我也有一个病毒/间谍软件扫描仪,并让它为你做的工作。

可以使用下面的代码赋予如果已经改变了扩展名你MIME类型然后还

$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo $mime = finfo_file($finfo, $_FILES['userfile']['tmp_name']);
finfo_close($finfo);

Windows用户:只需编辑php.ini并去掉这一行:

extension=php_fileinfo.dll

记住要重新启动Apache为新的php.ini生效。

在* nix中,该文件的前两个字节告诉你(请参阅“幻数”)。在Windows中,有时......这将是真正的(“头信息”)。这是最终O.S.依赖

在一般可执行对第一字节的“签名”;我觉得很难,虽然真正确定哪些文件类型确实是。

你期待什么类型的文件?也许你可以检查它是否符合你的期望,并拒绝一切。

其他已经提到的FileInfo,我认为这是正确的解决方案,但我要添加该以防万一你不能使用一个出于某种原因。大多数(全部?)* nix的发行版包括一个名为file命令为:当在一个文件将输出它的类型运行。它在人类可读的格式(默认)或MIME类型的开关来输出。你可以有你的脚本调用上载文件这个程序,读取结果。再次,这是不优选的方法。如果您使用的是Windows,这个工具可以通过Cygwin的。

时检查MIME类型简单地足够? 我假设上的文件更改扩展名不改变它的MIME类型?

时的MIME类型足够强的指标由这里去?

感谢所有响应迄今。

是检查MIME type简单的足够了吗?我假设变化的扩展在一个文件不会改变它的MIME类型?是MIME type一个足够强的指示去过这里?

这真的取决于它是如何使用。

  • 如果你提供上载和下载,那么没有什么问题,因为它没有执行。
  • 如果这是处理通过网络服务器,那么它将是依赖网络服务器配置,虽然受到大多数剩下的这些评论意见。
  • 如果它是一个形象,这将显示,或者没有,或以目标的图像库中的漏洞。但只有这些。
  • 东西就像一个pdf文件可能不会影响你的服务器,而是计算机的人访问该文件。
  • 如果它将会传递到一个功能,如"系统()"然后我们就回到操作系统的行为--如果这是"双击",该文件的扩展,甚至可能会加以考虑。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top