在PostgreSQL中进行批量插入时如何防止SQL注入?

时间:2013-10-20 10:15:12

标签: postgresql sql-injection bulkinsert

我想在一次批量操作中插入多达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)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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;