Я знаю, что параметризованные запросы используются для предотвращения внедрения SQL, но как это может предотвратить внедрение SQL? Кто-то может просто установить свой идентификатор равным ; DROP TABLE * --
; DROP TABLE * --
и все равно просто вставить это в параметризованный запрос?
let updateQueryData = `UPDATE table SET lookups = $1 WHERE id = $2`;
let updateQueryValues = [numLookups, data.rows[0].id];
pool.query(updateQueryData, updateQueryValues, err => {
Всего 2 ответа
Нет. Данные не просто вставляются в текстовое представление запроса. Отправляется отдельно.
Чтобы предотвратить внедрение, данные должны быть отделены от команды, чтобы не было двусмысленности между данными и командой. Это именно то, что делает параметризованный запрос.
(Примечание. Некоторые библиотеки по-прежнему отправляют запрос с данными «все в одном», но все данные автоматически «экранируются», так что они по-прежнему безопасны для использования.)
Кроме того, я бы настоятельно рекомендовал удалить эти обратные пометки и заменить их на обычные кавычки, чтобы в будущем вы случайно не связали данные в этот запрос.
ОБНОВЛЕНИЕ таблицы SET lookups = $ 1 ГДЕ id = $ 2
Ваш запрос уже параметризован.
Вот что произойдет, если кто-то передаст вредоносное значение типа '; DROP TABLE * --'
'; DROP TABLE * --'
:
UPDATE table SET lookups = ' DROP TABLE * --' WHERE id = 1
'; DROP TABLE * --'
'; DROP TABLE * --'
это не число