如何在PostgreSQL与Node.js中安全地向数组插入变量?
安全向PostgreSQL数组追加元素的正确参数化写法
你原来的写法直接把变量拼进SQL的数组字面量里,确实会面临SQL注入风险——要是有人构造恶意的newFriend值,很可能篡改你的SQL逻辑甚至破坏数据。
要实现安全的数组追加,有两种简单可靠的方式:
方法1:使用array_append函数
PostgreSQL自带专门的数组追加函数array_append,直接用它就能把单个元素安全加到数组末尾,参数化写法完全适配:
await pool.query(`UPDATE profiles SET friends = array_append(friends, $1)`, [newFriend]);
这个函数会自动处理元素的类型转换,不用你手动写'{"..."}'这种数组字符串,数据库会把$1当成纯值处理,彻底规避注入风险。
方法2:用数组拼接运算符||配合数组构造器
如果习惯用拼接运算符,需要把参数包装成单元素数组,用ARRAY[$1]构造:
await pool.query(`UPDATE profiles SET friends = friends || ARRAY[$1]`, [newFriend]);
这里ARRAY[$1]会把传入的newFriend转成单元素数组,再和原数组friends拼接,效果和追加一致,同样是安全的参数化写法。
你之前的写法失效,是因为||运算符要求两边都是数组类型,直接传单个值不符合语法要求,用上面两种方法就能解决问题。
内容的提问来源于stack exchange,提问作者Null Salad
相关产品推荐
相关产品推荐

