You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用node-pg调用PostgreSQL可变参数存储过程防注入问题

解决node-pg参数化调用PostgreSQL可变参数存储过程的问题

问题背景

使用node-pg连接PostgreSQL 11时,需要参数化调用一个定义了VARIADIC _events_array event_array[]参数的存储过程,原生调用方式为CALL schema.function(('1'),('2')),但参数化查询时需要避免SQL注入,同时满足存储过程对记录列表的接收要求。

解决方案

方式1:直接传递数组参数并使用VARIADIC关键字

在参数化查询中,将JavaScript数组作为参数传递,同时在调用语句中用VARIADIC关键字展开数组,匹配存储过程的可变参数定义:

// 构造符合event_array类型的记录数组
const eventList = [
  { metadata: 'meta_value_1', payload: 'payload_content_1' },
  { metadata: 'meta_value_2', payload: 'payload_content_2' }
];

// 参数化调用存储过程
await client.query(
  'CALL update_events_variadic(VARIADIC $1::event_array[]);',
  [eventList]
);

方式2:直接传递数组参数(无需VARIADIC)

由于存储过程的参数本身就是event_array[]类型,直接传入JavaScript数组即可,存储过程内部的unnest函数可以正常处理数组元素:

const eventList = [
  { metadata: 'meta_value_1', payload: 'payload_content_1' },
  { metadata: 'meta_value_2', payload: 'payload_content_2' }
];

await client.query(
  'CALL update_events_variadic($1::event_array[]);',
  [eventList]
);

关键注意事项

  • 确保JavaScript对象的结构与自定义复合类型event_array的字段完全匹配(即包含metadata和payload字段),node-pg会自动将其转换为PostgreSQL的复合类型元素。
  • 始终保持参数化查询的写法,绝对不要手动拼接SQL字符串,彻底避免SQL注入风险。

内容的提问来源于stack exchange,提问作者user973347

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:25:47