PHP posiada coś, o się nazywa magic_quotes. Czasami pozwala to uniknąć skutków błędu programisty. Ale tylko czasami. Żadna magia nie zastąpi prawidłowej walidacji danych wejściowych.
Bo magic_quotes to nie wszystko
Przykład błędu
Wiele stron napisanych jest w ten sposób, że przyjmują parametry typu id newsa, kategorii, itp. Są one indeksami, więc można zakładać, że wewnętrznie wartości te są traktowane jako wartości liczbowe. A to oznacza, że znak ' (single-quote) nie będzie potrzeby do zrobienia injectiona. Prosty przykład zapytania:
$strQuery = "SELECT * FROM tabela WHERE id=".$id." ORDER BY id DESC"
Gdzie jest błąd? Po pierwsze tak nie należy składać zapytań, o czym już zresztą pisałem. Jeśli wartość $id nie zostanie poprawnie zwalidowana, to można podstawić do niej coś w stylu:
1 AND 1=1 1 AND 1=0 1 AND (SELECT 1 FROM DUAL)=1
...i jeśli to przejdzie (z dokładnością do wykorzystanej bazy danych), można bazę danych poznać dogłębnie...
Konsekwencja w postępowaniu
Druga sprawa to konsekwencja. Coraz częściej można zauważyć, że "główne" indeksy są w jakiś sposób walidowane, na przykład przy pomocy jakiegoś regexpa. "Wklikując" się głębiej liczba identyfikatorów się zwiększa i nagle okazuje się, że kolejne nie są już walidowane. Mnie to w sumie bez różnicy, czy injection można uskutecznić w parametrze określającym kategorię, numer artykułu, czy też identyfikator komentarza... Liczy się skutek. A skutek jest zwykle taki sam. No chyba, że okaże się, że komentarze są pobierane z innej bazy i z wykorzystaniem innego użytkownika... Ale to jest mało prawdopodobne.
...a magic_quotes i tak wylatują z PHP 6.0.