Ce face mysqli_real_escape_string
Funcția „protejează” caracterele care au rol special în SQL: ghilimelele simple și duble, bara inversă, linia nouă și caracterul nul. Ține cont de codarea conexiunii, de aceea are nevoie de obiectul mysqli.
Textul rezultat trebuie pus între ghilimele în SQL: WHERE nume = '$text'. Funcția nu protejează valorile puse fără ghilimele (de exemplu numere) și nici numele de coloane.
Astăzi, metoda recomandată sunt interogările pregătite (mysqli_prepare, mysqli_execute_query), care separă complet valorile de SQL. mysqli_real_escape_string rămâne utilă în codul vechi.
Parametri
| Parametru | Descriere |
|---|---|
$mysql |
Conexiunea (pentru codarea caracterelor). |
$string |
Textul de protejat. |
Ce returnează
Textul cu caracterele speciale precedate de \.
Exemple
Exemplul 1: Un nume cu apostrof
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
mysqli_set_charset($conn, "utf8mb4");
$nume = "Ceas D'Arc";
$sigur = mysqli_real_escape_string($conn, $nume);
echo $sigur . "\n";
echo "SELECT * FROM produse WHERE nume = '$sigur'";
Rezultat (cu un server MySQL și tabelul produse de mai sus)
Ceas D\'Arc
SELECT * FROM produse WHERE nume = 'Ceas D\'Arc'
Exemplul 2: Încercare de SQL injection neutralizată
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
$cautare = "x' OR '1'='1";
$sigur = mysqli_real_escape_string($conn, $cautare);
$rezultat = mysqli_query($conn, "SELECT id FROM produse WHERE nume = '$sigur'");
echo "Rânduri găsite: " . mysqli_num_rows($rezultat);
Rezultat (cu un server MySQL și tabelul produse de mai sus)
Rânduri găsite: 0
Greșeli frecvente
- Folosești textul protejat fără ghilimele:
WHERE id = $sigur. Un text ca1 OR 1=1nu conține ghilimele, deci trece neschimbat. Pentru numere convertește cu(int)sau folosește interogări pregătite. - Folosești
addslashesîn loc de această funcție.addslashesnu ține cont de codarea conexiunii. - Afișezi textul protejat în pagină și apar bare inverse. Funcția este doar pentru SQL; pentru HTML folosește
htmlspecialchars.
Comenzi înrudite
mysqli_prepare: Pregătește o interogare SQL cu semne ? în loc de valori. Este metoda sigură împotriva SQL injection.mysqli_query: Trimite o interogare SQL către baza de date. Pentru SELECT returnează un rezultat din care citești rândurile.htmlspecialchars: Transformă caracterele speciale HTML în entități, ca textul să fie afișat în siguranță în pagină.