【问题标题】:How to validate a file as image on the server before uploading to S3?在上传到 S3 之前,如何在服务器上验证文件作为图像?
【发布时间】:2013-07-24 21:01:13
【问题描述】:

流程是:

  • 用户在客户端选择一张图片。
  • 只有文件名、内容类型和大小被发送到服务器。 (例如“file.png”、“image/png”、“123123”)
  • 响应是用于直接上传到 S3 的字段和策略。 (例如“key: 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 形式发送,应该是有效的)

【问题讨论】:

  • 希望这会有所帮助。 stackoverflow.com/questions/14768717/…
  • 其实帮不了太多。我没有使用载波。不过谢谢!
  • 所以您要直接上传到 S3?
  • 是的。但在发送之前,我会进行 ajax 调用以获取要上传的策略。同样的 ajax 验证 params 内容类型。但它可能是假的......

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


【解决方案1】:

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

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

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

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

img.is_a?(Mechanize::Image)

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    最终这些都无法阻止恶意尝试。

    【讨论】:

    • 感谢您的回答。但我想唯一的解决方案是读取服务器中的第一个字节,而不是我认为的客户端
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2015-06-29
    • 2019-05-22
    • 2017-01-26
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多