我正在努力寻找美元参数的正确语法。有时有效,有时无效。
我正在使用 NodeJS 的“pg”包,但由于据我所知解析查询发生在服务器端,所以我认为这并不重要。
代码:
const client: PoolClient = ...;
await client.query('SELECT \'foo\' = $1', [projectId]);
await client.query('SET "gvc.currentProjectId" = $1', [projectId]);
第一个查询显然没用,但我添加它是为了尝试语法。第二个查询中出现错误,因此第一个查询似乎有效。第二个失败了:
unexpected exception error: syntax error at or near "$1"
是否可以在 SET 的值中使用美元参数?我想保护我的应用程序免受 SQL 注入攻击,因此手动转义 projectId 是最后的手段。
正如https://dba.stackexchange.com/a/333947中所解释的,SET确实只能采用文字值,没有参数或查询结果。该帖子链接到 set_config 命令,该命令没有这样的限制。
https://pgpedia.info/s/set_config.html
帖子和文档都没有解释为什么两者都存在,也没有解释为什么 SET 不能接受参数,因为 set_config 表明可以这样做。
只需使用 set_config 而不是 SET 即可解决问题。