xss - 适用于 HTML 和 Javascript 的 Pyramid Chameleon 模板安全性

标签 xss pyramid chameleon zpt

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/

相关文章:

javascript - 对特定域使用 X-XSS-Protection?

angularjs - 避免对 Angular JS 的 XSS 攻击

python - 如何在 Ptah 中覆盖 HTTPForbidden?

python - 将 Pyramid 中多个 View 的渲染内容注入(inject)到一个基本模板中

python - 在模板中显示文本?

Java - XSS - HTML 编码 - 字符实体引用与数字实体引用

java - Autobean 和 XSS 问题

python - 如何从可调用 View 渲染 Jinja2 宏?

python - 更改默认响应内容类型的正确方法

python - 在 Pyramids/Python/SQLAlchemy 中引用相关对象