U posljednje vrijeme sve smo više stranica mogli vidjeti koju su hackirane u "internet borbi" hrvatskih i srpskih hackera. Kako se od takvih napada zaštititi pokazat ćemo vam jednim primjerom.
Kao što vjerojatno svi znate, SQL je kratica od Structured Query Language. dolazi u različitim dijalektima, najčešće temeljen na SQL - 92 ANSI standardu. SQL upit sadrži jednu ili više SQL naredbi poput SELECT, UPDATE, INSERT. Za SELECT upit, svaki upit ima dio koji vraća podatke.
Primjer: SELECT * FROM korisnici WHERE korisnik = 'Bill';
Znači da će samo jedan redak čije je polje jednako stringu Bill biti vraćeno.
Kao što sam naslov članka govori SQL injection napad je kojim se
inject-a odnosno ubacuje ili manipulira SQL kôdom.
Dodavanjem neočekivanog kôda unutar SQl query-a moguće je manipulirati bazom na više načina.
Najpopularniji način današnje provjere podataka korisnika na nekom web siteu je HTML forma u koju unosimo svoje korisničko ime i lozinku.
Recimo da imamo slijedeći html kôd za ulogiravanje :
<form name="login" action="login.php" method="post"> Login: <input type="text" name="login"> Lozinka: <input type="text" name="lozinka"> <input type="submit"> </form> |
Kada je sadržaj formulara poslan pritiskom na gumb, podaci se šalju stranici login.php:
<?
$login = $_POST['login']; // NEMA FILTRIRANJA! $lozinka= $_POST['lozinka']; $query = "SELECT login, lozinka FROM korisnici WHERE login = '$login' and lozinka = '$lozinka' ";
?> |
Primjer napada ako se u polje unese slijedeći kod:
'OR 1=1 #
//upit sada izgleda ovako:
$query = "SELECT login, lozinka FROM korisnici WHERE login = '' OR 1=1 #' and lozinka = '' "; |
Kako se zaštititi?
Svaki hackerski napad moze biti uspješno izbjegnut ako se pravilno filtriraju unešeni podaci!
Možemo napraviti funkciju kojom ćemo filtrirati unešene podatke:
function provjera ($str) { return htmlspecialchars ($str, ENT_QUOTES); }
ili
function provjera($var) { $var = addslashes(trim($var)); return $var; }
|
Funkcija htmlspecialchars unutar naše funkcije vraća unešene znakove u obliku HTML koda a parametar ENT_QUOTES govori da svaki znak ' i znak " (jednostruki i dvostruki navodnici) budu prikazani kao html kôd.
Odnosno jednostruki navodnik će biti prikazan kao HTML kôd: ' , a dvostruki kao: ".
Funkcija provjera2 sadrži u sebi funkciju addslashes koja ispred jednostrukog i dvostrukog navodnika kao i znaka / umeće znak \ sa kojim zapravo escape-a takve znakove.
Pravilna primjena funkcije:
Nakon što smo napravili funkciju logično će vam biti da tu funkciju primjenimo na polje u koje se unose podaci dakle:
$lozinka= provjera($_POST['lozinka']); // filtrirali smo varijablu $lozinka $query = "SELECT login, lozinka FROM korisnici WHERE login = '$login' and lozinka = '$lozinka' ";
?> |
Što će rezultirati pogrešnim loginom i napadač će biti odbijen.
O ostalim načinima napada SQL injection-om preporučamo članak:
http://php.planetmirror.com/manual/en/security.database.sql-injection.php