将json天真解析为Python类或结构安全吗?

时间:2015-07-05 22:53:29

标签: python json datamapper

首先有一些背景知识:我有一些相当简单的数据结构,它们作为json文件保存在磁盘上。这些json文件在不同语言和不同环境的应用程序(如Web前端和数据操作工具)之间共享。

对于我想要创建Python“POPO”(普通旧Python对象)的每个文件,以及每个项目的相应数据映射器类应该实现一些简单的CRUD行为(例如,save将序列化类并存储为磁盘上的json文件)。

我认为一个简单的映射器(只知道基本类型)将起作用。但是,我担心安全问题。一些json文件将由Web前端生成,因此如果用户向我提供了一些不良的json,则可能存在安全风险。

最后,这是简单的映射代码(在How to convert JSON data into a Python object找到):

class User(object):
def __init__(self, name, username):
    self.name = name
    self.username = username

import json
j = json.loads(your_json)
u = User(**j)

您看到了哪些可能的安全问题?

注意:我是Python的新手。

编辑:感谢您的评论。我发现我有一个json,我有2个数组,每个都有一个地图。不幸的是,当我得到更多这些时,这开始变得很麻烦。

我正在将问题扩展到将json输入映射到recordtype。原始代码来自此处:https://stackoverflow.com/a/15882054/1708349。 因为我需要可变对象,所以我将其更改为使用namedlist而不是namedtuple:

import json
from namedlist import namedlist

data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'

# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: namedlist('X', d.keys())(*d.values()))
print x.name, x.hometown.name, x.hometown.id

它还安全吗?

1 个答案:

答案 0 :(得分:3)

在第一种情况下可能发生的错误并不多。您正在限制可以提供的参数,并且在从JSON加载后立即添加验证/转换很容易。

第二个例子有点糟糕。将东西打包成这样的记录对你没有任何帮助。您不继承任何方法,因为您定义的每个类型都是新的。您无法轻松比较值,因为dicts不是有序的。您不知道是否已处理所有参数,或者是否存在一些额外数据,这些数据可能会导致以后出现隐藏问题。

总而言之:使用User(**data),您会非常安全。 namedlist MainActivity存在歧义的空间,你并没有真正获得任何东西。 (与裸,解析的json相比)