Насколько безопасны «Экранирующие значения запроса» в SQL? (Или почему это опасно?) [SQL инъекция] - PullRequest
0 голосов
/ 29 апреля 2019

Я слежу за Node.js с примерами sql на W3schools. здесь

В нем говорится, что следующий код предотвращает SQL-инъекции.

var adr = 'Mountain 21';
var sql = 'SELECT * FROM customers WHERE address = ' + mysql.escape(adr);
con.query(sql, function (err, result) {
if (err) throw err;
console.log(result);
});

Когда значения запроса являются переменными, предоставленными пользователем, вы должны избегать значений. Это необходимо для предотвращения SQL-инъекций, которые являются распространенным методом веб-хакерства для уничтожения или неправильного использования вашей базы данных.

Это было объяснение.

Я хочу понять, насколько это безопасно.(как это предотвращает инъекции SQL).

Кроме того, насколько опасен следующий код?
var sql = 'SELECT * FROM customers WHERE address = "Mountain 21"';

Ответы [ 2 ]

6 голосов
/ 29 апреля 2019

Незащищенная конкатенация строк для генерации оператора 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.

Надеюсь, это поможет вам.

0 голосов
/ 29 апреля 2019
var adr = 'Mountain 21';
var sql = `SELECT * FROM customers WHERE address = "${mysql.escape(adr)}"`;
con.query(sql, function (err, result) {
if (err) throw err;
console.log(result);
});

var sql = 'SELECT * FROM customers WHERE address = Mountain 21';
К
var sql = 'SELECT * FROM customers WHERE address = "Mountain 21"';

https://stackoverflow.com/a/33679883/11343720

Чем Grave accent лучше quote, double quote

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...