2

我有 rawQuery 需要逗号分隔的字符串,但根据这里的文档,第二个参数应该是一个数组:

一个动态的、不受信任的字符串数组,使用此模型数据库的适当模板语法进行 SQL 转义和注入 SQL 字符串。(如果您没有要注入的动态值,则只需在此处使用一个空数组。)

var rawQuery = 'SELECT * FROM "user" WHERE "user"."email" IN ($1)';
User.query(rawQuery, ['a@a.com', 'b@b.com'], function (err, rawResult) {
  if (err) { return res.serverError(err); }
    return res.ok(rawResult.rows);
});

如何在不通过数组传递变量的情况下使此查询工作?我可以像这样直接添加变量

var rawQuery = 'SELECT * FROM "user" WHERE "user"."email" IN (' + foo +')';

但它会容易受到 SQL 注入攻击。

4

1 回答 1

3

要直接运行查询而不使用参数注入模式,您需要删除SQL命令特殊字符,否则您将被修剪到注入攻击,如您所说。

有一些包可以为你做到这一点:最流行的是npm: sql-escapenpm sqlstring

他们会将转义字符添加到您的字符串中的任何特殊字符:

var escape = require('sql-escape');

var result = escape('my sweet "string"'); 
//result: 'my sweet \\"string\\"'
于 2017-02-03T12:50:44.983 回答