Sightly中HTML href属性的默认/正确上下文

ton*_*edz 9 html5 aem sightly

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

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

<a href="http://www.google.com?a=1&amp;amp;b=2&amp;amp;c=3">
    link with explicit attribute context
</a>
Run Code Online (Sandbox Code Playgroud)

经过仔细检查,结果发现我们在AEM中运行的org.apache.sling.rewriter.Transformer所有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>
Run Code Online (Sandbox Code Playgroud)

但是,只有最后一个执行转义,我得到

<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>
Run Code Online (Sandbox Code Playgroud)

出于某种原因,最后一个,使用context='attribute'(唯一一个与&字符做某事的人)两次逃脱&符号,产生无效链接.

这可以通过任意元素和属性名称来实现,所以我想我可以放心地认为这不是一些重写者.

<stargate data-custom="${'http://www.google.com?a=1&b=2&c=3' @ context='attribute'}">
    attribute context in custom tag
</stargate>
Run Code Online (Sandbox Code Playgroud)

输出:

<stargate data-custom="http://www.google.com?a=1&amp;amp;b=2&amp;amp;c=3">
    attribute context in custom tag
</stargate>
Run Code Online (Sandbox Code Playgroud)

此外,显示上下文规范给我的印象是,在渲染属性时,上下文会自动被选中attribute

为了防止跨站点脚本(XSS)漏洞,Sightly自动识别输出字符串在最终HTML输出中显示的上下文,并适当地转义该字符串.

这里观察到的行为是预期的还是我在Sightly中查看潜在的错误?

我应该在这里使用哪种上下文?所有上下文除了attribute忽略查询字符串应该被转义的事实href.attribute另一方面,似乎这样做了两次.这是怎么回事?

我正在使用Adobe Granite Sightly Template Engine(兼容性)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>
Run Code Online (Sandbox Code Playgroud)

但它无法逃脱&角色,导致HTML5无效.

<a href="http://www.google.com?a=1&b=2&c=3">explicit uri context</a>
Run Code Online (Sandbox Code Playgroud)

验证结果为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>
Run Code Online (Sandbox Code Playgroud)

产量

<a href="http://www.google.com?a=1&amp;b=2&amp;c=3">explicit html context</a>
Run Code Online (Sandbox Code Playgroud)

更改为此上下文将允许我在浏览器呈现的href中获取正确的值.但是,它似乎没有正确的语义.

引用Sightly规范中对html上下文的描述:

如果要输出HTML,请使用此选项 - 删除可能包含XSS风险的标记

小智 2

对于srchref属性,Sightly 使用uriXSS 转义上下文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>
Run Code Online (Sandbox Code Playgroud)

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