traži:  
 php.com.hr > članci > SQL injections

SQL injections
 
20.12.2004.


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: &#039 , a dvostruki kao: &quot.

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

 


članci
 
 © 2004 - 2008 php.com.hr