我正在使用Sightly,在调查我的应用程序中的一个错误时,我注意到了一个我没想到的行为.
某些链接会在查询字符串中使用&符号进行两次转义.例:
<a href="http://www.google.com?a=1&amp;b=2&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
相同的方式呈现值(查询字符串被转义,符合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;b=2&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;b=2&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
我也尝试过使用
<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
(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&b=2&c=3">explicit html context</a>
Run Code Online (Sandbox Code Playgroud)
更改为此上下文将允许我在浏览器呈现的href中获取正确的值.但是,它似乎没有正确的语义.
如果要输出HTML,请使用此选项 - 删除可能包含XSS风险的标记
小智 2
对于src
和href
属性,Sightly 使用uri
XSS 转义上下文1、2。
此外,使用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 属性的规范吗?
归档时间: |
|
查看次数: |
4889 次 |
最近记录: |