我一直在谷歌搜索如何获取要上传的文件的ContentType但无济于事。我需要使用Classic ASP完成这项工作。我一直从谷歌看到的是
response.ContentType = something
我的主要目标是在上传之前验证图片。只有有效的图像是.jpg,.gif和.png。因此,有效的ContentType是“image / jpeg”,“image / gif”和“image / png”。
我不想仅仅依赖文件扩展名,因为黑客可以简单地将扩展名更改为.exe到.jpg。
请帮助,谢谢!
增加: 我只是使用这个html控件:
<input type="file" name="inputfile" />
答案 0 :(得分:1)
浏览器可以在该字段的Content-Type
子部分的multipart/form-data
标头中上传文件类型。
经典ASP本身不支持文件上传 - 您使用什么来接收它们?有许多库/控件可以实现这一点,任何检索该子部分头的机制都取决于该代码是什么。
但是,这一点在很大程度上没有实际意义,因为:
(a)文件上传Content-Type
标题严重不可靠。浏览器可以并且会随心所欲地发送错误的值,并且用户通常很少能够纠正问题。 (例如,在Windows上,安装的应用程序可以轻松地从默认值中劫持MIME类型关联,即使在干净安装上,IE通常也会发送错误的JPEG类型。)
(b)攻击者可以欺骗内容类型,就像欺骗文件扩展名一样容易。
很少有理由关注提交的内容类型。最多可以将它用作用户可以手动覆盖的便捷默认值。
检查文件类型的目的是什么?
如果你试图阻止注入直接可执行文件的文件系统(例如xxx.asp
),那么检查正确的是文件扩展名,并且通常会对可能存在的内容施加非常严格的限制。文件名根本(因为通常服务器根据名称和位置决定服务器端执行哪些文件)。这实际上很难100%正确,因此通常最好不要将用户输入用作本地文件名的基础(而是使用生成的文件名,如123.jpeg
,将存储在数据库中的对象作为主要文件key 123
)。
如果您试图阻止上传损坏的图片或不支持的图片格式,您应该使用图片加载库检查文件的内容以查看它是否是有效图片。
如果您试图阻止人们上传HTML或插件内容以进行跨站点脚本攻击,那么通过检查文件,名称或其内容,您几乎无法做到这一点。创建“变色龙”文件是有效的图像,同时还包含浏览器在某些情况下可能解释为脚本的内容。如果您必须允许来自不受信任的用户的一般文件上传,那么最好的办法是将它们从不同的域提供给它们,这样跨站点脚本就不会放弃任何有价值的东西。