SQL injekcija je ranjivost u kojoj napadač umeće zlonamjernom SQL kroz unos korisnika — manipulirajući upitima baze podataka kako bi ukrao podatke, zaobišao autentifikaciju ili oštedio podatke. To je jedna od najopasnije i klasične web ranjivosti, ali je sprječiva s odgovarajućim tehnikama.
Kako SQL injekcija funkcionira
When user input is concatenated directly into a SQL query, an attacker can INJECT SQL:
// ❌ VULNERABLE — user input concatenated into the query
const query = `SELECT * FROM users WHERE email = '${userInput}'`;
// attacker enters: ' OR '1'='1
// → SELECT * FROM users WHERE email = '' OR '1'='1' → returns ALL users!
// or: '; DROP TABLE users; -- → could delete the table
Unos napadača tretira se kao SQL kod umjesto kao podaci — omogućujući mu da prepiše upiti (zaobiđe prijavu, izbaci sve podatke, obriše tablice).
Prevencija: parametrizirani upiti (glavno rješenje)
// ✅ PARAMETERIZED / PREPARED statements — input is treated as DATA, never as code
const query = 'SELECT * FROM users WHERE email = ?';
db.execute(query, [userInput]); // the value is safely bound, not concatenated
// → the database treats userInput as a literal value → injection impossible
Parametrizirani upiti (pripremljene naredbe) odvojene SQL kod od podataka — unos nikada ne može biti protumačen kao SQL. Ovo je primarnu, pouzdanu obrana.
Dodatne obrane
✓ PARAMETERIZED queries / prepared statements → the #1 fix (always use them)
✓ ORMs/query builders → use parameterization under the hood (but don't bypass with raw
string concatenation)
✓ INPUT VALIDATION (defense in depth) — validate/sanitize, but NOT a substitute for
parameterization
✓ LEAST PRIVILEGE DB accounts (limit damage); avoid exposing detailed DB errors
→ NEVER build queries by concatenating user input.
Zašto je to važno
Razumijevanje SQL injekcije i kako je sprječavati je ključno jer je to jedna od najopasnije, klasične i najčešće web ranjivosti (dio OWASP kategorije injekcije), ali potpuno sprječiva, tako da je to neophodna sigurnosna znanja za bilo kojeg programera koji radi s bazama podataka.
Razumijevanje kako funkcionira — da nadovezivanje unosa korisnika izravno u SQL upite omogućava napadaču ubaciti SQL kod (njihov unos tretiran kao kod umjesto podataka), omogućavajući mu da zaobiđe autentifikaciju (' OR '1'='1'), izbaci sve podatke ili čak obriše tablice ('; DROP TABLE) — je potrebno za prepoznavanje i izbjegavanje ranjivosti.
SQL injekcija može biti katastrofalna (potpuni curenje podataka, uništavanje podataka, zaobilazak autentifikacije), čineći je kritično važnom.
Razumijevanje prevencije je bitno: parametrizirani upiti (pripremljene naredbe) su primarnu, pouzdanu ispravku — oni odvajaju SQL kod od podataka tako da se unos korisnika tretira kao doslovna vrijednost koja nikada ne može biti protumačena kao SQL, čineći injekciju nemogućom.
Ovo je #1 obrana koju svaki programer mora koristiti.
Razumijevanje dodatnih obrana — korištenje ORM-a/konstruktora upita (koji parametriziraju, ali ne zaobilaziti ih s raw nadovezivanjem), validacija unosa kao obrana-u-dubinu (ali ne zamjena za parametrizaciju), računi baze podataka s najmanjim povlasticama, i izbjegavanje detaljne izloženosti greške — i kardinalnog pravila da nikada ne nadovezujete unos korisnika u upite — odražava sveobuhvatnu prevenciju.
Budući da je SQL injekcija opasna, česta i klasična ranjivost s teškim konsekvencama (curenje podataka, gubitak podataka, zaobilazak autentifikacije) koja je potpuno sprječiva s parametriziranim upitima, i budući da je razumijevanje kako funkcionira i kako je sprječavati bitno za bilo kojeg programera koji radi s bazama podataka, razumijevanje SQL injekcije i njene prevencije je bitno, neophodna sigurnosna znanja — fundamentalna ranjivost koju treba razumjeti i braniti se od nje, gdje je jednostavna, pouzdana ispravka (parametrizirani upiti) kritično znanja koje sprječava jedan od najštetniji klasa napada.
