django 模板两次for循环_在Django模板中安全地包含JavaScript数据

news/2024/7/8 2:09:44

c131335285a387bbb2cd3b542ae314cd.png

Django模板通常用于将数据传递给JavaScript代码。不幸的是,如果实现的不正确的话,就可能会增加HTML注入的可能性,从而导致XSS(跨站点脚本)攻击。

这是我在Django项目中遇到的最常见的安全问题之一。事实上,我几乎在每一个大型Django项目上以这样或那样的形式见到过它。

此外,我这里不点名指责,但我也在很多社区资源中看到过它。这包括会议演讲、博客文章和Stack Overflow的回答。

这很难做好!由于只有Django 2.1添加了json_script模板标记来安全地实现这一点,所以这也是一个历史性难题。(有关这个问题的ticket已经被开启六年了!)

让我们看看这个问题,以及我们如何使用json_script修复它。

易受攻击的方式

让我们来看看这个视图:

d5df9481271e966616ad61f8e618ab73.png

…以及这个模板:

a8819fc79c2a3face247d71bc36bf833.png

不幸的是,正如我们所写的,该模板对HTML注入是开放的。这是因为如果数据中的任何地方包含,那么结果的其余部分都会被解析为额外的HTML。我们将此称为HTML注入,攻击者可以使用它向你的站点添加任意(恶意)内容。

如果mydata可以被第三方以任何方式控制,那么,比如用户的评论或API的返回数据都可能被攻击者尝试用来进行HTML注入。

假设get_mydata()返回了这个巧妙的字符串:

8bbf109bc430c9c6ee9f1d88f998d3c4.png

(我使用的是一个字符串,但这也适用于字典和列表,因为在JavaScript中它们也可以包含字符串。)

然后该模板将渲染为:

c5e5cc7329a86b36afe9d2095bb37dbe.png

浏览器首先仅通过HTML标记解析页面,而不检查其中的JavaScript。

所以它会认为第一个

安全的方式

使用Django避免这个漏洞的最佳方法是使用json_script模板标记。它会使用JSON脚本标记以防HTML注入的方式输出数据。

在我们的模板中,我们会像这样使用它:

b05360f533af0ccdadfffe47d5ef2e14.png

这会被渲染成这样:

9d044a9008f4aa3f6c8b0a35eeee9edc.png

这是一个

我们还需要更改我们的JavaScript以从该元素获取数据。改编自Django文档,最终结果将如下所示:

720b239329469e3a9318bb30c1282cfe.png

欢呼!

CSP进阶

更新(2020-02-19): 增加了这一部分,感谢James Bligh和Tom Grainger对我的帮助。

如果你想更安全,你可以更进一步,避免在你的模板中总是使用内联


http://www.niftyadmin.cn/n/1999968.html

相关文章

C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)

前言系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 呃 也有半个月没更新了. 本来这篇的Demo早就写完了,文章也构思好了.迟迟没发布..是因为实在太忙.. 项目要上线..各种 你们懂的.. 正赶上自…

url中能出现的字符_基础篇:一文读懂JAVA.IO、字符编码、URL和Spring.Resource

1 http://JAVA.IO字节流LineNumberInputStream和StringBufferInputStream官方建议不再使用,推荐使用LineNumberReader和StringReader代替ByteArrayInputStream和ByteArrayOutputStream 字节数组处理流,在内存中建立一个缓冲区作为流使用,从缓…

tcp服务端与客户端

//客户端&#xff1a; #include <iostream>#include <stdio.h>#include <windows.h> using namespace std; #pragma comment(lib, "WS2_32.lib") int main(){ WSADATA wsaData; WORD sockVersion MAKEWORD(2, 2); SOCKET sock 0; if (WSASta…

[译]JavaScript 让 Monad 更简单(软件编写)(第十一部分)

本文讲的是[译]JavaScript 让 Monad 更简单&#xff08;软件编写&#xff09;&#xff08;第十一部分&#xff09;&#xff0c;原文地址&#xff1a;JavaScript Monads Made Simple 原文作者&#xff1a; Eric Elliott 译文出自&#xff1a;掘金翻译计划 本文永久链接&#xff…

华为 虚拟键盘_抖音新玩法!隔空刷屏让华为Mate30 Pro风靡饭局与沙发

在华为Mate30 Pro发布之后&#xff0c;其“隔空操控”“侧屏触控”这些新鲜玩法马上勾起大家强烈的好奇心。当我拿到心爱的华为Mate30 Pro之后&#xff0c;马上对这些新功能进行了一番探索。隔空刷抖音&#xff0c;吃鸡也轻松“隔空操控”能带来怎样的美妙体验呢&#xff1f;比…

UDP服务器端和客户端

//客户端 #include <iostream>#include <stdio.h>#include <windows.h>#include <string.h> using namespace std; #pragma comment(lib, "WS2_32.lib") class CInitSock{public: CInitSock(int version01 2, int versiont02 2) { WO…

yum-plugin-priroites这个插件的一个文件。

yum源优先级的一个文件。是yum-plugin-priroites这个插件的一个文件。用来给yum源分优先级的。比如你在centos下有centos&#xff0c;epel&#xff0c;rpmfusion三个yum源。三个yum源中可能含有相同的软件&#xff0c;补丁之类的东西。yum管理器为了分辨更新系统或者安装软件的…

地图测量面积工具app_看地图吗?卫星地图哦

等高线地形图下载助手是一款可以查看地图地形的的软件&#xff0c;该软件功能非常强大&#xff0c;适用于各种测绘工作&#xff0c;并支持插件扩展&#xff0c;帮助其生成等高线、三维地形、高程剖面等&#xff0c;还可以帮您提取点、线、面坐标的高程数据&#xff0c;绘制圆和…