【发布时间】:2016-03-11 11:15:50
【问题描述】:
我正在使用 Sightly,在调查我的应用程序中的错误时,我注意到了一个我没有预料到的行为。
某些链接会在查询字符串中使用与符号进行两次转义。示例:
<a href="http://www.google.com?a=1&amp;b=2&amp;c=3">
link with explicit attribute context
</a>
经过仔细检查,我们发现我们有一个 org.apache.sling.rewriter.Transformer 实现在 AEM 中运行的所有 href 属性中转义特殊字符。
再加上 Sightly XSS 保护,这会导致双重转义。
在进一步调查此问题时,我禁用了转换器并注意到 Sightly 本身有一个奇怪的行为。
href属性中的属性上下文和默认上下文不匹配
鉴于以下三个元素,我希望它们以相同的方式呈现 href 值(查询字符串已转义,符合 W3C 标准)
<a href="${'http://www.google.com?a=1&b=2&c=3'}">no explicit context, expression used</a>
<a href="http://www.google.com?a=1&b=2&c=3">no explicit context</a>
<a href="${'http://www.google.com?a=1&b=2&c=3' @ context='attribute'}">
explicit attribute context
</a>
但是,只有最后一个执行转义,我得到了
<a href="http://www.google.com?a=1&b=2&c=3">no explicit context, expression used</a>
<a href="http://www.google.com?a=1&b=2&c=3">no explicit context</a>
<a href="http://www.google.com?a=1&amp;b=2&amp;c=3">
explicit attribute context
</a>
由于某种原因,最后一个使用 context='attribute'(唯一一个使用 & 字符的函数)将 & 符号转义了两次,从而产生了无效链接。
这可以通过任意元素和属性名称来实现,所以我想我可以放心地假设这不是一些重写器。
<stargate data-custom="${'http://www.google.com?a=1&b=2&c=3' @ context='attribute'}">
attribute context in custom tag
</stargate>
输出:
<stargate data-custom="http://www.google.com?a=1&amp;b=2&amp;c=3">
attribute context in custom tag
</stargate>
此外,Display Context Specification 给我的印象是,在呈现属性时,上下文会自动被拾取为attribute
为了防止跨站脚本 (XSS) 漏洞,Sightly 会自动识别输出字符串在最终 HTML 输出中显示的上下文,并适当地转义该字符串。
此处观察到的行为是否符合预期,或者我是否正在查看 Sightly 中的潜在错误?
我应该在这里使用哪个上下文?除了attribute 之外的所有上下文都忽略了查询字符串应该在href 中转义的事实。另一方面,attribute 似乎做了两次。发生了什么事?
我正在使用 Adobe Granite Sightly 模板引擎(兼容性)io.sightly.bundle 1.1.72
uri 上下文不会以 HTML5 href 属性中预期的方式转义查询字符串
我也尝试过使用
<a href="${'http://www.google.com?a=1&b=2&c=3' @ context='uri'}">explicit uri context</a>
但它未能转义 & 字符,导致 HTML5 无效。
<a href="http://www.google.com?a=1&b=2&c=3">explicit uri context</a>
验证结果为 HTML5:
错误第 70 行,第 35 列: & 没有开始字符引用。 (& 可能应该被转义为 &。)
<a href="http://www.google.com?a=1&b=2&c=3">explicit uri context</a>
html 上下文正确地呈现在 href 属性中具有多个查询参数的链接
目前我可能在这里使用的唯一上下文是html(text 转义 & 两次,就像 attribute)
<a href="${'http://www.google.com?a=1&b=2&c=3' @ context='html'}">explicit html context</a>
产量
<a href="http://www.google.com?a=1&b=2&c=3">explicit html context</a>
更改为该上下文将允许我在浏览器呈现的 href 中获得正确的值。但是,它似乎没有正确的语义。
引用the description of the html context from the Sightly spec:
如果您想输出 HTML,请使用此选项 - 删除可能包含 XSS 风险的标记
【问题讨论】:
-
您的系统上有什么版本的
org.apache.sling.scripting.sightly捆绑包?我怀疑版本是 1.0.2,但只是想确认一下。 -
@RaduCotescu 是正确的。我们正在使用 1.0.2,升级会有帮助吗?
-
不,行为没有改变。对于
src和href属性,Sightly 使用uriXSS 转义上下文[0]。 -
@RaduCotescu 我明白了。我将使用
html作为一个hack 让它现在可以工作,但我认为这需要更广泛的讨论。只要我有空,我就会在 Sling Jira 中提出一张票。 -
我认为没有必要。我将发布您的问题的答案,因为评论字段不允许我写完整的内容。