创建一个文本文件并将其重命名为anything.jpg
并尝试在Facebook上传,facebook会检测到该文件不是图像并显示Please select an image file
或类似内容。他们是如何做到的呢?
我通过创建虚拟html localhost
和form
元素在<input type="file"...
上对其进行了测试,并上传了通过将文本文件重命名为something.jpg
而创建的图像文件并且$_FILES['control_name']['type']
中的文件类型显示image/jpeg
...如何阻止用户上传此类“假”图片。我认为使用$_FILES['control_name']['type']
的限制不是解决方案,对吧?
答案 0 :(得分:2)
在服务器上处理图像时,请使用图像处理库(例如getimagesize
)来检测它的宽度和高度。如果失败,请拒绝图像。无论如何,您可能会生成缩略图,因此它就像一个额外的if
。
答案 1 :(得分:1)
检查实际文件的方法有很多种。 Facebook如何做到这一点,只有创造它的人知道我认为:)。
他们很可能会查看文件中的第一个字节。所有文件都有某些字节来描述它们的真实含义。但是,为此你需要大量的时间/金钱来创建一个数据库或者你可以用它来验证上传。
更常见的解决方案是;
在很多浏览器中,当然不包括Internet Explorer,您可以设置一个accept属性来检查客户端的扩展。更多信息:File input 'accept' attribute - is it useful?
这不是真正的安全,因为脚本可以用图像扩展名保存
这是您在问题中所述的解决方案。然而,这也很容易绕过,并依赖于服务器的最新状态。
最可靠(对于大多数开发人员的技能和可用时间)将处理图像作为测试。 把它放在像GD或Imagic这样的图书馆里。当图像不是真正的图像时,它们会引发错误。但是,这将要求您保持该软件的最新状态。
简而言之,如果不花费大量时间,就没有100%的保证。即便如此,你只能得到99.9%。您应该根据上述选项权衡您的可用时间,并选择最适合您的时间。作为最佳实践,我推荐所有3种的组合。
中也讨论了这个主题答案 2 :(得分:0)
文件中的标题不一样。