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,但是您可以为列
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[] |
返回我上面使用的字符串表示形式: