Jedną z najprostszych i najskuteczniejszych form włamywania się do serwisów WWW jest wykorzystanie błędów skryptu związanych ze wstawianiem do zapytań SQL danych. Ataki tego typu noszą nazwę SQL Injection, a z wielkiej podatności na nie znane są takie skrypty, jak phpBB, czy PHP-NUKE.
Wszystko polega na tym, że zapytania SQL do ograniczania tekstów używają apostrof (
' ). Aby wpisać taki znak jako jego fragment, należy go poprzedzić, podobnie jak w PHP, backslashem, gdyż inaczej baza danych uzna, że tekst kończy się w tym miejscu i potraktuje dalszą jego część jako samo zapytanie. Jeżeli danych z formularza i adresu URL nie przepuścimy przez funkcję, która doda takie backslashe, narazimy się na poważne niebezpieczeństwo. Hacker będzie mógł bowiem zmieniać warunki zapytań poprzez zwykły formularz i w ten sposób np. ominąć sprawdzanie hasła przy logowaniu. Oto przykład. Mamy niezabezpieczone zapytanie:
"SELECT id FROM uzytkownicy WHERE login='".$_POST['login']."' AND password = '".sha1($_POST['password'])."' |
Kiedy zalogujemy się loginem "ziutek" i hasłem "ppp", PHP wyśle do bazy takie zapytanie:
SELECT id FROM uzytkownicy WHERE login='ziutek' AND password = 'tu_hash_sha1' |
Teoretycznie wszystko jest poprawnie. Ale jeśli za login wpiszę
admin' OR NOT '0, otrzymamy takie zapytanie:
SELECT id FROM uzytkownicy WHERE login='admin' OR NOT '0' AND password = 'tu_hash_sha1' |
Jak widzisz, zmodyfikowany został warunek. Teraz jest on tak napisany, że
wpuści nas jako "admin" nawet wtedy, gdy nie znamy hasła!
Aby zapobiec temu, należy przepuścić
$_POST['login'] np. przez funkcję
mysql_real_escape_string(). Wtedy zawsze wpisany w polu "Login" ciąg będzie traktowany jak login bez względu na znajdujące się w nim znaki.
Przy zabawie funkcjami dodającymi backslashe należy brać poprawkę na ustawienia Magic Quotes (opisane w innej poradzie), gdyż inaczej skrypt zacznie zachowywać się nieprzewidywalnie!