是天真地解析一个JSON到一个Python类或结构安全吗?
首先有一些背景:我有一些相当简单的数据结构,它们作为json文件保存在磁盘上。 这些json文件在不同语言和不同环境的应用程序(如web前端和数据操作工具)之间共享。
对于我想创建一个Python“POPO”(Plain Old Python Object)的每个文件,每个项目的相应数据映射器类应该实现一些简单的类似于CRUD的行为(例如,保存将序列化类并存储为json文件磁盘)。
我认为一个简单的映射器(只知道基本类型)将起作用。 但是,我担心安全问题。 一些json文件将由web前端生成,所以如果用户给我一些不好的json,可能会带来安全风险。
最后,这里是简单的映射代码(在如何将JSON数据转换为Python对象中找到):
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输入映射到记录类型。 原始代码是从这里: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
它仍然安全吗?
在第一种情况下可能发生的错误并不多。 您限制可以提供什么参数,并且从JSON加载后很容易添加验证/转换。
第二个例子有点恶化。 将这些东西包装成这样的记录不会对你有任何帮助。 您不会继承任何方法,因为您定义的每种类型都是新的。 您无法轻松比较值,因为字符串没有排序。 您不知道是否处理了所有参数,或者是否存在一些额外的数据,这些数据可能会在稍后导致隐藏问题。
总之: User(**data)
,你很安全。 随着namedlist
有空间歧义,你并没有真正获得任何东西。 (与裸解析的json相比)
上一篇: Is parsing a json naively into a Python class or struct secure?
下一篇: Django manytomany field, how to get check for 80% subset/ match?