【发布时间】:2016-05-11 10:22:20
【问题描述】:
我想使用参数化查询将 array_prepend 调用到 json[] 中。我正在使用 pg-promise npm 包,但这使用的是普通的 node-postgres 适配器。
我的查询是:
db.query(`update ${schema}.chats set messages =
array_prepend('{"sender":"${sender}","tstamp":${lib.ustamp()},"body":$1}',messages) where chat_id = ${chat_id}`
, message));
与“$1”相同。
它适用于非参数化查询。
以上代码产生:
{ [错误:“hiya”处或附近的语法错误]
这样做的主要原因是避免 sql 注入(文档说它们在使用参数化查询时会充分转义)。
【问题讨论】:
-
1.确保升级到最新的 pg-promise; 2、将
${schema}替换为${schema~},生成正确的SQL名称。另见:SQL Names -
我认为有一个混淆。 ${schema} 和所有其他 ${vars} 不是来自用户输入,并且是 es6 模板。将查询更改为 $1~ 可解决该错误。您能否确认此查询现在仅添加 $1~ 即可抵抗 sql 注入?谢谢
-
您通过两次破坏格式得到了肯定的结果 - 第二个错误破坏了第一个错误,因此结果有效。你不应该使用这样的方法,它一直都是错误的。请参阅我在回答中提供的示例。
-
是的,你太快了 :)
-
关于 SQL 注入的问题。如果您使用标准变量注入查询值,而使用名称语法的 SQL 名称 - 正如我在回答中所展示的那样,那么您的所有字符串总是以引号结尾,并且您所有的 sql 名称都以双引号结尾,因此不可能在 SQL 注入的情况下改变查询。
标签: node.js postgresql node-postgres pg-promise