流程是:
如果我将“file.pdf”的扩展名更改为“file.png”然后上传它,那么在上传到S3之前发送到服务器的数据是:
服务器显示“ok”并返回S3字段以供上传。
但发送的内容类型不是真实的内容类型。但我如何在服务器上验证这一点?
谢谢!
示例:
测试Redactorjs服务器端代码(https://github.com/dybskiy/redactor-js/blob/master/demo/scripts/image_upload.php)它检查文件内容类型。但是尝试上传假图像(在此测试:http://imperavi.com/redactor/),它不允许伪图像。就像我想要的那样!
但它怎么可能?查看请求参数:(它作为image / jpeg发送,应该是有效的)
答案 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的各种位。
最终,这一切都不会阻止恶意企图。