【问题标题】:Default/correct context for HTML href attributes in SightlySightly 中 HTML href 属性的默认/正确上下文
【发布时间】:2016-03-11 11:15:50
【问题描述】:

我正在使用 Sightly,在调查我的应用程序中的错误时,我注意到了一个我没有预料到的行为。

某些链接会在查询字符串中使用与符号进行两次转义。示例:

<a href="http://www.google.com?a=1&amp;amp;b=2&amp;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;amp;b=2&amp;amp;c=3">
    explicit attribute context
</a>

由于某种原因,最后一个使用 context='attribute'(唯一一个使用 &amp; 字符的函数)将 & 符号转义了两次,从而产生了无效链接。

这可以通过任意元素和属性名称来实现,所以我想我可以放心地假设这不是一些重写器。

<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;amp;b=2&amp;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>

但它未能转义 &amp; 字符,导致 HTML5 无效。

<a href="http://www.google.com?a=1&b=2&c=3">explicit uri context</a>

验证结果为 HTML5:

错误第 70 行,第 35 列: & 没有开始字符引用。 (& 可能应该被转义为 &。)

&lt;a href="http://www.google.com?a=1&amp;b=2&amp;c=3"&gt;explicit uri context&lt;/a&gt;

html 上下文正确地呈现在 href 属性中具有多个查询参数的链接

目前我可能在这里使用的唯一上下文是htmltext 转义 &amp; 两次,就像 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&amp;b=2&amp;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,升级会有帮助吗?
  • 不,行为没有改变。对于srchref 属性,Sightly 使用uri XSS 转义上下文[0]。
  • @RaduCotescu 我明白了。我将使用html 作为一个hack 让它现在可以工作,但我认为这需要更广泛的讨论。只要我有空,我就会在 Sling Jira 中提出一张票。
  • 我认为没有必要。我将发布您的问题的答案,因为评论字段不允许我写完整的内容。

标签: html aem sightly


【解决方案1】:

href 属性使用uri 上下文而不是attribute 上下文。 attribute 上下文用于 HTML 属性,例如 titleiddata-* 等...关于您的三个示例:

<a href="${'http://www.google.com?a=1&b=2&c=3'}">link without explicit context, expression used</a>
<a href="http://www.google.com?a=1&b=2&c=3">link without explicit context</a>
<a href="${'http://www.google.com?a=1&b=2&c=3' @ context='attribute'}">link with explicit attribute context</a>

第一个是使用uri 上下文。秒根本没有使用 Sightly。第三个是滥用attribute 上下文。

应尽可能避免使用 unsafe 上下文。

Sightly 目前并未如您所愿地在 uri 上下文中转义与符号。您应提交 Adob​​e Daycare 票证或联系 Apache Sling 分发列表,提出您的请求。

【讨论】:

    【解决方案2】:

    对于srchref 属性,Sightly 使用uri XSS 转义上下文12

    此外,使用来自3 的验证器,以下标记是 HTML5 有效的:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <a href="http://www.google.com?a=1&b=2&c=3">explicit uri context</a>
    </body>
    </html>
    

    能否请您指出有关为 HTML 属性转义的 HTML 5 查询字符串的规范?

    【讨论】:

    • 我没想到要质疑验证器。我正在使用我们自己的基础架构中部署的一个,以避免将我的客户的标记发送到安全网络之外。接得好。我会进一步调查。
    • 这是我们正在使用的验证器中的一个错误(我们已对其进行了更新)。再次感谢
    【解决方案3】:

    当一切都失败时,您可以使用“不安全”上下文。

    【讨论】:

    • attribute 可以达到我想要的效果,我完全没有必要求助于unsafe。我在询问呈现这种链接的规范方式,以及观察到的默认行为是正确的还是错误的。
    • 我认为这里没有任何规范。如果 'url' 不适合您,请使用任何有效的方法。
    • 我暂时就是这么干的。但我更愿意与比我更了解 Sightly 的人讨论这个问题,并考虑对这种方法进行改进,或者对 Sightly 本身进行改进。
    猜你喜欢
    • 2015-11-30
    • 2017-09-10
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2021-04-17
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多