PHP - bezpieczeństwo w PHP - Atak typu SQL Injection
| DZIAŁANIE: | brak działania |
Kod:
brak kodu
Ewentualne Objaśnienia:
Bardzo popularną metodą ataków jest atak typu SQL Injection, który polega na
modyfikowaniu zapytań do bazy danych wedle potrzeb osoby przeprowadzającej atak.
Załóżmy, że mamy w bazie danych tablicę users a w niej 3 pola :
- login (typ text)
- haslo (typ text)
- uprawnienia (int) - 1 oznacza administratora, 0 oznacza zwykłego użytkownika
No i mamy stronę logowania - wiadomo formularz przekazujący dane metodą POST
( nazwy pól takie jak pola w bazie danych ) no i oczywiście ten sam plik lub
inny sprawdzający logowanie, gdzie mamy kod typu :
<?
$login = $_POST['login'];
$haslo = $_POST['haslo'];
$uprawnienia = $_POST['uprawnienia'];
$polaczenie = mysql_connect('host','user','haslo');
mysql_select_Db('nazwa_bazy');
$query = " SELECT uprawnienia FROM users WHERE login='$login' AND haslo='$haslo'
";
$wynik = mysql_query($query);
if ($rekord = mysql_fetch_assoc($wynik))
{
switch($rekord['uprawnienia'])
{
case 0:
print 'Jesteś zwykłym userem!';
break;
case 1:
print 'Jesteś administratorem';
}
}
else
{
print 'Wystąpił błąd podczas logowania!';
}
mysql_close($polaczenie);
?>
Kod ten zapewne jest dla Was wszystkich dobrze zrozumiały. Ale zobaczmy taki
oto myk, wpisujemy w polu formularza ( w kodzie go nie podałem bo i po co wiecie
o co chodzi ) - jako hasło : jakiekolwiek hasło, a w polu podawania usera :
admin" # - wiecie co się wtedy dzieje ? Zapytanie do bazy danych wygląda tak
:
SELECT uprawnienia FROM users WHERE login='admin" #" AND
haslo='jakies_zle_haslo' - co to oznacza ? Cudzysłów spowoduje zamknięcie
warunek klauzuli WHERE, a następnie zapytania zostaną zignorowane poprzez znak #
- który jest znakiem komentarza w bazie MySQL - czyli w rzeczywistości nasze
zapytanie SQL wygląda tak :
SELECT uprawnienia FROM users WHERE login=admin -
pojawiłoby się nam info, że jesteśmy administratorami !
Jak widać wystarczyłoby znać w takiej sytuacji nick/login administratora i "po zabawie".
Jak się bronić ?
Należy pamiętać o sprawdzaniu danych przed przekazaniem zapytania oraz o
funkcjach takich jak htmlspecialchars oraz addslashes.