1

我最多有 100 个项目要在一个批处理操作中插入。我这样做是这样的:

INSERT INTO MyTable (f1, f2, ..., fk) VALUES
  (v11, v12, ..., v1k),
  (v21, v22, ..., v2k),
  ...
  (vn1, vn2, ..., vnk)

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

一方面,我怎样才能继续使用批量插入语法,同时又免受 SQL 注入的影响?

编辑 1

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

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)
4

2 回答 2

1

使用 COPY 语句 - 如果可能的话。它更快一点,需要更少的内存,并且它是 SQL 注入防弹 - 因为数据使用不同的通道。

于 2013-10-20T13:22:07.987 回答
0

您可以构建串联的参数字符串而不是实际值,然后使用单个数组传递值,其中包含正确顺序的所有值。例如:

    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;
    
于 2021-01-28T08:31:19.720 回答