第 1 步:转义用户提供的输出
如果您想在用户提供的页面中包含数据,请转义输出。而且,在这个简化的列表中,我们将坚持使用一个简单的转义操作:HTML 编码任何 <、>、&、'、“。例如,PHP 提供了 htmlspecialchars() 函数来完成这个常见任务。
第 2 步:始终使用 XHTML
通读 OWASP 的 XSS 预防策略,很明显,如果您在 HTML 中使用不带引号的属性,则防止注入需要更多的努力。相反,在引用的属性中,转义数据变成了为标签内的内容转义数据所需的相同过程,我们在上面已经概述了转义操作。这是因为在引用属性的上下文中潜入具有结构意义的内容方面,唯一的麻烦制造者是结束引号。
显然,您的标记不必是 XHTML 以包含带引号的属性。但是,针对 XHTML 进行拍摄和验证可以很容易地测试是否所有的属性都被引用。
第 3 步:在 CSS 和 JavaScript 中只允许字母数字数据值
我们需要将您允许用户在页面的 CSS 和 Javascript 部分中输出的数据限制为字母数字类型(例如,像 [a-zA-Z0-9]+ 这样的正则表达式)类型,并确保它们用于它们真正代表价值的环境。在 Javascript 中,这意味着用户数据只能在分配给变量的带引号的字符串中输出(例如,var userId = “ALPHANUMERIC_USER_ID_HERE”;。)在 CSS 中,这意味着用户数据只能在属性值的上下文中输出(例如,p { color: #ALPHANUMERIC_USER_COLOR_HERE;}。)这可能看起来很苛刻,但是,嘿,这应该是一个简单的 XSS 教程
现在,需要明确的是,您应该始终验证用户数据以确保它符合您的期望,即使是在标签或属性中输出的数据,如前面的示例中所示。然而,这对于 CSS 和 JavaScript 区域尤其重要,因为可能的数据结构的复杂性使得防止 XSS 攻击变得极其困难。
您可能希望用户能够向您的 JavaScript 提供的公共数据,例如 Facebook、Youtube 和 Twitter ID,都可以在满足此限制的同时使用。而且,CSS 颜色属性和其他样式也可以集成。
第 4 步:URL 编码 URL 查询字符串参数
如果在链接查询字符串的 URL 参数中输出用户数据,请确保对数据进行 URL 编码。同样,以 PHP 为例,您可以简单地使用 urlencode() 函数。现在,让我们弄清楚这一点并通过几个例子来解决,因为我已经看到关于这个特定点的很多困惑。
必须进行 URL 编码
以下示例输出必须经过 URL 编码的用户数据,因为它用作查询字符串中的值。
http://site.com?id=USER_DATA_HERE_MUST_BE_URL_ENCODED”>
不得进行 URL 编码
以下示例为整个 URL 输出用户提供的数据。在这种情况下,应该使用标准转义函数(HTML 编码任何 <、>、&、'、“)对用户数据进行转义,而不是 URL 编码。此示例的 URL 编码将导致格式错误的链接。