На мой взгляд, атаки с использованием SQL-инъекций можно предотвратить с помощью:
- Тщательный скрининг, фильтрация, кодирование ввода (перед вставкой в SQL)
- Использование подготовленных операторов / параметризованных запросов
Я предполагаю, что у каждого есть свои плюсы и минусы, но почему №2 взлетел и стал более или менее де-факто способом предотвращения инъекционных атак? Это просто безопаснее и менее подвержено ошибкам или были другие факторы?
Как я понимаю, если # 1 используется правильно и все предостережения учтены, это может быть столь же эффективно, как и # 2.
Санитарная обработка, фильтрация и кодирование
С моей стороны была некоторая путаница между тем , что означают очистка , фильтрация и кодирование . Я скажу, что для моих целей все вышеперечисленное может быть рассмотрено для варианта 1. В этом случае я понимаю, что очистка и фильтрация могут изменить или отбросить входные данные, в то время как кодирование сохраняет данные как есть , но кодирует их правильно, чтобы избежать инъекционных атак. Я считаю, что экранирование данных можно рассматривать как способ их кодирования.
Параметризованные запросы против библиотеки кодирования
Есть ответы, где понятия parameterized queries
и encoding libraries
которые трактуются взаимозаменяемо. Поправь меня, если я не прав, но у меня сложилось впечатление, что они разные.
Я понимаю, что encoding libraries
, независимо от того , насколько хорошо они всегда имеют потенциал , чтобы изменить SQL «программы», потому что они вносят изменения в сам SQL, прежде чем он будет отправлен в РСУБД.
Parameterized queries
с другой стороны, отправьте программу SQL в СУБД, которая затем оптимизирует запрос, определит план выполнения запроса, выберет индексы, которые будут использоваться, и т. д., а затем подключит данные в качестве последнего шага внутри СУБД. сам.
Библиотека кодирования
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
Параметризованный запрос
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
Историческое значение
В некоторых ответах упоминается, что исторически параметризованные запросы (PQ) создавались по соображениям производительности, а до внедрения инъекций эти проблемы с кодированием стали популярными. В какой-то момент стало очевидно, что PQ также довольно эффективен против инъекционных атак. Чтобы соответствовать духу моего вопроса, почему PQ оставался предпочтительным методом и почему он процветал над большинством других методов, когда речь шла о предотвращении атак с использованием SQL-инъекций?