3

流程是:

  • 用户选择客户端上的图像。
  • 只有文件名、内容类型和大小被发送到服务器。(例如“file.png”、“image/png”、“123123”)
  • 响应是直接上传到 S3 的字段和策略。(例如“键:xxx,”alc“:...)

情况是,如果我将“file.pdf”的扩展名更改为“file.png”然后上传它,在上传到S3之前发送到服务器的数据是:

  • “文件.png”
  • “图像/PNG”

服务器说“ok”并返回 S3 字段进行上传。

但是发送的内容类型不是真正的内容类型。但是我如何在服务器上验证这一点?

谢谢!


例子:

测试 Redactorjs 服务器端代码 ( https://github.com/dybskiy/redactor-js/blob/master/demo/scripts/image_upload.php ) 它会检查文件内容类型。但是尝试上传假图片(在这里测试:http: //imperavi.com/redactor/),它不允许假图片。如我所愿!

但怎么可能呢?查看请求参数:(它作为图像/jpeg 发送,应该是有效的)

在此处输入图像描述

4

2 回答 2

1

当我在工作中处理这个问题时,我找到了使用 Mechanize 的解决方案。

假设你有一个图片网址,url = "http://my.image.com"

然后你可以使用img = Mechanize.new.get(url)[:body]

测试是否img真的是图像的方法是发出以下测试:

img.is_a?(Mechanize::Image)

如果图像不合法,这将返回 false。

可能有一种方法可以从文件而不是 URL 加载图像,我不确定,但我建议查看 mechanize docs 进行检查。

于 2016-03-09T04:23:22.873 回答
0

对于较旧的浏览器,您无能为力,因为您无法访问文件内容或名称之外的任何元数据。

使用 HTML5 文件 API,您可以做得更好。例如,

document.getElementById("uploadInput").files[0].type

返回第一个文件的 mime 类型。我不相信用于执行此识别的方法是标准规定的。

如果这还不够,那么您可以使用 FileReader api 在本地读取文件并执行您需要的任何测试。这可以像检查各种文件格式开头的魔术字节以完全验证文件是否符合相关规范一样简单。MDN 有一篇很棒的文章展示了如何使用这些 api 的各个部分。

最终,这一切都无法阻止恶意尝试。

于 2013-07-25T08:26:17.213 回答