Default/correct Sightly 中 HTML href 属性的上下文
Default/correct context for HTML href attributes in Sightly
我正在使用 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
To protect against cross-site scripting (XSS) vulnerabilities, Sightly automatically recognises the context within which an output string is to be displayed within the final HTML output, and escapes that string appropriately.
此处观察到的行为是否符合预期,或者我是否正在查看 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:
Error Line 70, Column 35: & did not start a character reference. (& probably should have been escaped as &.)
<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:
Use this in case you want to output HTML - Removes markup that may contain XSS risks
只要其他一切都失败,您可以使用 'unsafe' 上下文。
href
属性使用 uri
上下文而不是 attribute
上下文。 attribute
上下文旨在用于 HTML 属性,例如 title
、id
、data-*
等...关于您的三个示例:
<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
上下文中的 & 符号。您应该提交 Adobe Daycare 票或联系 Apache Sling 分发列表并提出您的请求。
对于 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>
你能告诉我有关 HTML 5 个查询字符串转义为 HTML 属性的规范吗?
我正在使用 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
To protect against cross-site scripting (XSS) vulnerabilities, Sightly automatically recognises the context within which an output string is to be displayed within the final HTML output, and escapes that string appropriately.
此处观察到的行为是否符合预期,或者我是否正在查看 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:
Error Line 70, Column 35: & did not start a character reference. (& probably should have been escaped as &.)
<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:
Use this in case you want to output HTML - Removes markup that may contain XSS risks
只要其他一切都失败,您可以使用 'unsafe' 上下文。
href
属性使用 uri
上下文而不是 attribute
上下文。 attribute
上下文旨在用于 HTML 属性,例如 title
、id
、data-*
等...关于您的三个示例:
<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
上下文中的 & 符号。您应该提交 Adobe Daycare 票或联系 Apache Sling 分发列表并提出您的请求。
对于 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>
你能告诉我有关 HTML 5 个查询字符串转义为 HTML 属性的规范吗?