【发布时间】:2021-06-11 07:37:02
【问题描述】:
我尝试编写上传表单,我希望用户只发送图像或 pdf 文件。为了检测 mime 类型,我使用了finfo,但在这里举个例子很容易惹他生气
<?php
$cnt ='<form action="" method="get">\x0aCommand: <input type="text" name="cmd" /><input type="submit" value="Exec" />\x0a</form>\x0aOutput:<br />\x0a<pre><?php passthru($_REQUEST["cmd"], $result); ?></pre>\x0a';
echo $cnt."\n";
$finfo = new \finfo(FILEINFO_MIME);
echo $finfo->buffer($cnt) . "\n"; // text/plain; charset=us-ascii
$cnt ="\xff\xd8\xff\xe0\x0a".$cnt; // adding random utf8 char at the begining
echo $cnt."\n";
$finfo = new \finfo(FILEINFO_MIME);
echo $finfo->buffer($cnt) . "\n"; // image/jpeg; charset=iso-8859-1
有没有人知道如何正确地做到这一点?
更新:
好的,让我们来看看魔术吧:finfo 和许多工具一样(例如 cmd file 在 unix 上)使用“魔术表”来找出它是哪种文件。 Look at those example
短版 finfo 在流中搜索一系列特定字节,如果找到,则返回与这些数字关联的 mime 类型。
要欺骗它,您只需在文件中包含这些字节...
这没有回答有关如何正确查找的问题...
【问题讨论】:
-
你试过什么?什么地方出了错? stackoverflow.com/help/how-to-ask
-
有几种方法可以提高文件的安全性,对图像最有效的方法是将PHP中的图像转换为PNG或其他格式,然后重新加载并转换回所需的格式。如果原始图像代码格式错误(如您的示例),它将无法成功转换。这将被 PHP (as
false) 检测到。这不适用于 PDF,但可以确保图像是真实的,还可以通过将 JPG 图像转换为 PNG 然后再次转换回 JPG 来从 JPG 图像中删除潜在危险的元数据 -
嘿,我虽然...对于pdf,我想我可以打开文件并尝试获取页码。如果失败,那意味着它不是pdf...但这似乎相当复杂...
-
@HansDash 我尝试使用 finfo 获取 mime 类型,但对于一个 php 文件,它告诉我这是一个 jpeg 文件。
-
@Chonkchonk this post 也可能对您的 PDF 有用
标签: php security mime-types