Лучший способ избежать массива данных по запросу MysQl nodeJS
Таким образом, у меня есть следующий объект с данными, предоставленными пользователем для регистрации:
var dataToInsert = {
userName: 'Wilson J',
userEmail: 'WilsonJ@gmail.com',
userAddress: '2020 St.',
userCellPhone: '95587412',
}
И я использую следующий запрос, чтобы вставить его:
var insertQuery = `INSERT INTO users ( ${Object.keys(dataToInsert).toString()} ) VALUES( '${Object.values(dataToInsert).join("','")}' )`;
Который в конце принимается как:
INSERT INTO
users (
userName,
userEmail,
userAddress,
userCellPhone
)
VALUES
(
'Wilson J',
'WilsonJ@gmail.com',
'2020 St',
95587412
)
Пока мне трудно понять, как работает экранирование данных. Я был бы очень признателен, если бы кто-нибудь показал мне, как SQL-инъекция может происходить с этим кодом и как его предотвратить.
Я использую модуль MysQl npm, и у него есть этот метод: mysql.escape()
но я хотел бы найти более автоматизированный подход вместо того, чтобы избегать каждого отдельного значения вручную.
2 ответа
В наше время активно не рекомендуется делать что-либо кроме привязки переменных к вашему запросу. Смотрите это для получения дополнительной информации о других способах экранирования данных:
connection.query(`
INSERT INTO users ( ${Object.keys(dataToInsert).toString()} ) VALUES (?)`,
Object.values(dataToInsert),
function (error, results, fields) {
if (error) throw error;
// ...
}
);
Предостережение: вы не сможете связать переменные с именами столбцов, поэтому, к сожалению, эта часть запроса необходима. Убедитесь, что ваши ключи вашего dataToInsert
являются либо статическими, либо не из какого-либо пользовательского ввода.
В качестве альтернативы вы можете использовать? символы в качестве заполнителей для значений, которые вы хотели бы экранировать следующим образом: [...]
Есть выход. https://github.com/mysqljs/mysql