Использование 'mariadb / callback' в качестве соединителя с базой данных:
const db = require('mariadb/callback');
mariaDB - это одна опция для базы данных MySQL.
Давайте используем следующие переменные в качестве примера:
var customName = ' ';
var someAddress = 'this is an address';
var mainID = 'some unique ID';
var secondID = 'maybe not a unique ID';
Запросы параметризованы следующим образом:
var sql = `UPDATE myTable SET myName=?, myAddress=? WHERE _id=? AND otherID=?;`;
Используя '?'символ вместо имени переменной вы не только упростите оператор SQL, но и, что более важно, предотвратит внедрение SQL.В частности, если одна из переменных хранила это:
var id = '42 OR 1=1;'
В результате неиспользования параметризованных входов в этом случае может произойти обновление всей таблицы с тем же именем и адресом.Использование параметризованных входов просто приведет к сбою этой операции, поскольку ни один из идентификаторов в базе данных не будет равен '42 OR 1 = 1 '.
Теперь, если customName - пустая строка или пробел, или даже' NULL'string, вы можете сделать это:
customName = customName.trim();
if ( (customName === '') || (customName.toUpperCase() === 'NULL') ) {
customName = null;
}
Что совпадает с:
if ( (customName.trim() === '') || (customName.trim().toUpperCase() === 'NULL') ) {
customName = null;
}
(первая версия просто переназначает customName без пробелов в начале / конце - убедитесь, что вы не используетене нужно сохранять значение строки при выборе этого метода)
.trim()
удалит все пробелы с обоих концов строки (не удалит пробелы между любыми непробельными символами).
.toUpperCase()
изменит строку на все заглавные буквы, таким образом, если строка 'null' или 'Null' или любая другая вариация, которая включает любые строчные символы, она все равно будет иметь значение 'true' при оценке«NULL» равенство.Обратите внимание, что здесь также важно использовать .trim()
, чтобы
' nuLl '
становилось
'NULL'
и все равно оценивалось как 'true'.
Далее,нам нужно создать наш массив значений:
var values = [customName, someAddress, mainID, secondID];
Наконец, запрос db:
db.query(sql, values, (err, result) => {
// callback stuff to do here
}
db относится к соединителю, созданному в начале этого поста.Я не включил сам процесс подключения, потому что это выходит за рамки этого поста.Для справки документация по API находится здесь .
ПОСЛЕ подключения БД, db.query используется для выполнения запроса.Первый аргумент «sql» - это параметризованный оператор SQL.Второй аргумент 'values' - это массив значений, которые будут использоваться в запросе.Этот массив ДОЛЖЕН быть в том же порядке, в котором он будет использоваться.
В качестве примера того, что не следует делать:
var sql = `UPDATE myTable SET myName=${customName}, myAddress=${someAddress} WHERE _id=${mainID} AND otherID=${secondID};`;
Причина, по которой это плохо, связана с внедрением SQL, котороеработает следующим образом: вы начинаете с этого:
var customName = 'same name';
var mainID = '" OR ""="';
var secondID = '" OR ""="';
Полученный код sql будет выглядеть следующим образом:
var sql = `UPDATE myTable SET myName="same name", myAddress="this is an address" WHERE _id="" OR ""="" AND otherID="" OR ""="";`;
И в результате теперь каждая отдельная запись в базе данных теперь имеет такой жеимя и тот же адрес.
Этот пример SQL-инъекции модифицирован из W3 школ .