是否将json天真地解析为Python类或结构安全?

首先介绍一些背景:我有一些相当简单的数据结构,它们作为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

它还安全吗?

解决方法

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

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

总而言之:使用用户(**数据),你很安全.有了命名列表,就有了模棱两可的空间,你并没有真正获得任何东西. (与裸露的,解析过的json相比)

相关文章

什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据...
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:...
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面