在 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" : "带双引号的文本" ""}
我正在执行一个函数来比较 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" : "带双引号的文本" ""}