📧 [email protected] 📞 +381 61 161 2299
OWASP A03: Injection

SQL Injection: Kako jedna loša linija koda može srušiti firmu

2026-07-12 · Shieldome Scout

SQL Injection je godinama bio broj jedan na OWASP listi i nije slučajno: napadaču daje direktan pristup vašoj bazi podataka. Objašnjavamo kako funkcioniše i kako se zaštititi.

← Blog

Šta je SQL Injection?

SQL Injection (SQLi) se dešava kada napadač ubaci SQL kod u polje za unos koje aplikacija prosleđuje direktno bazi podataka. Umesto da se unos tretira kao podatak, baza ga izvršava kao komandu. Rezultat: napadač može da čita, menja ili briše podatke, zaobiđe logovanje, pa čak i preuzme kontrolu nad serverom.

Evo klasičnog primera ranjivog PHP koda:

$username = $_POST['username'];
$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysqli_query($conn, $query);

Ako korisnik upiše ' OR '1'='1 kao korisničko ime, upit postaje:

SELECT * FROM users WHERE username = '' OR '1'='1'

Uslov '1'='1' je uvek tačan, pa upit vraća sve korisnike — i napadač se loguje bez lozinke.

Vrste SQL Injection napada

In-band SQLi (klasični)

Napadač vidi rezultat direktno u odgovoru aplikacije. Najčešći tip, uključuje Error-based (podaci se izvlače kroz error poruke) i Union-based (korist UNION SQL operatora za kombinovanje podataka iz više tabela).

Blind SQLi

Aplikacija ne prikazuje greške niti podatke direktno, ali menja ponašanje na osnovu upita. Boolean-based: odgovor se razlikuje za tačan i netačan uslov. Time-based: napadač koristi SLEEP() funkciju da izmeri da li je uslov tačan po kašnjenju odgovora.

Out-of-band SQLi

Podaci se izvlače kroz drugi kanal (DNS zahtevi, HTTP pozivi). Ređi, ali moćan kada su drugi metodi blokirani.

Realne posledice

SQLi napadi su odgovorni za neke od najvećih povreda podataka u istoriji interneta:

Posledice za malu ili srednju firmu: curenje baze korisnika, gubitak poverenja, GDPR kazne do 4% globalnog prihoda, tužbe i potencijalni krivičnopravni odgovor vlasnika.

SQLi je čest jer su simptomi nevidljivi: ranjiva aplikacija radi normalno sve dok napadač ne odluči da udari. Pasivna detekcija — analiza error poruka, HTTP odgovora i ponašanja forme — može otkriti ranjivost pre nego što napadač to uradi.

Kako se odbraniti

1. Parametrizovani upiti (Prepared Statements)

Jedini siguran način da sprečite SQLi: odvojiite SQL strukturu od korisničkih podataka.

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$result = $stmt->fetchAll();

Baza ovde tretira $username isključivo kao podatak, bez obzira na sadržaj.

2. ORM biblioteke

Django ORM, Hibernate, ActiveRecord, SQLAlchemy — moderne ORM biblioteke koriste parametrizovane upite automatski. Direktno pisanje SQL stringa unutar ORM-a i dalje može biti ranjivo.

3. Validacija i sanitizacija unosa

Whitelist validacija (dozvolite samo očekivane formate), ograničite dužinu, tipove i znakove. Ovo je dopunska zaštita, nikad jedina.

4. Princip najmanje privilegija

Nalog baze podataka koji koristi aplikacija ne sme imati DROP, CREATE, niti pristup sistemskim tabelama. Čak i ako dođe do SQLi-ja, napadač ima ograničene mogućnosti.

5. WAF (Web Application Firewall)

WAF može blokirati poznate SQLi pattern-e, ali nije zamena za siguran kod — napadači rutinski zaobilaze WAF-ove obfuscation tehnkama.

6. Redovni vulnerability assessment

Automatizovana detekcija SQLi indikatora (error poruke, aberantna ponašanja) kao deo redovne procene — pre nego što to uradi napadač.

Proverite bezbednost vašeg sajta

Profesionalna procena ranjivosti. OWASP Top 10, dark web monitoring, PDF izveštaj za 2–3 radna dana.

Zatražite procenu →