一些背景優先:我有一些相當簡單的數據結構,它們作爲json文件保存在磁盤上。這些json文件在不同語言和不同環境的應用程序(如web前端和數據操作工具)之間共享。是天真地解析一個JSON到一個Python類或結構安全嗎?
對於每個文件,我想創建一個Python「POPO」(Plain Old Python Object),並且每個項目的相應數據映射類應該實現一些簡單的類似於CRUD的行爲(例如,保存將序列化類和存儲作爲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輸入映射到記錄類型。原始代碼是從這裏:https://stackoverflow.com/a/15882054/1708349。 因爲我需要可變對象,我會改變它,而不是使用一個namedtuple一個namedlist:
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
是否仍然安全嗎?
我能想到的唯一問題是由於加載了無效數據而導致某些內容會中斷。 – poke
JSON只能解析有限的類型,INT,BOOL等..沒有被執行,所以我沒有看到任何真正的安全風險 –
我仍然會做從Web服務的輸入一些理智的檢查,特別是如果這些對象要打一個數據庫。也許像'name'限制爲100個可打印字符並且不允許一些標點符號(如分號)。看到這篇文章http://stackoverflow.com/questions/421046/what-are-all-of-the-allowable-characters-for-peoples-names –