图像上传 - 安全问题

key*_*rdP 12 c# asp.net security image image-uploading

我正在开发一个ASP.NET Web应用程序,并希望用户能够从本地系统上传图像,或者将URL传递给图像.图像可以是JPG或PNG.这样做我应该关注哪些安全问题?我已经看到了在JPG文件中嵌入代码的各种方法.C#(或外部库)中是否有任何方法可以确认文件是JPG/PNG,否则会抛出错误?至少,我正在制作保存上传图像不可浏览的目录,并将最大大小限制为1mb,但我想实施进一步的检查.

谢谢你的建议.

bob*_*nce 12

C#(或外部库)中是否有任何方法可以确认文件是JPG/PNG,否则会抛出错误?

也许吧,但这本身并没有多大帮助.您可以轻松制作既是有效图像格式包含IE内容的活动HTML /脚本内容的文件 - 嗅探绊倒.或者需要担心破坏的Java和Flash原始策略,这可能与脚本进入服务器的安全上下文具有相同的效果.

  1. 如果您处理图像(例如,裁剪,调整大小)并重新保存,则会非常非常难以进行内容走私攻击.但是,您应始终确保服务器端工具是最新的,因为图像处理库中的漏洞可能会使您面临服务器端漏洞利用.

  2. 如果你不能这样做,最好的办法是减轻所有内容注入问题,以便从不能访问任何敏感凭据的不同[sub]域提供图像(cookies,基本身份验证)主要网站.

  3. 如果为此目的使用子域,例如images.example.com,您的主站点只能通过www.example.com不是 可访问example.com.否则,注入的内容images.example.com可以访问example.comIE中的cookie .example.com应该301重定向以www.example.com防止不必要的cookie泄漏.

  4. 将标头添加X-Content-Type-Options: nosniff到响应中以阻止来自IE8的内容走私攻击.(对早期版本没有帮助,唉.)

也:

  1. 清理用户指定的文件名很难,特别是如果您的应用程序可能在Windows服务器上运行,其中有关可用文件名的规则确实很复杂.一个好的起点是只允许使用字母数字,并添加自己的文件扩展名和前缀.(必须使用前缀来避免Windows保留的文件名和空文件名.)

  2. 更好:将用户提供的文件名存储在数据库中,而不是将其用作真实文件名.

有关文件上载安全性问题的更多讨论,请参阅问题.


Tom*_*ine 5

这是绝对的雷区。需要考虑的事情(不一定是详尽的清单,没有保证等)。

  • 有些人使用正则表达式进行解析,因此无法知道文件是否包含代码。ZIP 文件的目录在末尾。Sun/Oracle Java PlugIn/WebStart 现在检查文件是否以 ZIP 本地标头/条目幻数开头,以避免“GIFAR”攻击。
  • 从不同的域提供服务,以避免同源问题。
  • 从不同的 IP 地址提供服务,以避免同源问题。
  • 检查文件是否正在利用(例如 0 天缓冲区溢出)有点棘手。它甚至可能利用无限循环来创建 DoS。
  • 最好重新编码图像。
  • 小心 URL/文件路径名。如果您提供一个选项,请使用白名单检查。特别是 NUL 字符是“有趣的”。另请参见目录遍历攻击。一般来说,能够将给定内容的文件放置在已知位置至少是一个很大的问题。
  • 或者您可能想要检查尺寸是否合理的图像。解压缩一个巨大的图像很可能会导致 DoS。另请注意,压缩算法通常允许通过大量因素压缩琐碎数据。