当前位置:  开发笔记 > 编程语言 > 正文

如何以编程方式确定文件的真实扩展名/类型?

如何解决《如何以编程方式确定文件的真实扩展名/类型?》经验,为你挑选了2个好方法。

我正在开发一个脚本,用于处理用户上传到服务器,作为一个额外的安全层,我想知道:

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

是否有每个类型/扩展名的字节戳或一些唯一标识符?

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

谢谢,



1> Karl..:

不是,不是.

您需要读取每个文件的前几个字节,并将其解释为有限的一组已知文件类型的标头.大多数文件具有不同的文件头,前几个字节中的某种元数据或MP3的前几千字节.

您的程序只需尝试解析每个接受的文件类型的文件.

对于我的程序,我将上传的图像发送到try-catch块中的imagemagick,如果它爆炸,那么我猜这是一个糟糕的图像.这应该被认为是不安全的,因为我将任意(用户提供的)二进制数据加载到外部程序中,该程序通常是攻击向量.在这里,我相信imageMagick不对我的系统做任何事情.

我建议为您打算使用的重要文件类型编写自己的处理程序,以避免任何攻击向量.

编辑:我在PHP中看到有一些工具可以帮到你.

此外,MIME类型是用户的浏览器声明文件的类型.在您的代码中读取它们并对它们进行操作是很方便和有用的,但它不是一种安全的方法,因为任何向您发送错误文件的人都会轻易伪造MIME标头.这是一种前线防御,以保持您的代码在PNG上禁止JPEG,但如果有人在.exe中嵌入病毒并将其命名为JPEG,则没有理由不欺骗MIME类型.



2> Paul Dixon..:

PHP有两种方法可以读取文件内容以确定其MIME类型,具体取决于您使用的PHP版本:

如果您运行的是PHP 5.3+,请查看Fileinfo函数

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

或者,查看 旧版本的mime_content_type.

$type = mime_content_type($filepath);

请注意,如果您想要真正安全,仅仅验证文件类型是不够的.例如,某人可以上传有效的JPEG文件,该文件利用了常见渲染器中的漏洞.为防止这种情况,您需要一个维护良好的病毒扫描程序.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有