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
であるため、信頼性がありません Pythonではありません。たまたまそれと同じように評価することがよくあります。何を評価しているのかわからないため、安全ではありません。この場合、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
を使用しないでください 。