Injectarea SQL-ului este o tehnică folosită pentru a ataca aplicaţiile bazate pe date. Folosind această metodă, hackerii vor încerca să execute comenzile lor de SQL în aplicația dvs. și să vă acceseze informatile din baza de date. Aici este un exemplu de injectare SQL. Spre exemplu aveți un formular de autentificare cu două câmpuri – email (camp text) si parola(camp parola). Dupa logare, va crea şi executa o interogare similara:
"SELECT * FROM `users` WHERE `email` = '".$_POST["email"]."' AND `password` = '".$_POST["password"]."'";
Se poate vedea că interogarea caută un utilizator în tabelul de utilizatori care să corespundă emailului şi parolei introduse prin intermediul formularului de logare. Totuşi deoarece atât emailul cât şi parola nu sunt gestionate corespunzator un haker poate modifica interogarea. Să presupunem că reuşeşte să intre:
Email: myemail@domain.com
Parola: mypassword
Interogarea construită ar fi:
SELECT * FROM `users` WHERE `email` = 'myemail@domain.com' AND `password` = 'mypassword';
Care la prima vedere pare corectă. Totusi daca hakerul foloseşte:
Email: myemail@domain.com
Password: mypassword
interogarea va deveni:
SELECT * FROM `users` WHERE `email` = 'myemail@domain.com' AND `password` = 'mypassword'; DROP TABLE 'users';
Şi bineînţeles ca nu doriți ca oamenii să execute astfel de interogări peste baza dvs. de date.
Pentru a proteja aplicatia dvs PHP faţa de aceste injectari SQL, trebuie sa setaţi corect toate interogarile SQL care rulează.
Cu versiuni mai vechi de PHP (>= 4.3.0, 5) acest lucru se face cu ajutorul comenzii mysql_real_escape_string(). Deci interogarea de mai sus ar arăta asa:
"SELECT * FROM `users` WHERE `email` = '".mysql_real_escape_string($_POST["email"])."' AND `password` = '".mysql_real_escape_string($_POST["password"])."'";
Acesta este modul în care interogarea protejată de injectarea SQL arată acum:
SELECT * FROM `users` WHERE `email` = 'myemail@domain.com' AND `password` = 'mypassword\'; DROP TABLE \'users'
Poţi vedea că informaţia transferată prin intermediul $_POST a ieşit şi interogarea DROP TABLE nu va fi executată separat ci va fi considerată parte a şirului parolei.
Cu cele mai noi versiuni de PHP puteți folosi acum PDO și interogări pregătite. Iată un exemplu:
$stmt = $conn->prepare("SELECT * FROM `users` WHERE `email`=:email AND `password` = :password"); $stmt->bindValue(':email', $_POST["email"]); $stmt->bindValue(':password', $_POST["password"]); $stmt->execute();
Funcția cheie aici este pregătirea (). Asigură interogarea SQL și o protejează de injecțiile SQL.
Există și alte modalități de a verifica dacă datele transmise prin interogări SQL sunt valide și nu sunt abuzate. De exemplu, dacă vă așteptați ca o unitate să fie validată, puteți utiliza intval () pentru a converti datele introduse într-o unitate.
"SELECT * FROM `users` WHERE `age` = '".intval($_POST["age"])."'";
Sau dacă vă așteptați la o adresă de e-mail, puteți utiliza validarea e-mail pentru a garanta că $ _POST [„email”] este o adresă de e-mail validă. Citiţi deasemenea şi tutorialul nostru de Validare și Verificare PHP (PHP Validation And Verification) pentru validări diferite de șir.
Injectarea SQL este una din vulnerabilitaţile principale a siturilor web, deci trebuie sa aveţi mare grijă cand construiţi interogări SQL pentru introducerea de date de catre utilizator.