javascript - Django 的 escapejs 过滤器和 XSS

标签 javascript python django security xss

我希望能够使用 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>

但是,我想知道是否有更简单/标准的方法来解决这个问题。

最佳答案

escapejs 的输出 在 JS-inside-HTML-text 或 JS-inside-HTML-quoted-attribute-value 的嵌套上下文中使用是安全的。在 JS-inside-HTML-unquoted-attribute-value 中使用它并不安全(但是 escape 也不会用于未加引号的 HTML 属性,所以在任何情况下都要引用)。

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

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

I've thought of a potential solution using HTML5's data-* attribute like this.

无论如何我都会这样做。模板化到 JS 中很容易出错,并且拥有内联 JS 有点困惑,并且会阻止您将来部署 Content-Security-Policy。

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

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

关于javascript - Django 的 escapejs 过滤器和 XSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23331988/

相关文章:

django admin - 访问 BaseInlineFormSet 中的 request.user

python - AttributeError: 'Settings' 对象没有属性 'ROOT_URLCONF'

javascript - 部署的 aurelia web 应用程序与在 gulp 上本地运行的应用程序有何不同

javascript - 如何在 Jquery 日历插件上设置选定日期

javascript - 可以在 Javascript 代码中使用 setter 和 getter 吗?

python - 使用预先定义的自定义函数覆盖函数内的函数

python - 终端中的嵌套 For 循环

javascript - HTML5 页面间本地存储

python - protobuf MessageToJson 删除值为 0 的字段

python - 如何从 Django 中的 sql 模式生成数据模型?