感谢任何建议。
有没有C#中的方法(或外部库)可以确认文件是JPG / PNG,否则会抛出错误?
也许有,但这本身并没有什么帮助。您可以轻松地创建一个既是有效图像格式又包含活动HTML /脚本内容供IE内容嗅探绊倒的文件。或者还有破碎的Java和Flash起源策略需要担心,这可能会产生同样的影响,将脚本化到服务器的安全上下文中。
如果您处理图像(例如剪裁,调整大小)并重新保存,则极其难以进行内容走私攻击。然而,您应始终确保您的服务器端工具是最新的,因为图像处理库中的漏洞可能使您暴露于服务器端利用。
如果您无法这样做,那么作为减轻所有内容注入问题的最佳选择是从不具有对主站点敏感凭据(cookie,基本认证)的任何内容的不同[子]域提供图像。
如果使用此目的的子域,例如images.example.com
,则您的主站点应仅通过www.example.com
访问,而不是example.com
。否则,在IE中向images.example.com
注入内容可以访问example.com
的cookie。example.com
应301重定向到www.example.com
,以防止不必要的cookie泄漏。
将响应添加头X-Content-Type-Options: nosniff
,以阻止来自IE8的内容走私攻击。(很遗憾,无法帮助早期版本。)
此外:
在 Windows 服务器上,用户指定的文件名的过滤是很困难的,因为可用文件名的规则非常复杂。一个好的起点是只允许使用字母和数字,并添加自己的文件扩展名和前缀。(需要前缀来避免 Windows 保留的文件名和空文件名.)
更好的做法是将用户提供的文件名存储在数据库中,而不是直接使用它作为真实文件名。
有关文件上传安全问题的更多讨论,请参见此问题。
这是个绝对的雷区。以下是一些需要考虑的内容(并非详尽无遗,不做任何保证等):
您可以使用基础设施即服务来处理图像,例如我们的解决方案 - Uploadcare:
如果您对上传的图像应用任何图像操作,它将被修改,因此文件中嵌入的任何代码都将被破坏。
System.Drawing.Bitmap
。不幸的是,如果图像是JPEG,则重新保存会损失图像质量,因此如果您需要保留完全原始的图像,则这不是一个好的方法。 - bobince