Z mojego punktu widzenia atakom wstrzykiwania SQL można zapobiec poprzez:
- Dokładne przeglądanie, filtrowanie, kodowanie danych wejściowych (przed wstawieniem do SQL)
- Korzystanie z przygotowanych instrukcji / sparametryzowanych zapytań
Przypuszczam, że każdy ma swoje zalety i wady, ale dlaczego numer 2 wystartował i został uznany za mniej więcej faktyczny sposób zapobiegania atakom iniekcyjnym? Czy jest to po prostu bezpieczniejsze i mniej podatne na błędy, czy też były inne czynniki?
Rozumiem, że jeśli numer 1 jest używany właściwie i wszystkie zastrzeżenia są załatwione, może być tak samo skuteczny jak numer 2.
Odkażanie, filtrowanie i kodowanie
Z mojej strony było pewne zamieszanie między znaczeniem dezynfekcji , filtrowania i kodowania . Powiem, że dla moich celów wszystkie powyższe można rozważyć dla opcji 1. W tym przypadku rozumiem, że odkażanie i filtrowanie może modyfikować lub odrzucać dane wejściowe, podczas gdy kodowanie zachowuje dane takie, jakie jest , ale koduje je odpowiednio, aby uniknąć ataków iniekcyjnych. Uważam, że ucieczkę danych można uznać za sposób ich zakodowania.
Zapytania sparametryzowane a biblioteka kodowania
Istnieją odpowiedzi, w których pojęcia parameterized queries
i encoding libraries
które są traktowane zamiennie. Popraw mnie, jeśli się mylę, ale mam wrażenie, że się różnią.
Rozumiem, że encoding libraries
bez względu na to, jak dobrzy są zawsze, mogą modyfikować „Program” SQL, ponieważ wprowadzają zmiany w samym SQL, zanim zostanie on wysłany do RDBMS.
Parameterized queries
z drugiej strony wyślij program SQL do RDBMS, który następnie zoptymalizuje zapytanie, zdefiniuje plan wykonania zapytania, wybierze indeksy, które mają zostać użyte itp., a następnie włączy dane, jako ostatni krok w RDBMS samo.
Biblioteka kodowania
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
Zapytanie sparametryzowane
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
Znaczenie historyczne
Niektóre odpowiedzi wspominają, że historycznie sparametryzowane zapytania były tworzone ze względu na wydajność, a przed atakami iniekcyjnymi ukierunkowanymi na problemy z kodowaniem stały się popularne. W pewnym momencie stało się jasne, że PQ były również dość skuteczne przeciwko atakom iniekcyjnym. Aby trzymać się ducha mojego pytania, dlaczego PQ pozostało metodą z wyboru i dlaczego rozkwitło ponad większość innych metod, jeśli chodzi o zapobieganie atakom typu SQL injection?