PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgres . में json फ़ील्ड अपडेट कर रहा है

नहीं eval आवश्यक है। आपकी समस्या यह है कि आप मान को json ऑब्जेक्ट के रूप में डिकोड नहीं कर रहे हैं।

CREATE OR REPLACE FUNCTION json_update(data json, key text, value json)
RETURNS json AS
$BODY$
   from json import loads, dumps
   if key is None: return data
   js = loads(data)
   # you must decode 'value' with loads too:
   js[key] = loads(value)
   return dumps(js)
$BODY$
LANGUAGE plpythonu VOLATILE;

postgres=# SELECT json_update('{"a":1}', 'a', '{"innerkey":"innervalue"}');
            json_update            
-----------------------------------
 {"a": {"innerkey": "innervalue"}}
(1 row)

इतना ही नहीं, बल्कि eval . का उपयोग करके json को डिकोड करने के लिए खतरनाक और अविश्वसनीय है। यह अविश्वसनीय है क्योंकि json पायथन नहीं है, यह सिर्फ थोड़ा सा मूल्यांकन करने के लिए होता है जैसे कि यह ज्यादातर समय होता है। यह असुरक्षित है क्योंकि आप कभी नहीं जानते कि आप क्या मूल्यांकन कर रहे हैं। इस मामले में आप बड़े पैमाने पर PostgreSQL के json पार्सर द्वारा सुरक्षित हैं:

postgres=# SELECT json_update(
postgres(#    '{"a":1}', 
postgres(#    'a', 
postgres(#    '__import__(''shutil'').rmtree(''/glad_this_is_not_just_root'')'
postgres(# );
ERROR:  invalid input syntax for type json
LINE 4:          '__import__(''shutil'').rmtree(''/glad_this_is_not_...
                 ^
DETAIL:  Token "__import__" is invalid.
CONTEXT:  JSON data, line 1: __import__...

... लेकिन मुझे आश्चर्य नहीं होगा अगर कोई eval . पर्ची कर सकता है अतीत का शोषण करें। तो यहां सबक:eval . का उपयोग न करें ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस ऑब्जेक्ट्स के बीच निर्भरता देखने के लिए आप अपने डेटाबेस कोड का दस्तावेजीकरण कैसे करते हैं?

  2. Postgresql तालिका में पंक्तियों की अधिकतम (प्रयोग योग्य) संख्या

  3. पोस्टग्रेज डंप को RDS में माइग्रेट करें

  4. पोस्टग्रेस्क्ल में दिनांक को पूर्णांक में बदलें

  5. एक्लिप्सलिंक जेपीए काउंट (*) के बजाय काउंट (आईडी) का उपयोग करके काउंट क्वेश्चन उत्पन्न करता है