Bo magic_quotes to nie wszystko

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.

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 magicquotes_ i tak wylatują z PHP 6.0.

Oryginał tego wpisu dostępny jest pod adresem [Bo magicquotes to nie wszystko](https://archive.mroczna-zaloga.org/archives/269-bo-magic_quotes-to-nie-wszystko.html)_

Autor: Paweł Goleń