将自定义类型传递给Postgres函数从Node-PG和SQL注入[英] Passing array of custom type to postgres function from node-pg and SQL injection

本文是小编为大家收集整理的关于将自定义类型传递给Postgres函数从Node-PG和SQL注入的处理方法,想解了将自定义类型传递给Postgres函数从Node-PG和SQL注入的问题怎么解决?将自定义类型传递给Postgres函数从Node-PG和SQL注入问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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(使用节点postres)调用此函数.我想避免它并希望使用参数化查询,因为我认为它无法防止SQL注入攻击.我无法找到一种方法来将自定义类型数组传递给节点postgres的查询方法.有没有办法将自定义类型数组传递给节点Postgres的查询功能?

查询:

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而不是ARRAY和ROW构造函数提供字符串文字(这是函数需要在Postgres侧执行!).您的查询将如下所示:

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[]
    );

甚至应该在没有显式演员的情况下工作:

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执行以下操作:

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

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

本文地址:https://www.itbaoku.cn/post/1764195.html