PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Актуализиране на json поле в Postgres

Няма 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, просто се случва да оценява малко като него през повечето време. Не е безопасно, защото никога не знаете какво може да оценявате. В този случай сте до голяма степен защитени от json анализатора на PostgreSQL:

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. PostgreSQL:Има ли функция, която ще преобразува base-10 int в base-36 низ?

  2. Материализиран път на Postgres - Какви са ползите от използването на ltree?

  3. PostgreSQL математически функции

  4. Когато трябва да стартирате REINDEX в postgres

  5. Вложена заявка в squeel