在过去的几周里,我一直在研究这个话题,我真的开始烦恼我找不到明确的答案。
我有一个网站,用户可以在其中上传自己的个人资料图片。我想确保允许上传的唯一文件是 JPEG、GIF 和 PNG
显然,使用浏览器发送的 mime 类型进行验证是一个很大的禁忌,因为它很容易被欺骗,因此排除了这种情况,而且不用说永远不要验证文件扩展名。
接下来是 PHP 提供的新的(ish)finfo 函数。我暂时一直在使用它,因为它似乎是最好的可用方法,但阅读http://www.php.net/manual/en/ref.fileinfo.php上的评论似乎也可以被欺骗。此外,我不确定仅检查返回的 MIME 类型是否为 image/jpeg、image/gif 或 image/png 是否过于严格?
然后是 getimagesize() 函数,我读到的任何不是看起来完美的图像的东西都返回 false,但如果是这种情况,为什么这里有这么多公认的答案说使用 finfo?
最后是 system() 或 exec() 调用,允许用户指定系统调用的一部分似乎有点危险!
所以我的问题是,我应该使用什么方法?我想让我的脚本尽可能安全,但也要足够开放,这样普通用户就不会因为他们的有效图像被脚本拒绝而受到惩罚