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

ben*_*ist 7 python json datamapper

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

对于我想要创建Python"POPO"(普通旧Python对象)的每个文件,以及每个项目的相应数据映射器类应该实现一些简单的CRUD行为(例如,save将序列化类并存储为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)
Run Code Online (Sandbox Code Playgroud)

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

注意:我是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
Run Code Online (Sandbox Code Playgroud)

它还安全吗?

vir*_*tor 3

第一种情况不会发生太大的错误。您限制了可以提供的参数,并且在从 JSON 加载后可以轻松添加验证/转换。

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

总而言之:有了User(**data),你就非常安全了。如果namedlist有歧义的空间,你就不会真正获得任何东西。(与裸的、已解析的 json 相比)