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

Node.js中PostgreSQL查询如何防SQL注入?IN参数绑定失败如何解决?

问题原因

你将拼接好的(1,2)整体作为单个字符串参数传入时,数据库会将其识别为一个独立的字符串值,最终执行的SQL等价于WHERE id IN ('(1,2)'),和你预期的id IN (1,2)逻辑完全不同,所以查询无法生效。

修复方案

首先你需要把原来的拼接格式字符串'(1,2)'处理为纯数字数组:

const rawIdStr = '(1,2)';
// 去掉括号后拆分转成数字数组
const idList = rawIdStr.replace(/[()]/g, '').split(',').map(Number);

之后选以下任意一种参数化写法即可:

方案1:动态生成占位符(通用兼容性最高)

根据ID数组的长度动态生成对应数量的参数占位符,再传入数组执行:

// 长度为2的数组生成 "$1,$2",长度为3生成 "$1,$2,$3",以此类推
const placeholders = idList.map((_, idx) => `$${idx + 1}`).join(',');
const query = `SELECT * FROM glacier_restore_progress WHERE id IN (${placeholders})`;
const dbResponse = await pool.query(query, idList);

方案2:使用PostgreSQL的ANY语法(更简洁)

如果你的pg驱动支持数组参数,可以直接用ANY语法,不需要动态拼接占位符:

const dbResponse = await pool.query(
  'SELECT * FROM glacier_restore_progress WHERE id = ANY($1::int[])',
  [idList]
);

两种写法都完全避免了SQL注入风险,也能正常执行查询逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:54:08