Незащищенная конкатенация строк для генерации оператора SQL опасна, если введенное значение (например, «Mountain 21») является источником из неконтролируемого внешнего источника.Например, он вводится пользователем.
Рассмотрим простую конкатенацию строк следующим образом:
var adr = <something accepted from an external source>
var sql = `SELECT * FROM customers WHERE address = "${adr}"`;
Затем рассмотрим, что может произойти, если пользователь введет следующее в текстовое поле:
Mountain 21"; delete all from customers; //
Запрос будет выглядеть так: SELECT * FROM клиентов WHERE address = "Mountain 21";удалить все из клиентов;// "
Если бы вы запустили это, вы, вероятно, в конечном итоге не увидели бы клиентов в вашей таблице.
Я лично не знаком с работой функции node.js mysql.escape,но обычно такого рода функции "экранируют" специальные символы, поэтому они теряют свою "особенность". Например, он может поставить \ перед; удалить значение в качестве разделителя операторов.
Другойболее распространенный пример того, что обычно делает функция escape, - это преобразование фрагмента текста, такого как «O'Brien», в «O''Brien» (две одинарные кавычки - это способ указать одну кавычку в текстовой строке SQL).Запрос, использующий имя «O'Brien», будет выглядеть примерно так:
select *
from customers
where name = 'O''Brien';
Функция mySql.escape почти наверняка обеспечит необходимое преобразование «O'Brien» в «O''Brien»"чтобы он мог правильно выполняться в запросе SQL. Без экранирования последняя строка запроса будет иметь следующий вид:
where name = 'O'Brien';
, что приведет к синтаксической ошибке.
FWIW, Тон самый безопасный способ это использовать?заполнители в вашем запросе для пользовательских значений (например, адрес).Это немного сложнее, так как вам нужно подготовить запрос, указать все значения и затем выполнить его.Тем не менее, преимущество заключается в том, что это (должно быть?) Полностью неуязвимо для большинства, если не для всех, форм «инъекционной атаки».
Основной поток для параметризованного запроса в соответствии с вашим примером (в Java)'ish pseudocode - как я не знаю о возможностях node.js в этой области):
val sql = "SELECT * FROM customers WHERE address = ?";
val preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString (1, adr);
val resultSet = preparedStatement.executeQuery();
Большинство, если не все базы данных поддерживают параметризованные запросы, большинство языков предоставляют эту возможность, но не все предоставляют ее(или, по крайней мере, не легко).Опять же, я не уверен насчет node.js.
Надеюсь, это поможет вам.