नहीं 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
. का उपयोग न करें ।