【问题标题】:What are the common defenses against XSS? [closed]针对 XSS 的常见防御措施有哪些? [关闭]
【发布时间】:2011-03-08 23:28:13
【问题描述】:

换句话说,如今净化输入和/或输出最常用的技术是什么?工业(甚至个人用途)网站中的人们用什么来解决这个问题?

【问题讨论】:

标签: javascript xss


【解决方案1】:

您应该参考优秀的OWASP website 以了解攻击(including XSS)和防御措施的摘要。这是我能想到的最简单的解释,实际上可能比他们的网页更具可读性(但可能远没有那么完整)。

  1. 指定一个字符集。首先,确保您的网页在标题或head 元素的最开头指定 UTF-8 字符集 HTML 编码所有输入防止在 Internet Explorer(和旧版本的 Firefox)中出现 UTF-7 attack,尽管采取了其他措施来防止 XSS。

  2. HTML 转义。 请记住,您需要对所有用户输入进行 HTML 转义。这包括将< 替换为<,将> 替换为>,将& 替换为&,将" 替换为"。如果您将使用单引号 HTML 属性,则还需要将 ' 替换为 '。典型的服务器端脚本语言 such as PHP 提供了执行此操作的函数,我鼓励您通过创建标准函数来插入 HTML 元素而不是以临时方式插入它们来扩展这些函数。

  3. 其他类型的转义。 但是,您仍然需要小心,切勿将用户输入插入为不带引号的属性或解释为 JavaScript 的属性(例如 onload 或 @987654339 @)。显然,这也适用于script 元素,除非输入正确地进行了 JavaScript 转义,这与 HTML 转义不同。另一种特殊类型的转义是 URL 参数的 URL 转义(在 HTML 转义之前进行,以便在链接中正确包含参数)。

  4. 验证 URL 和 CSS 值。 由于 javascript: URL 方案以及 CSS 样式表 URL,链接和图像的 URL(不基于批准的前缀进行验证)也是如此和style 属性中的数据。 (Internet Explorer 允许将 JavaScript 表达式作为 CSS 值插入,而 Firefox 的 XBL 支持同样存在问题。)如果您必须包含来自不受信任来源的 CSS 值,您应该安全且严格地验证或 CSS 转义它。

  5. 不允许用户提供的 HTML。 如果可以选择,请不要允许用户提供的 HTML。这是解决 XSS 问题的一种简单方法,基于简单的正则表达式替换为您自己的标记语言编写“解析器”也是如此。 I 仅当 HTML 输出由真正的解析器以明显安全的方式生成时才允许格式化文本,该解析器使用标准转义函数从输入中转义任何文本并单独构建 HTML 元素。如果您对此事别无选择,请使用验证器/清理器,例如 AntiSamy

  6. 防止基于 DOM 的 XSS。 不要将include user input in JavaScript-generated HTML code 插入到文档中。相反,使用正确的 DOM 方法来确保它被处理为文本,而不是 HTML。

显然,我无法涵盖攻击者可以插入 JavaScript 代码的每一种情况。一般来说,HTTP-only cookie 可用于使 XSS 攻击更加困难(但绝不阻止),为程序员提供安全培训是必不可少的。

【讨论】:

  • 我不明白这个答案是如何被评为最高的。它实际上并没有提到最重要的部分:使用适当的跨站点请求防伪安全令牌,并且不响应 GET 进行任何修改。您可以在自己的网站上随意引用和转义;这不会阻止某些其他站点包含在您的站点上重复使用用户现有登录 cookie 的表单或恶意脚本。我认为指出这一点很重要,因为问题本身很混乱(主题说 XSS;问题说引用。)
  • @JonWatte 可以防止 CRSF,而不是 XSS。本题是关于XSS的,请求伪造与XSS无关。
【解决方案2】:

XSS 攻击有两种。一种是您的网站允许以某种方式注入 HTML。这并不难防御:要么转义所有用户输入数据,要么剥离所有 标签并支持类似 UBB 代码的东西。注意:URL 仍可能使您面临 rick-rolling 类型的攻击。

更隐蔽的一种情况是,某些第三方网站包含 IFRAME、SCRIPT 或 IMG 标记或类似内容,这些标记会点击您网站上的 URL,并且该 URL 将使用用户当前对您的网站拥有的任何身份验证。因此,您永远不应该采取任何直接行动来响应 GET 请求。如果您收到一个尝试做任何事情的 GET 请求(更新个人资料、查看购物车等),那么您应该使用一个需要接受 POST 的表单来响应。此表单还应包含跨站点请求伪造令牌,这样任何人都无法在第三方站点上放置表单,该表单设置为使用隐藏字段提交到您的站点(同样,以避免伪装攻击)。

【讨论】:

    【解决方案3】:

    您的代码中只有两个主要区域需要正确处理以避免 xss 问题。

    1. 在查询中使用任何用户输入值之前,请在数据上使用 mysql_escape_string 等数据库辅助函数,然后在查询中使用它。它将保证 xss 的安全性。

    2. 在将用户输入值显示回表单输入字段之前,将它们传递给 htmlspecialchars 或 htmlentities。这会将所有容易出现 xss 的值转换为浏览器可以显示而不会受到影响的字符。

    完成上述操作后,您就可以免受 95% 以上的 xss 攻击。然后,您可以继续学习安全网站的高级技术,并在您的网站上应用额外的安全措施。

    大多数框架所做的是,它们不鼓励您直接编写 html 表单代码或以字符串形式进行查询,以便使用框架辅助函数您的代码保持干净,而任何严重的问题都可以通过更新一个或框架中的两行代码。您可以简单地编写一个带有常用功能的自己的小库,然后在所有项目中重用它们。

    【讨论】:

    【解决方案4】:

    如果您使用 .NET 进行开发,避免 XSS 的最有效方法之一是使用 Microsoft AntiXSS Library。这是清理输入内容的一种非常有效的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多