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であるため、信頼性がありません 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を使用しないでください 。



    1. ストリームレプリケーションと論理レプリケーションの違い

    2. MySQLは2つの列を1つの列に結合します

    3. phpがpostgresqlで動作するようにするにはどうすればよいですか?

    4. 余分な行を取得する-左結合を使用して3つのテーブルを結合した後