首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止在PostgreSQL中进行批处理插入时的SQL注入?

如何防止在PostgreSQL中进行批处理插入时的SQL注入?
EN

Stack Overflow用户
提问于 2013-10-20 10:15:12
回答 2查看 1.4K关注 0票数 1

我有多达100个项目,我想插入一批操作。我是这样做的:

代码语言:javascript
复制
INSERT INTO MyTable (f1, f2, ..., fk) VALUES
  (v11, v12, ..., v1k),
  (v21, v22, ..., v2k),
  ...
  (vn1, vn2, ..., vnk)

一切都很好,但是我正在通过按原样连接值来构建这个字符串,这意味着我的代码容易受到SQL注入的影响。

一方面,如何继续使用批量插入语法,但又不受SQL注入的影响?

编辑1

我想提供一个更多的背景。我将要使用的实际SQL (此时编写代码)有以下形式:

代码语言:javascript
复制
WITH new_parent AS (
  INSERT into parent (g1, g2, ..., gm) VALUES (v1, v2, ..., vm) RETURNING id
) INSERT INTO MyTable (parent_id, f1, f2, ..., fk) VALUES
  (new_parent.id, v11, v12, ..., v1k),
  (new_parent.id, v21, v22, ..., v2k),
  ...
  (new_parent.id, vn1, vn2, ..., vnk)
EN

回答 2

Stack Overflow用户

发布于 2013-10-20 13:22:07

使用复制语句--如果可能的话。它有点快,需要的内存要少得多,而且它是SQL注入防弹的--因为数据使用的是不同的通道。

票数 1
EN

Stack Overflow用户

发布于 2021-01-28 08:31:19

您可以构建一个串联的参数字符串,而不是实际的值,然后用一个数组传递值,其中包括所有的值。例如:

代码语言:javascript
复制
    CREATE TYPE paramValues AS {
    "ID" integer,
    "V1" text
    .
    .
    .
    }
    
    CREATE OR REPLACE FUNCTION bulk(data paramValues[])
      RETURNS integer AS
    $BODY$
    DECLARE 
    
    BEGIN
        WITH new_parent AS (
          INSERT into parent (g1, g2, ..., gm) VALUES (v1, v2, ..., vm) RETURNING id
        ) INSERT INTO MyTable (parent_id, f1, f2, ..., fk) VALUES
          ($1, $2, $3, ..., $k),
          ($k+1, $k+2, $k+3, ..., $k+k),
          ...
          ($m, $m+1, $m+2, ..., $m+k);
        return 1;
    
    END$BODY$

    LANGUAGE 'plpgsql' VOLATILE;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19476208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档