gpt4 book ai didi

javascript - Django 的 escapejs 过滤器和 XSS

转载 作者:太空狗 更新时间:2023-10-30 02:45:46 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com