Как этот параметризованный запрос может предотвратить SQL-инъекцию?

Я знаю, что параметризованные запросы используются для предотвращения внедрения 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 * --' это не число

Есть идеи?

10000