node-mysql
Библиотека автоматически выполняет спасаясь при использовании , как вы уже делаете. См. Https://github.com/felixge/node-mysql#escaping-query-values
Возможно ли предотвратить инъекции SQL в Node.js (предпочтительно с помощью модуля) таким же образом, что у PHP были подготовленные заявления, защищенные от них.
Если да, то как? Если нет, то какие примеры могут обойти предоставленный мной код (см. Ниже).
Некоторые контексты:
Я создаю веб-приложение с фоновым стеком, состоящим из Node.js + MySql, используя // Prevent xss var clean_user = sanitizer . sanitize ( имя пользователя ); // предполагаем, что пароль hashed уже var post = { Имя пользователя : clean_user , Password : hash }; // Это просто использует connection.escape () под var query = connection . query ( «INSERT INTO users SET?» , post , function ( err , results ) { // Может ли инъекция Sql произойти здесь? }); Модуль rel = "noreferrer"> node-mysql . С точки зрения юзабилити, модуль замечательный, но он еще не реализовал что-то похожее на подготовленные заявления PHP(хотя я знаю, что он находится на todo ).
По моему мнению, реализация PHP готовых заявлений, среди прочего, значительно помогла предотвратить инъекции SQL. Однако я обеспокоен тем, что мое приложение node.js может быть открыто для подобных атак, даже при условии, что экранирование строки предоставляется по умолчанию (как в приведенном ниже фрагменте кода).
node-mysql, по-видимому, является самым популярным разъемом mysql для node.js, поэтому мне было интересно, что могут сделать другие люди (если они есть), чтобы учесть эту проблему - или если это даже проблема с node.js, чтобы начать с (не уверен, как этого не будет, так как вход пользователя / клиентской стороны задействован).
Должен ли я переключиться на node-mysql-native в настоящее время, поскольку он предоставляет подготовленные заявления? Я не решаюсь это сделать, потому что он не так активен, как node-mysql (хотя это может означать, что оно завершено).
Вот фрагмент кода регистрации пользователя, в котором используется модуль sanitizer , а также подготовленный синтаксис инструкции-node-mysql (который, как я уже упоминал выше, выполняет экранирование персонажа), для предотвращения межсайтового скриптинга и SQL-инъекций, соответственно:
node-mysql
javascript,mysql,node.js,sql-injection,node-mysql,
Некоторые контексты:
Я создаю веб-приложение с фоновым стеком, состоящим из Node.js + MySql, используя // Prevent xss var clean_user = sanitizer . sanitize ( имя пользователя ); // предполагаем, что пароль hashed уже var post = { Имя пользователя : clean_user , Password : hash }; // Это просто использует connection.escape () под var query = connection . query ( «INSERT INTO users SET?» , post , function ( err , results ) { // Может ли инъекция Sql произойти здесь? }); Модуль rel = "noreferrer"> node-mysql . С точки зрения юзабилити, модуль замечательный, но он еще не реализовал что-то похожее на подготовленные заявления PHP (хотя я знаю, что он находится на todo ).
По моему мнению, реализация PHP готовых заявлений, среди прочего, значительно помогла предотвратить инъекции SQL. Однако я обеспокоен тем, что мое приложение node.js может быть открыто для подобных атак, даже при условии, что экранирование строки предоставляется по умолчанию (как в приведенном ниже фрагменте кода).
node-mysql, по-видимому, является самым популярным разъемом mysql для node.js, поэтому мне было интересно, что могут сделать другие люди (если они есть), чтобы учесть эту проблему - или если это даже проблема с node.js, чтобы начать с (не уверен, как этого не будет, так как вход пользователя / клиентской стороны задействован).
Должен ли я переключиться на node-mysql-native в настоящее время, поскольку он предоставляет подготовленные заявления? Я не решаюсь это сделать, потому что он не так активен, как node-mysql (хотя это может означать, что оно завершено).
Вот фрагмент кода регистрации пользователя, в котором используется модуль sanitizer , а также подготовленный синтаксис инструкции-node-mysql (который, как я уже упоминал выше, выполняет экранирование персонажа), для предотвращения межсайтового скриптинга и SQL-инъекций, соответственно:
node-mysql
560
В библиотеке есть раздел в readme об экранировании. Это Javascript-native, поэтому я не предлагаю переключиться на node-mysql-native . В документации указаны эти рекомендации по экранированию:
Редактировать: node-mysql-native также является чистым решением Javascript.
true
/ false
строкиYYYY-mm-dd HH:ii:ss
строкиX'0fa5'
['a', 'b']
превращаются в'a', 'b'
[['a', 'b'], ['c', 'd']]
превращаются в('a', 'b'), ('c', 'd')
key = 'val'
пары. Вложенные объекты передаются в строки.undefined
/ null
преобразуются вNULL
NaN
/ Infinity
остаются как есть. MySQL не поддерживает их, и попытки вставить их в качестве значений вызовут ошибки MySQL до тех пор, пока они не будут реализованы.Это позволяет делать так:
var userId = 5;
var query = connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {
//query.sql returns SELECT * FROM users WHERE id = '5'
});
А также это:
var post = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
//query.sql returns INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'
});
Помимо этих функций вы также можете использовать функции escape:
connection.escape(query);
mysql.escape(query);
Чтобы избежать идентификаторов запросов:
mysql.escapeId(identifier);
И как ответ на ваш комментарий к подготовленным заявлениям:
С точки зрения юзабилити, модуль замечательный, но он еще не реализовал нечто похожее на подготовленные заявления PHP.
Подготовленные операторы находятся в списке дел для этого соединителя, но этот модуль по крайней мере позволяет вам указать пользовательские форматы, которые могут быть очень похожи на подготовленные операторы. Вот пример из readme:
connection.config.queryFormat = function (query, values) {
if (!values) return query;
return query.replace(/:(w+)/g, function (txt, key) {
if (values.hasOwnProperty(key)) {
return this.escape(values[key]);
}
return txt;
}.bind(this));
};
Это изменяет формат запроса для соединения, чтобы вы могли использовать такие запросы:
connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });
//equivalent to
connection.query("UPDATE posts SET title = " + mysql.escape("Hello MySQL");
Я понимаю, что это более старая должность, но кажется, что ответ не был отмечен, поэтому я выброшу это.
Что касается тестирования, если модуль, который вы используете, безопасен или нет, есть несколько маршрутов, которые вы можете предпринять. Я коснусь плюсов и минусов каждого, чтобы вы могли принять более обоснованное решение.
В настоящее время нет уязвимых мест для используемого модуля, однако это часто может привести к ложному пониманию безопасности, поскольку очень хорошо может быть уязвимость, в которой в настоящее время используется модуль / пакет программного обеспечения, который вы используете, и вы не будете предупреждены к проблеме, пока поставщик не применит исправление / исправление.
Чтобы быть в курсе уязвимостей, вам нужно будет следить за списками рассылки, форумами, IRC и другими обсуждениями, связанными с взломом. PRO: Вы часто можете узнать о потенциальных проблемах в библиотеке до того, как поставщик был предупрежден или выпустил исправление / исправление, чтобы исправить потенциальный аспект атаки на их программное обеспечение. CON: Это может быть очень трудоемким и ресурсоемким. Если вы поедете по этому маршруту, бот с помощью RSS-каналов, разбора журнала (журналы чатов IRC) и веб-скребок с использованием ключевых фраз (в данном случае node-mysql-native) и уведомлений может помочь сократить время, затрачиваемое на троллирование этих ресурсов.
Создайте fuzzer, используйте fuzzer или другую инфраструктуру уязвимости, такую ??как metasploit , sqlMap и т. Д., Чтобы помочь протестировать проблемы, которые поставщик, возможно, не искал. PRO: Это может оказаться верным методом пожарной безопасности на приемлемом уровне, независимо от того, безопасен ли модуль / программное обеспечение для открытого доступа. CON: Это также становится трудоемким и дорогостоящим. Другая проблема будет связана с ложными срабатываниями, а также необразованным обзором результатов, в которых проблема остается, но не замечена.
В действительности безопасность и безопасность приложений в целом могут быть очень трудоемкими и ресурсоемкими. Одна вещь, которую менеджеры всегда будут использовать, - это формула для определения экономической эффективности (рабочей силы, ресурсов, времени, оплаты и т. Д.) Выполнения двух вышеуказанных вариантов.
В любом случае, я понимаю, что это не ответ «да» или «нет», на который, возможно, надеялись, но я не думаю, что кто-то может дать это вам, пока они не проведут анализ данного программного обеспечения.
Я знаю, что этот вопрос старый, но для всех, кого интересует, Mysql-native устарел, поэтому он стал MySQL2 , это новый модуль, созданный с помощью команды исходного модуля MySQL. Этот модуль имеет больше возможностей, и я думаю, что он имеет то, что вы хотите, поскольку он подготовил операторы (using.execute ()), как в PHP, для большей безопасности.
Он также очень активен (последнее изменение было от 2 до 1 дня) Я не пробовал это раньше, но я думаю, что это то, что вы хотите и многое другое.