2015-07-05 28 views
6

一些背景優先:我有一些相當簡單的數據結構,它們作爲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 

是否仍然安全嗎?

+0

我能想到的唯一問題是由於加載了無效數據而導致某些內容會中斷。 – poke

+3

JSON只能解析有限的類型,INT,BOOL等..沒有被執行,所以我沒有看到任何真正的安全風險 –

+0

我仍然會做從Web服務的輸入一些理智的檢查,特別是如果這些對象要打一個數據庫。也許像'name'限制爲100個可打印字符並且不允許一些標點符號(如分號)。看到這篇文章http://stackoverflow.com/questions/421046/what-are-all-of-the-allowable-characters-for-peoples-names –

回答

3

在第一種情況下可以發生的錯誤並不多。您限制可以提供什麼參數,並且從JSON加載後很容易添加驗證/轉換。

第二個例子有點惡化。將這些東西包裝成這樣的記錄不會以任何方式幫助你。您不會繼承任何方法,因爲您定義的每種類型都是新的。您無法輕鬆比較值,因爲字符串沒有排序。您不知道是否處理了所有參數,或者是否存在一些額外的數據,這些數據可能會在稍後導致隱藏問題。

總之:與User(**data),你很安全。與namedlist有歧義的空間,你並沒有真正獲得任何東西。 (與裸解析的json相比)