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
相关产品推荐
相关产品推荐

