我有一段时间这个问题了:文件的MIME类型究竟是如何确定的?我相信这是通过检查文件的特定字节是否包含已知的magic numbers/file signatures来完成的,对吗?

如果是这样,这就提出了另一个问题,可以说我将带有假GIF文件签名的bash脚本上传到仅允许上传图片的网站,会发生什么?任何一个:

  • 模仿类型检测例程足够聪明,可以检测到假签名或
  • image/gif错误地返回为mimetype,并且允许上传继续

  • 我没有安装ATM的HEX编辑器,并且我不喜欢从测试中得出与安全性相关的结论,因为我可能会遗漏(或误解)某些东西,所以我的问题是:以上哪个选项是正确的?

    另外,还有其他最佳实践(除了检查mimetype之外)以确保任何给定的文件实际上是看起来/需要(或允许)的东西吗?提前致谢。

    PS:请注意,我不是在问type超全局变量中的$_FILES索引。

    最佳答案

    我的理解是文件上传代码中的MIME确定例程非常粗糙,并且$ _FILES数组中的MIME类型根本无法被信任。根据我的经验,它很容易被欺骗。

    最好使用Fileinfo库,该库提供了更强大的文件类型检测功能。

    http://www.php.net/manual/en/ref.fileinfo.php

    10-01 22:38