常见的 XSS 防御措施有哪些?

IT技术 javascript xss
2021-01-15 02:33:10

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

4个回答

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

  1. 指定字符集。首先,请确保您的网页在标题中或head元素的最开头指定了 UTF-8 字符集HTML 对所有输入进行编码,以防止Internet Explorer(和旧版本的 Firefox)中UTF-7 攻击,尽管有其他努力防止XSS。

  2. HTML 转义。请记住,您需要对所有用户输入进行 HTML 转义。这包括替换<&lt;>具有&gt;&具有&amp;"&quot;如果你将永远使用单引号的HTML属性,您需要更换'&#39;为好。典型的服务器端脚本语言(例如 PHP)提供了执行此操作的函数,我鼓励您通过创建标准函数来插入 HTML 元素而不是以特殊方式插入它们来扩展这些函数。

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

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

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

  6. 防止基于 DOM 的 XSS。不要在 JavaScript 生成的 HTML 代码中包含用户输入并将其插入到文档中。相反,使用正确的 DOM 方法来确保它被处理为文本,而不是 HTML。

显然,我无法涵盖攻击者可以插入 JavaScript 代码的每一种情况。一般来说,仅 HTTP cookie 可用于使 XSS 攻击更难一些(但绝不能阻止),并且对程序员进行安全培训是必不可少的。

@JonWatte 那东西可以防止 CRSF,而不是 XSS。这个问题是关于XSS的,请求伪造与XSS无关。
2021-03-13 02:33:10
我不明白这个答案是如何被评为最高的。它实际上并没有提到最重要的部分:使用适当的跨站点请求防伪安全令牌,并且不对 GET 做出任何修改。您可以在自己的网站上尽可能多地引用和转义;这不会阻止某些其他站点包含在您的站点上重复使用用户现有登录 cookie 的表单或恶意脚本。我认为指出这一点很重要,因为问题本身很混乱(主题说 XSS;问题说引用。)
2021-03-17 02:33:10

XSS 攻击有两种。一种是您的站点允许以某种方式注入 HTML。这并不难防御:要么转义所有用户输入数据,要么剥离所有 <> 标签并支持诸如 UBB 代码之类的东西。注意:URL 可能仍会让您面临滚动式攻击。

更隐蔽的情况是某些第三方站点包含 IFRAME、SCRIPT 或 IMG 标签或类似的东西,这些标签会访问您站点上的 URL,并且该 URL 将使用用户当前对您站点进行的任何身份验证。因此,您永远不应该对 GET 请求做出任何直接的响应。如果您收到一个尝试执行任何操作(更新个人资料、查看购物车等)的 GET 请求,那么您应该回复一个表单,该表单需要接受 POST。此表单还应包含跨站点请求伪造令牌,以便任何人都无法在设置为使用隐藏字段提交到您的站点的第三方站点上放置表单(再次,避免伪装攻击)。

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

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

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

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

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

需要明确的是,当您处理进入数据库的数据时,您是在谈论 SQL 注入,而不是跨站点脚本。此外,根据php.net/manual/en/function.mysql-escape-string.php,不推荐使用此函数(因为它忽略字符集,并且可能容易受到字符集编码过滤器规避技术的影响),因此 mysql_real_escape_string() 应该是用过的。当然,对于 PHP,还需要做更多的工作:php.net/manual/en/security.database.sql-injection.php
2021-04-04 02:33:10

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