Javascript Django';s escapejs过滤器和XSS

Javascript Django';s escapejs过滤器和XSS,javascript,python,django,security,xss,Javascript,Python,Django,Security,Xss,我希望能够使用Django的模板语言模板一些JavaScript变量。我遇到的情况是这样的,foo是用户定义数据的Python字符串(读取不可信数据),我想将其转换为JavaScript字符串 <!doctype html> <html> <head> <script> bar = '{{ foo|escapejs }}'; </script> &l

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

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

但是,我想知道是否有一种不那么麻烦的/标准的方法来解决这个问题。

escapejs的输出可以安全地用于HTML文本中的JS或HTML引用属性值中的JS的嵌套上下文。在JS中使用HTML无引号属性值并不安全(但对于无引号的HTML属性,
escape
,也不安全,所以在任何情况下都要引用)

这是可以的,因为它碰巧将所有HTML特殊字符转义为JavaScript字符串literal
\u
转义,而这些转义不包含HTML特殊字符。请参见
django.utils.html
中的
\u base\u js\u转义。它还将输出标记为“安全”,因此您希望这不是谎言

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

我想到了一个使用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>
无论如何我都会这样做。模板化到JS中很容易出错,而使用内联JS有点混乱,这会阻止您将来部署内容安全策略

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


(不过我不需要手动不可见的div…您可以将属性附加到
或任何其他与相关数据连接的元素。)

标签是
{%autoescape%}
吗@weasel看起来像是在进行HTML转义,而不是十六进制实体编码,以用于OP要求的JavaScript。我同意,矩形。这在文件中并不清楚。也许in意味着直接在HTML中使用,而不是在JavaScript中使用。建议
escapejs
是为JavaScript编码的正确方法。感谢这些可靠的信息,我将采用
data-*
方法。我是唯一一个审查代码的人,所以我认为最好还是谨慎一点。这只是代码中的一小部分,需要这样做,所以这种尴尬并不是什么大不了的事情。自从Django 2.1以来,有一个新的模板过滤器可以在类似这样的情况下使用:
|jsonscript
-另请参见