关于node.js:将自定义类型的数组从node-pg和SQL注入传递给postgres函数

Passing array of custom type to postgres function from node-pg and SQL injection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TYPE phototable AS (
    photoid INTEGER,
    parentid INTEGER,
    fileextension CHARACTER VARYING(20),
    description text,
    tag CHARACTER VARYING(100)
);

CREATE FUNCTION addphotos(
          p_placeid INTEGER
        , p_permissiontypeid INTEGER
        , p_description text DEFAULT NULL::text
        , p_photos phototable[] DEFAULT NULL::phototable[])

BEGIN
........
END

我正在通过生成SQL查询从node.js(使用node-postres)调用此函数。 我想避免这种情况,并希望使用参数化查询,因为我认为它对SQL注入攻击并不安全。 我找不到将自定义类型数组传递给node-postgres的查询方法的方法。 有没有一种方法可以将自定义类型数组传递给node-postgres的查询功能?

查询:

1
2
3
SELECT * FROM addphotos(p_placeid:=2210, p_permissiontypeid:=2, p_description:='Party',
p_photos:=array[ROW(NULL, NULL,'.JPG','smart','6e8f74b2-4c14-4f40-ae19-8abae026a539'),
ROW(NULL, NULL,'.JPG',NULL,'c4e9f75f-25fa-4893-82f1-44c4791d58e5')]::phototable[]);

我不熟悉node.js,但是您可以为列p_photos提供字符串文字,而不是ARRAYROW构造函数(这些函数需要在Postgres一侧执行!)。 您的查询如下所示:

1
2
3
4
5
6
7
SELECT * FROM addphotos(
    p_placeid := 2210
  , p_permissiontypeid := 2
  , p_description := 'Party'
  , p_photos:='{"(,,.JPG,smart,6e8f74b2-4c14-4f40-ae19-8abae026a539)"
               ,"(,,.JPG,,c4e9f75f-25fa-4893-82f1-44c4791d58e5)"}'
::phototable[]
    );

甚至应该在没有显式强制转换的情况下工作:

1
2
3
4
5
6
7
SELECT * FROM addphotos(
    p_placeid := 2210
  , p_permissiontypeid := 2
  , p_description := 'Party'
  , p_photos:='{"(,,.JPG,smart,6e8f74b2-4c14-4f40-ae19-8abae026a539)"
               ,"(,,.JPG,,c4e9f75f-25fa-4893-82f1-44c4791d58e5)"}'

    );

快速简单地将语法"重写"为字符串文字的方法:让Postgres做到这一点:

1
2
SELECT array[ROW(NULL, NULL,'.JPG','smart','6e8f74b2-4c14-4f40-ae19-8abae026a539'),
             ROW(NULL, NULL,'.JPG',NULL,'c4e9f75f-25fa-4893-82f1-44c4791d58e5')]::phototable[]

返回我上面使用的字符串表示形式: