## Injecția SQL: Cum funcționează și cum să o previi
Injecția SQL (SQL Injection - SQLi) este o vulnerabilitate de securitate web care permite unui atacator să interfereze cu interogările pe care o aplicație le face către baza de date. Practic, atacatorul injectează cod SQL malițios în câmpurile de intrare (de exemplu, câmpuri de text, câmpuri de căutare, etc.) pentru a modifica sau manipula baza de date.
**Cum funcționează:**
Imaginați-vă o aplicație web care permite utilizatorilor să se autentifice introducând un nume de utilizator și o parolă. Codul aplicației construiește o interogare SQL pentru a verifica datele de autentificare în baza de date. Să presupunem că interogarea SQL arată cam așa:
```sql
SELECT * FROM Users WHERE username = '" + username + "' AND password = '" + password + "';
```
Unde `username` și `password` sunt variabilele care preiau valorile introduse de utilizator în câmpurile respective.
**Exploatarea vulnerabilității:**
Un atacator poate profita de această vulnerabilitate introducând un cod SQL malițios în câmpul `username`. De exemplu, atacatorul ar putea introduce următorul text:
```
' OR '1'='1
```
În acest caz, interogarea SQL rezultată ar deveni:
```sql
SELECT * FROM Users WHERE username = '' OR '1'='1' AND password = '" + password + "';
```
Deoarece `1=1` este întotdeauna adevărat, interogarea returnează toate înregistrările din tabela `Users`, ocolind complet verificarea corectă a numelui de utilizator și a parolei. Atacatorul se poate autentifica astfel ca oricare utilizator din baza de date.
**Alte exemple de atacuri SQLi:**
* **Extragerea datelor:** Atacatorii pot fura informații sensibile din baza de date (date personale, date financiare, etc.).
* **Modificarea datelor:** Atacatorii pot modifica datele din baza de date (de exemplu, pot schimba parole, pot adăuga sau șterge utilizatori).
* **Ștergerea datelor:** Atacatorii pot șterge date din baza de date.
* **Executarea de comenzi la nivelul sistemului de operare:** În unele cazuri, atacatorii pot executa comenzi pe serverul pe care rulează baza de date, compromițând complet sistemul.
**Cum să previi injecția SQL:**
Există mai multe metode de a preveni injecția SQL:
1. **Parametrizarea interogărilor / Interogări precompilate (Prepared Statements):** Aceasta este cea mai eficientă metodă de prevenire a SQLi. Interogările parametrizate tratează datele introduse de utilizator ca date, nu ca parte a codului SQL. Parametrii sunt transmisi separat de interogare către baza de date, care se ocupă de escape-ul și validarea datelor. Acest lucru asigură că datele introduse de utilizator nu pot schimba structura interogării.
**Exemplu (PHP cu PDO):**
```php
$stmt = $pdo->prepare("SELECT * FROM Users WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->execute();
```
În acest exemplu, `$username` și `$password` sunt tratate ca date și nu pot fi interpretate ca cod SQL.
2. **Escape-ul datelor introduse de utilizator:** Escape-ul înseamnă transformarea caracterelor speciale din datele introduse de utilizator, astfel încât acestea să nu mai fie interpretate ca parte a codului SQL. Această metodă este mai puțin sigură decât interogările parametrizate, deoarece depinde de implementarea corectă a funcțiilor de escape. O eroare în funcția de escape poate permite un atacator să ocolească protecția.
**Exemplu (PHP cu mysqli):**
```php
$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);
$query = "SELECT * FROM Users WHERE username = '$username' AND password = '$password'";
```
**Atenție:** Folosiți funcțiile de escape specifice bazei de date pe care o utilizați (e.g., `mysqli_real_escape_string` pentru MySQLi, `pg_escape_string` pentru PostgreSQL).
3. **Validarea datelor introduse de utilizator:** Validați întotdeauna datele introduse de utilizator înainte de a le utiliza în interogări SQL. Verificați tipul datelor, formatul, lungimea și intervalul valorilor. Respingeți orice date care nu corespund așteptărilor. De exemplu, dacă un câmp ar trebui să conțină doar numere, respingeți orice intrare care conține litere.
4. **Principiul celui mai mic privilegiu:** Acordați conturilor de utilizator ale aplicației acces minim necesar la baza de date. Dacă aplicația are nevoie doar să citească date dintr-o anumită tabelă, nu acordați-i acces la scriere sau ștergere. Acest lucru limitează impactul unui eventual atac SQLi.
5. **Utilizarea unui ORM (Object-Relational Mapper):** Un ORM este un strat de abstractizare între aplicație și baza de date. ORM-urile folosesc adesea interogări parametrizate sau alte tehnici de securitate pentru a preveni SQLi. Folosirea unui ORM nu elimină complet riscul de SQLi, dar îl reduce semnificativ și simplifică dezvoltarea.
6. **Firewall-uri pentru aplicații web (WAF):** Un WAF poate detecta și bloca încercările de injecție SQL. WAF-urile analizează traficul HTTP și caută pattern-uri care sugerează un atac SQLi.
7. **Auditarea și testarea securității:** Auditați în mod regulat codul aplicației și efectuați teste de penetrare pentru a identifica eventualele vulnerabilități SQLi.
**ÃŽn concluzie:**
Injecția SQL este o vulnerabilitate serioasă care poate avea consecințe grave. Prin implementarea metodelor de prevenire descrise mai sus, puteți proteja aplicațiile web și datele de atacurile SQLi. Prioritatea ar trebui acordată utilizării interogărilor parametrizate, deoarece este cea mai eficientă metodă de prevenire. Validați întotdeauna datele introduse de utilizator și acordați acces minim necesar conturilor de utilizator ale aplicației.
Str. Tineretului, Bl 13/420
+40 726 471 311
© 2023 Toate drepturile rezervate Realizat cu RTEC-DESIGN