如何在上传到S3之前将文件验证为服务器上的图像?

时间:2013-07-25 05:52:33

标签: ruby-on-rails ruby file-upload amazon-s3

流程是:

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

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

  • “file.png”
  • “图像/ PNG”

服务器显示“ok”并返回S3字段以供上传。

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

谢谢!


示例:

测试Redactorjs服务器端代码(https://github.com/dybskiy/redactor-js/blob/master/demo/scripts/image_upload.php)它检查文件内容类型。但是尝试上传假图像(在此测试:http://imperavi.com/redactor/),它不允许伪图像。就像我想要的那样!

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

enter image description here

2 个答案:

答案 0 :(得分:1)

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

假设您有图片网址url = "http://my.image.com"

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

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

img.is_a?(Mechanize::Image)

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

可能有办法从文件而不是URL加载图像,我不确定,但我建议查看机械化文档进行检查。

答案 1 :(得分:0)

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

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

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

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

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

最终,这一切都不会阻止恶意企图。