【问题标题】:DOM XSS and Javascript EscapingDOM XSS 和 Javascript 转义
【发布时间】:2018-10-22 00:21:39
【问题描述】:

我正在浏览所有 OWASP 规则以防止基于 DOM 的 XSS,并尝试全面了解每条规则。我有点坚持这条规则:

“规则 #2 - 在执行上下文中将不受信任的数据插入 HTML 属性子上下文之前的 JavaScript 转义”

看这里:

https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet#RULE_.232_-_JavaScript_Escape_Before_Inserting_Untrusted_Data_into_HTML_Attribute_Subcontext_within_the_Execution_Context

问题是前端“javascript转义”时不知道用什么方法?我知道这不是一个很可能的用例,因为大多数前端开发人员通常会首先避免将不受信任的数据插入到 html 属性中,但尽管如此,我还是想通过准确理解这个规则来完全理解这个规则的含义逃生方法应该是。人们通常在前端使用一种简单的 javascript 转义方法吗?谢谢!


编辑:我在 stackoverflow 上找到的其他答案都提到了 html 转义符。我正在专门寻找一个 javascript 转义器,我想知道为什么 owasp 专门使用术语“javascript 转义器”,如果正如某些人所建议的那样,一个 html 转义器就足够了。

也许这个问题也可以表述为“在 OWASP 的 DOM Based XSS 备忘单的上下文中,html 转义和 javascript 转义有什么区别?请举一个 javascript 转义的例子。

【问题讨论】:

标签: javascript xss owasp


【解决方案1】:

所需的转义取决于插入值的上下文。使用错误的转义可能会允许在一个上下文中使用特殊字符,在不同的上下文中不是特殊字符,或者破坏值。

JavaScript 转义适用于通过服务器端模板语言直接插入 JavaScript 字符串文字的值。

所以他们的例子是:

x.setAttribute("value", '<%=Encoder.encodeForJS(companyName)%>');

在这里,companyName 的值被插入到脚本中,并用单引号括起来,使其成为 JavaScript 字符串文字。这里的特殊字符是引号、换行符和一些 unicode 空白字符。这些应转换为 JavaScript 转义序列。所以引号将变为\x27,而不是HTML 实体&amp;#x27;。如果您要使用 HTML 编码,那么引号字符将显示为 &amp;#x27;,而换行符将导致语法错误。 JavaScript 编码可以在 Java 中使用 encodeForJavaScript 完成,或者在 PHP 中使用 json_encode 完成。

它被插入到一个 JavaScript 值中,所以它应该是 JavaScript 编码的。人们习惯于 HTML 编码属性,但这仅在直接插入 HTML 时才有意义,而不是在使用 setAttribute DOM 方法时。所需的编码就像它一样:

var x = '<%=Encoder.encodeForJS(companyName)%>';

该属性不需要进行 HTML 编码,因为它不在 HTML 上下文中。将值直接插入到如下属性时需要 HTML 编码:

<input value='<%=Encoder.encodeForHTML(companyName)%>'>

【讨论】:

  • 您提到服务器端转义。对于客户端 javascript 转义,正则表达式会是什么样子。我只想知道客户端转义。谢谢!
  • @mags 如果您正在构建一个 HTML 字符串以传递给innerHTML,则需要客户端转义。所以它与 HTML 编码相同,但在客户端。您可以使用类似:github.com/janl/mustache.js/blob/master/mustache.js#L60 或使用客户端模板语言。
  • 我专门询问 javascript 转义。 OWASP 似乎确实为此目的创建了一个库,但对于客户端而言,它似乎非常大。我想知道它是否适用于节点应用程序。见这里:github.com/ESAPI/owasp-esapi-js/blob/master/src/org/owasp/esapi/…
  • \x27 等会转义,因此特殊字符会使用其数字代码给出。在客户端上执行此操作的原因之一是使用包含 JavaScript 的客户端模板。因此,您的 JavaScript 可以生成更多 JavaScript,但可能还有其他替代方法可以避免编码。
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2016-04-18
  • 1970-01-01
相关资源
最近更新 更多