Django JSON 反序列化安全性

12
有没有Django的JSON反序列化器存在已知的安全漏洞?关于Python反序列化协议,普遍认为它们完全不安全,因此应避免解析不受信任的数据。
然而,我正在考虑一个分布式Web应用程序,在这个应用程序中,不同的服务器交换模型记录,格式为JSON。这些记录本身不包含敏感数据,但我担心被黑客攻击的服务器能够通过发送恶意格式的JSON来侵入其他服务器。这种情况可能吗?
我通常在公共面向的环境中看到Django的JSON序列化器,所以我希望它已经针对这种情况进行了加固,但我找不到任何有关安全问题的文档。

1
你是否启用了CSRF防护?这将在很大程度上确保安全。 - Platinum Azure
什么是“恶意格式化的JSON”? - Marcin
1
@Marcin,JSON 格式用于利用解析器中的某些漏洞,从而在服务器上执行任意指令。 - Cerin
@Marcin,我基本上是在问这样的东西是否存在。如果我有一个例子,我就不需要问了 :) - Cerin
1
@Marcin,很抱歉你没有理解我的问题,但是没有必要这么粗鲁。 - Cerin
显示剩余3条评论
2个回答

4
默认情况下,使用 Django 默认反序列化器 simplejson 时,可以从 JSON 转换为 Python 对象的对象类型是有限制的。唯一的例外是,如果您正在使用 loads()load() 方法的可选参数或自己的 JSONDecoder 对象进行某种专门的解码操作。因此,只要您使用默认解码,就很安全。但是,如果您真的关心安全问题,在实际处理数据之前应该验证已加载的 JSON 数据。

好的,这是一个非常好的、过于笼统的建议:"验证加载的JSON"——我用什么来验证它呢?正则表达式?检查大小是否小于X?Pickle从设计上来说是不安全的,因为它可以调用任意对象的构造函数,而JSON相当被动。然而,历史上有像这样的案例:http://www.kalzumeus.com/2013/01/31/what-the-rails-security-issue-means-for-your-startup/(实际上是因为使用了一个过于通用的解析器:不是JSON特定的)。我们不能完全放心地使用这样的解析器,除非进行非常严格的模糊测试。 - Tomasz Gandor

3

我不清楚你认为JSON有哪些可能是不安全(或安全)的问题。

JSON是一种基于文本的数据交换格式,没有任何内置安全机制。Django带有一些函数,用于将查询集序列化和反序列化为JSON。但这些函数不会是“恶意”的或“不安全”的 - 它们只是数据。

一些序列化协议,例如pickling,潜在地可能是不安全的,因为它们可以包含代码,所以有可能被反序列化运行损害您的系统。序列化的模型不会出现这个问题,因为它们不包含代码。

当然,如果您使用JSON(例如)传递要删除的模型ID列表,则存在恶意用户可能包含许多不应该被删除的ID的潜在风险。但这也不是JSON的问题 - 您需要确保您的业务逻辑正确确定用户被允许删除或修改哪些元素。


8
但如果解码器存在缺陷,即使是数据 也可能是恶意的。请注意,链接中的内容仅用于支持上述观点。 - Ignacio Vazquez-Abrams
@Ignacio,没错。许多仅读取数据的应用程序(例如图像查看器、音乐播放器等)偶尔也会出现这种漏洞。我不想自动认为Django是豁免的。 - Cerin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接