【问题标题】:Escape quotes on psql to avoid SQLInjections在 psql 上转义引号以避免 SQL 注入
【发布时间】:2022-01-17 19:03:35
【问题描述】:

我正在做一个函数来比较 JSON,然后只在表(触发器)上插入差异。 当没有任何寄存器带有引号时,该功能可以完美运行。所以我想知道如何逃避这些可能出现的引用:

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($1)
    loop
        if $1 -> keys.jsonb_object_keys <> $2 -> keys.jsonb_object_keys then
            jsonb_return = jsonb_return || format('{"%s": "%s"}', keys.jsonb_object_keys, $2 ->> 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, $2 ->> 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 postgresql escaping plpgsql


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多