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.