2015-07-05 11 views
6

कुछ पृष्ठभूमि पहले: मेरे पास कुछ सरल डेटा संरचनाएं हैं जो डिस्क पर जेसन फाइलों के रूप में जारी हैं। ये जेसन फाइलें विभिन्न भाषाओं और विभिन्न परिवेशों (जैसे वेब फ्रंटएंड और डेटा मैनिपुलेशन टूल्स) के अनुप्रयोगों के बीच साझा की जाती हैं।एक पायसन क्लास या स्ट्रक्चर में सुरक्षित रूप से एक जेसन पार्सिंग कर रहा है?

प्रत्येक फाइल के लिए मैं एक पायथन "पीओपीओ" (सादा पुराना पायथन ऑब्जेक्ट) बनाना चाहता हूं, और प्रत्येक आइटम के लिए एक संबंधित डेटा मैपर वर्ग को व्यवहार की तरह कुछ सरल सीआरयूडी लागू करना चाहिए (उदाहरण के लिए सहेजें कक्षा और स्टोर को क्रमबद्ध करेगा डिस्क पर जेसन फ़ाइल के रूप में)।

मुझे लगता है कि एक साधारण मैपर (जो केवल मूल प्रकारों के बारे में जानता है) काम करेगा। हालांकि, मैं सुरक्षा के बारे में चिंतित हूं। कुछ जेसन फाइलें वेब फ्रंटेंड द्वारा उत्पन्न की जाएंगी, इसलिए यदि कोई उपयोगकर्ता मुझे कुछ खराब जेसन खिलाता है तो एक संभावित सुरक्षा जोखिम।

class User(object): 
def __init__(self, name, username): 
    self.name = name 
    self.username = username 

import json 
j = json.loads(your_json) 
u = User(**j) 

क्या संभावित सुरक्षा समस्याओं आप देख पा रहे हैं:

अंत में, यहाँ सरल मानचित्रण कोड (How to convert JSON data into a Python object पर उपलब्ध हैं) है?

एनबी: मैं पाइथन के लिए नया हूं।

संपादित करें: आपकी टिप्पणियों के लिए धन्यवाद। मुझे पता चला है कि मेरे पास एक जेसन है जहां मेरे पास 2 सरणी हैं, प्रत्येक में नक्शा है। दुर्भाग्यवश ऐसा लगता है कि जब मैं इनमें से अधिक प्राप्त करता हूं तो यह बोझिल हो जाता है।

मैं एक रिकॉर्ड टाइप में एक जेसन इनपुट मैप करने के लिए सवाल बढ़ा रहा हूं। मूल कोड यहां से है: 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

जेसन केवल सीमित प्रकार, int, bool, आदि को पार्स कर सकता है .. कुछ भी निष्पादित नहीं किया जाएगा, इसलिए मुझे कोई वास्तविक सुरक्षा जोखिम नहीं दिख रहा है –

+0

मैं अभी भी वेब सेवा से इनपुट पर कुछ सैनिटी चेक करता हूं, खासकर यदि ये ऑब्जेक्ट्स हैं एक डेटाबेस हिट करने जा रहा है। हो सकता है कि कुछ नाम '100' से 100 प्रिंट करने योग्य पात्रों को सीमित करें और कुछ विराम चिह्न (जैसे अर्धविराम) की अनुमति न दें। इस पोस्ट को देखें http://stackoverflow.com/questions/421046/what-are-all-of-the-allowable-characters-for- लोग- नाम –

उत्तर

3

पहले मामले में ऐसा कोई भी गलत नहीं हो सकता है। आप सीमित हैं कि कौन से तर्क प्रदान किए जा सकते हैं और जेएसओएन से लोड होने के बाद सत्यापन/रूपांतरण को जोड़ना आसान है।

दूसरा उदाहरण थोड़ा खराब है। इस तरह के रिकॉर्ड में चीज़ों को पैक करना आपको किसी भी तरह से मदद नहीं करेगा। आप किसी भी तरीके का वारिस नहीं करते हैं, क्योंकि प्रत्येक प्रकार जिसे आप परिभाषित करते हैं वह नया है। आप आसानी से मूल्यों की तुलना नहीं कर सकते हैं, क्योंकि डिक्ट्स का आदेश नहीं दिया जाता है। आप नहीं जानते कि क्या आपके पास सभी तर्क हैं, या यदि कुछ अतिरिक्त डेटा है, जो बाद में छिपी हुई समस्याओं का कारण बन सकता है।

तो संक्षेप में: User(**data) के साथ, आप बहुत सुरक्षित हैं। namedlist के साथ अस्पष्टता के लिए जगह है और आपको वास्तव में कुछ भी हासिल नहीं होता है। (नंगे, पार्सड जेसन की तुलना में)

संबंधित मुद्दे