Chameleon 模板是否会转义/剥离变量的 XSS 和 HTML 标记?以下内容安全吗?
<script type="text/javascript">
var initialComments = ${comments};
for (var i = 0; i < initialComments.length; i++) {
initialComments[i].userId = initialComments[i].user_id;
}
var post = ${post}
// ...
</script>
最佳答案
这实际上比看起来更难,并且取决于具体情况。如果输出格式是 HTML,则脚本内容是特殊的 CDATA 部分,其中不解释 XML/SGML 转义符。如果输出格式为 XML,且内容类型为 XML,则转义将按预期工作。尽管可以修补 Chameleon 以使其理解 <script></script>
元素很特殊,但目前还没有。
何时 embedded in <script>
tag ,根据浏览器版本,唯一的 </
或</script
将结束脚本标签,使其容易受到 XSS 攻击。此外,<
可以开始 HTML 注释,如<!--
,并且遗留考虑要求 <script></script>
可以在脚本标记内平衡编写,因此最安全的是转义 <
完全包含在所有字符串中。
另一个问题是 JSON is not a strict subset of JavaScript ,如果您使用 ensure_ascii=False
,则允许像 U+2028 和 U+2029 这样的字符串破坏脚本。 :
因此,在 python/chameleon 上执行此操作的正确方法是嵌入 <script>
中HTML 中的标签是使用:
post_json = (json.dumps(foo, ensure_ascii=False)
.replace('\u2028', r'\u2028')
.replace('\u2029', r'\u2029')
.replace('<', r'\u003c'))
这仅适用于 <script>
中嵌入的内容标签。
或者,如果您只是想为几乎所有您可以满足的字符获得不可读的转义:
post_json = json.dumps(foo, ensure_ascii=True)\
.replace('<', r'\u003c')
然后嵌入
${structure: post_json}
我发布了feature request在 Python 错误跟踪器中有一个关键字参数来自动执行此操作,但它被拒绝了。
嵌入内容的更安全方法是将其存储在 data-*
中属性。
更新转义</
仅靠自己是不够的。
关于xss - 适用于 HTML 和 Javascript 的 Pyramid Chameleon 模板安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22960604/