【发布时间】: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>
但是,我想知道是否有一种不那么繁琐/标准的方法。
【问题讨论】:
-
{% autoescape %}标签? docs.djangoproject.com/en/dev/ref/templates/builtins/… -
@weasel 这看起来像是在进行 HTML 转义,而不是在 OP 需要的 JavaScript 中使用的十六进制实体编码。
-
我同意,矩形纠缠。这在文档中尚不清楚。也许 in 意味着直接在 HTML 中而不是在 JavaScript 中使用。 This post 建议
escapejs是 JavaScript 编码的正确方法。
标签: javascript python django security xss