首先有一些背景知识:我有一些相当简单的数据结构,它们作为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
它还安全吗?
答案 0 :(得分:3)
在第一种情况下可能发生的错误并不多。您正在限制可以提供的参数,并且在从JSON加载后立即添加验证/转换很容易。
第二个例子有点糟糕。将东西打包成这样的记录对你没有任何帮助。您不继承任何方法,因为您定义的每个类型都是新的。您无法轻松比较值,因为dicts不是有序的。您不知道是否已处理所有参数,或者是否存在一些额外数据,这些数据可能会导致以后出现隐藏问题。
总而言之:使用User(**data)
,您会非常安全。 namedlist
MainActivity
存在歧义的空间,你并没有真正获得任何东西。 (与裸,解析的json相比)