Можно ли предотвратить инъекции SQL в Node.js (желательно с помощью модуля) таким же образом, что у PHP были подготовленные заявления, защищенные от них.Предотвращение SQL-инъекции в Node.js
Если да, то как? Если нет, какие примеры, которые могут обойти предоставленный мной код (см. Ниже).
Некоторый Контекст:
Я делаю веб-приложение с фоновым стеком, состоящим из Node.js + MySql с помощью node-mysql модуля. С точки зрения юзабилити, модуль замечательный, но он еще не реализовал что-то похожее на PHP Prepared Statements (хотя я знаю, что он находится на todo).
С моей точки зрения, реализация PHP готовых заявлений, среди прочего, helped greatly в предотвращении инъекций SQL. Я обеспокоен тем, что приложение node.js может быть открыто для подобных атак, even with the string escaping provided by default (как в приведенном ниже фрагменте кода).
node-mysql, по-видимому, самый популярный соединитель mysql для node.js, поэтому мне было интересно, что могут сделать другие люди (если есть), чтобы учесть эту проблему - или это даже проблема с узлом. js для начала (не уверен, как этого не будет, так как вход пользователя/клиентской стороны задействован).
Должно ли я переключиться на node-mysql-native в настоящее время, поскольку он предоставляет подготовленные заявления? Я не решаюсь это сделать, потому что он, похоже, не так активен, как node-mysql (хотя это может означать, что оно завершено).
Ниже приведен фрагмент кода регистрации пользователя, который использует модуль sanitizer, а также подготовленный оператор-подобный синтаксис node-mysql (который, как я уже упоминал выше, выполняет экранирование персонажа), чтобы предотвратить межсайтовый скриптинг и SQL-инъекции соответственно:
// Prevent xss
var clean_user = sanitizer.sanitize(username);
// assume password is hashed already
var post = {Username: clean_user, Password: hash};
// This just uses connection.escape() underneath
var query = connection.query('INSERT INTO users SET ?', post,
function(err, results)
{
// Can a Sql injection happen here?
});
Как я упоминал в своем сообщении, я знаю, что библиотека ускользает от символов, но меня больше беспокоят последствия безопасности, если я не переключусь на библиотеку, в которой реализованы подготовленные операторы, т.е. есть ли SQL-инъекция, которая может происходят с тем, что я сейчас делаю? – funseiki
Экранирование символов предотвращает SQL-инъекцию. Инъекции возникают, когда символы не экранируются, а злоумышленники могут использовать это для закрытия запроса и запуска нового, например, для удаления таблицы или вставки поддельной записи. С экранированными символами это невозможно. [Wikipedia] (http://en.wikipedia.org/wiki/SQL_injection) содержит дополнительную информацию о SQL Injection. –
Но предотвращает ли это все инъекции SQL? [Этот ответ] (http://stackoverflow.com/a/12118602/865883) предлагает не (по крайней мере, для PHP + MySQL), и подразумевает, что это подготовленные заявления PHP. Опять же, это в контексте PHP. – funseiki