- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我希望能够使用 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_escapes
在 django.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/
我正在尝试使用 simplejson.dumps 将 Python 数组编码为 json: In [30]: s1 = ['test', ''] In [31]: simplejson.dumps(s
我希望能够使用 Django 的模板语言来模板化一些 JavaScript 变量。我遇到的情况是这样的,其中 foo 是用户定义数据的 Python 字符串(读取不受信任的数据),我想将其转换为 Ja
我是一名优秀的程序员,十分优秀!