Javascript Django';s escapejs过滤器和XSS
我希望能够使用Django的模板语言模板一些JavaScript变量。我遇到的情况是这样的,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
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
-另请参见