Парус ORM: Как передать значение с массивом в параметре valuesToEscape

У меня есть rawQuery, который требует разделенную запятыми строку, но согласно документации здесь, второй аргумент должен быть массивом:

Массив динамических ненадежных строк для SQL-escape и внедрения внутри строки 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-инъекций.

1 ответ

Решение

Чтобы выполнить запрос напрямую, не используя режим ввода параметров, вам нужно удалить особые символы команды SQL, иначе, как вы сказали, вы будете подвержены атакам внедрения.

Есть пакеты, которые делают это для вас: наиболее популярными являются npm: sql-escape и npm sqlstring

Они добавят escape-символы к любому особенному символу в вашей строке:

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

var result = escape('my sweet "string"'); 
//result: 'my sweet \\"string\\"'
Другие вопросы по тегам