在 psql 上转义引号以避免 SQL 注入

Escape quotes on psql to avoid SQLInjections

我正在执行一个函数来比较 JSON,然后仅在 table(触发器)上插入差异。 当 none 个寄存器带有引号时,该函数可以完美运行。所以我想知道如何转义这些可能出现的引号:

CREATE OR REPLACE FUNCTION public.fnc_compare_jsonb(old_reg jsonb, new_reg jsonb)
 RETURNS jsonb
 LANGUAGE plpgsql
 IMMUTABLE STRICT
AS $function$
declare
    keys record;
    jsonb_return jsonb = '{}'::jsonb;
begin
    for keys in
        select *
        from jsonb_object_keys()
    loop
        if  -> keys.jsonb_object_keys <>  -> keys.jsonb_object_keys then
            jsonb_return = jsonb_return || format('{"%s": "%s"}', keys.jsonb_object_keys,  ->> keys.jsonb_object_keys)::jsonb;
        end if;
    end loop;
    return jsonb_return;
end
$function$
;

在线发生错误:

jsonb_return = jsonb_return || format('{"%s": "%s"}', keys.jsonb_object_keys,  ->> keys.jsonb_object_keys)::jsonb;
SQL Error [22P02]: ERROR: invalid input syntax for type json
  Detail: Token "@" is invalid.
  Where: JSON data, line 1: {"email": "test2"@...
PL/pgSQL function ecidadao.fnc_compare_jsonb(jsonb,jsonb) line 11 at assignment

您的格式语句创建了一些文本,不是有效的 json。使用 json-function 这样做:

SELECT  json_build_object('foo'::text,'text with double quotes " "'::text);

结果:{"foo" : "带双引号的文本" ""}