gpt4 book ai didi

json - PostgreSQL:防止多插入时的 sql 注入(inject)

转载 作者:行者123 更新时间:2023-11-29 11:57:03 26 4
gpt4 key购买 nike

我正在寻找最快的方法来解析、验证和插入表中的数据(Postgresql 9.3)

数据是一个包含 1..N 项的 json 数组。

[{"name":"a","value":"1"},{"name":"b","value":"2"}]

表格看起来像:

CREATE TABLE logs
(
id serial NOT NULL,
name text ,
value text,
CONSTRAINT "log_Pkey" PRIMARY KEY (id)
);

为此我有存储过程:

CREATE OR REPLACE FUNCTION insert_logs(v json)
RETURNS integer AS
$BODY$
DECLARE
sql text;
i json;
logs_part_id int;
BEGIN
SELECT INTO logs_part_id id from another_table_with_that_id where some_condition.

sql = '';
FOR i IN SELECT * FROM json_array_elements(v)
LOOP
sql = sql||'insert into logs_'||logs_part_id ||'
(name, value)
values( ' ||quote_literal(i->>'name')||' , ' ||quote_literal(i->>'value')||' );';

END LOOP;
raise notice '%',sql;

EXECUTE sql;
return 1;

END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

(函数返回整数作为响应状态)

函数调用:

select * from insert_logs('[{"name":"a","value":"1"},{"name":"b","value":"2"}]'::json);

实际上,“insert..”语句相当大——要插入 15 列,显然应该检查其中的一些列以防止 sql 注入(inject)。

问题:有没有办法重写这个存储过程以提高性能?我应该使用准备好的语句吗?

编辑。

我构建 sql 字符串的原因是因为表分区导致表名未知。表名格式为:logs_id 其中 id - int 是在插入之前获得的。

最佳答案

如果您需要加快查询速度,json_populate_recordset()完全满足您的需求:

insert into logs
select * from json_populate_recordset(null::logs, '[...]')

对于 SQL 注入(inject):您应该始终使用准备好的语句,或者至少使用单独发送的参数执行您的 SQL(例如,如果您直接使用 libpq,则使用 PQexecParams())。

关于json - PostgreSQL:防止多插入时的 sql 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25969340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com