【问题标题】:Django's escapejs filter and XSSDjango 的 escapejs 过滤器和 XSS
【发布时间】:2014-06-13 11:05:47
【问题描述】:

我希望能够使用 Django 的模板语言来模板化一些 JavaScript 变量。我的情况是这样的,其中foo 是用户定义数据的 Python 字符串(读取不受信任的数据),我想将其转换为 JavaScript 字符串。

<!doctype html>
<html>
    <head>
        <script>
            bar = '{{ foo|escapejs }}';        
        </script>
    </head>
    <body>
    </body>
</html>

如果我正确读取Django's documentation,则像这样使用escapejs 容易受到XSS 攻击。

我想到了一个使用 HTML5 的 data-* 属性的潜在解决方案。

<!doctype html>
<html>
    <head>
        <script>
            window.onload = function () {
                bar = document.getElementById('data').getAttribute('data-bar');
            };
        </script>
    </head>
    <body>
        <div id="data" style="display:none;" data-bar="{{ foo }}"></div>
    </body>
</html>

但是,我想知道是否有一种不那么繁琐/标准的方法。

【问题讨论】:

  • @weasel 这看起来像是在进行 HTML 转义,而不是在 OP 需要的 JavaScript 中使用的十六进制实体编码。
  • 我同意,矩形纠缠。这在文档中尚不清楚。也许 in 意味着直接在 HTML 中而不是在 JavaScript 中使用。 This post 建议 escapejs 是 JavaScript 编码的正确方法。

标签: javascript python django security xss


【解决方案1】:

escapejs 的输出 可以安全地在 JS-inside-HTML-text 或 JS-inside-HTML-quoted-attribute-value 的嵌套上下文中使用。在 JS-inside-HTML-unquoted-attribute-value 中使用它并不安全(但 escape 也不能用于未引用的 HTML 属性,所以无论如何都要引用)。

这没关系,因为它恰好将所有 HTML 特殊字符转义为 JavaScript 字符串文字 \u 转义不包含 HTML 特殊字符。请参阅django.utils.html 中的_base_js_escapes。它还将输出标记为“安全”,因此您希望这不是谎言。

鉴于您指出的文档,尚不清楚 supposed 是否可以,以及是否保证在未来的 Django 版本中保持可以。它可能只是想说这是对纯​​ HTML 的错误转义形式:虽然(在当前实现中)转义对于纯 HTML 是不安全的,但您肯定会得到错误的输出,其中包含不需要的反斜杠它。你觉得幸运吗?

我想到了一个使用 HTML5 的 data-* 属性的潜在解决方案。

在任何情况下我都会这样做。模板化成 JS 很容易出错,而使用内联 JS 有点混乱,并且会阻止您将来部署 Content-Security-Policy。

最好将所有页面数据放入 HTML 属性中,使用相同的已知良好的 HTML 自动转义,并让 JS 从 DOM 中检索它。当您想要包含结构化数据而不仅仅是字符串时,您当然可以对其进行 JSON 编码。

(虽然我不会为手动不可见的 div 烦恼...您可以将属性附加到 &lt;body&gt; 或任何其他与相关数据相关的元素。)

【讨论】:

  • 感谢您提供了很多可靠的信息,我将采用 data-* 方法。我是唯一一个审查代码的人,所以我认为最好谨慎行事。这只是代码的一小部分是必要的,所以尴尬并不是什么大不了的事。
  • 从 Django 2.1 开始,有一个新的模板过滤器可用,在这种情况下可能很有用:|jsonscript - 另见docs.djangoproject.com/en/dev/ref/templates/builtins/…
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多