代码之家  ›  专栏  ›  技术社区  ›  keyboardP

图片上传-安全问题

  •  11
  • keyboardP  · 技术社区  · 16 年前

    我正在开发一个ASP.NET Web应用程序,希望用户能够从本地系统上载一个图像,或将URL传递给图像。图像可以是JPG或PNG。我应该关心哪些安全问题?我见过在JPG文件中嵌入代码的各种方法。C#(或外部库)中是否有方法可以确认文件是JPG/PNG,否则会抛出错误?至少,我使目录,其中持有上传的图片不可浏览,并把最大大小限制为1mb,但我想实现进一步的检查。

    4 回复  |  直到 16 年前
        1
  •  14
  •   Community Mohan Dere    9 年前

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

    和 包含活动的HTML/脚本内容,供IE内容嗅探使用。或者还有一些坏的Java和Flash源策略需要担心,这可能会产生与编写脚本到服务器安全上下文中相同的效果。

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

    2. 如果你不能做到这一点,你最好的办法是缓解所有的内容注入问题是从一个不同的[子]域,它没有访问任何敏感凭据(cookies,基本身份验证)的主网站的图像。

    3. images.example.com ,您的主站点应该可以访问 只有 www.example.com 和 example.com . 否则,将内容注入 图片.example.com 可以访问的Cookie example.com网站 example.com网站 www.example.com 以防止不必要的饼干泄漏。

    4. X-Content-Type-Options: nosniff 以阻止IE8的内容走私攻击(对早期版本没有帮助,唉。)

    也:

    1. 正在清除用户指定的文件名 ,尤其是如果你的应用程序可能运行在Windows服务器上,而在Windows服务器上,关于可用文件名的规则确实很复杂。一个好的开始是只允许字母数字,并添加您自己的文件扩展名和前缀(必须使用前缀以避免使用Windows保留文件名和空文件名。)

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

    看到了吗 this question

        2
  •  5
  •   Tom Hawtin - tackline    16 年前

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

    • 检查文件是否利用了0天的缓冲区溢出是有点棘手的。它甚至可以利用无限循环来创建DoS。
    • 最好对图像重新编码。
    • 巨大的 因素。
        3
  •  4
  •   Ian Mercer    16 年前

    不要让用户决定将在服务器上使用的文件名。请改用[generated guid].jpg,如果需要,请将它们使用的文件名放在数据库表中。

    见#12: http://www.codinghorror.com/blog/2009/01/top-25-most-dangerous-programming-mistakes.html

    文件名或路径的外部控制 当你使用外人的 在构造文件名时输入, 结果路径可能指向外部 可以组合多个“.”或类似的 导致操作的顺序 系统导航出 受限目录。其他 与文件相关的攻击通过 作为符号链接,下面是 使应用程序读取或 修改攻击者无法修改的文件 你的程序正在运行 并且它接受文件名作为 输入。类似的规则也适用于url和 允许外人指定 任意URL。

        4
  •  0
  •   David Avsajanishvili    11 年前

    你可以用 基础设施即服务

    https://uploadcare.com

    如果你申请 image operations 对于上传的图像,它会被修改,因此任何可能嵌入到文件中的代码都会被销毁。

    推荐文章