Acest wikiHow vă învață cum să preveniți injecția SQL folosind Instrucțiuni pregătite în PHP. Injecția SQL este una dintre cele mai frecvente vulnerabilități în aplicațiile Web de astăzi. Instrucțiunile pregătite folosesc parametri legați și nu combină variabile cu șiruri SQL, ceea ce face imposibil pentru un atacator să modifice instrucțiunea SQL.
Instrucțiunile pregătite combină variabila cu instrucțiunea SQL compilată, astfel încât SQL și variabilele să fie trimise separat. Variabilele sunt apoi interpretate ca simple șiruri și nu fac parte din instrucțiunea SQL. Folosind metodele din pașii de mai jos, nu va trebui să utilizați alte tehnici de filtrare prin injecție SQL, cum ar fi mysql_real_escape_string ().
Pași
Partea 1 din 2: Înțelegerea injecției SQL
Pasul 1. Injecția SQL este un tip de vulnerabilitate în aplicațiile care utilizează o bază de date SQL
Vulnerabilitatea apare atunci când o intrare de utilizator este utilizată într-o instrucțiune SQL:
$ nume = $ _GET ['nume de utilizator']; $ query = "SELECTARE PAROLĂ DIN tbl_user WHERE nume = '$ nume'";
Pasul 2. Valoarea introdusă de un utilizator în numele de utilizator al variabilei URL va fi atribuită variabilei $ name
Apoi este plasat direct în instrucțiunea SQL, făcând posibil ca utilizatorul să editeze instrucțiunea SQL.
$ nume = "administrator 'SAU 1 = 1 -"; $ query = "SELECTARE PAROLĂ DIN tbl_user WHERE nume = '$ nume'";
Pasul 3. Baza de date SQL va primi apoi instrucțiunea SQL după cum urmează:
ALEGEȚI parola DE LA tbl_users WHERE nume = 'admin' SAU 1 = 1 - '
-
Acesta este SQL valid, dar în loc să returneze o parolă pentru utilizator, instrucțiunea va returna toate parolele din tabelul tbl_user. Acest lucru nu este ceva ce doriți în aplicațiile dvs. web.
Partea 2 din 2: Utilizarea mySQLi pentru a crea declarații pregătite
Pasul 1. Creați interogarea mySQLi SELECT
Utilizați codul de mai jos pentru a SELEGE datele dintr-un tabel folosind instrucțiunile pregătite mySQLi.
$ nume = $ _GET ['nume de utilizator']; if ($ stmt = $ mysqli-> prepare ("SELECT parola FROM tbl_users WHERE name =?")) {// Legați o variabilă la parametru ca un șir. $ stmt-> bind_param ("s", $ nume); // Executați instrucțiunea. $ stmt-> execute (); // Obțineți variabilele din interogare. $ stmt-> bind_result ($ pass); // Aduceți datele. $ stmt-> fetch (); // Afișați datele. printf ("Parola pentru utilizatorul% s este% s / n", $ name, $ pass); // Închideți declarația pregătită. $ stmt-> close (); }
Notă: Variabila $ mysqli este obiectul de conexiune mySQLi
Pasul 2. Creați interogarea mySQLi INSERT
Utilizați codul de mai jos pentru a INSERA datele într-un tabel folosind declarațiile pregătite mySQLi.
$ nume = $ _GET ['nume de utilizator']; $ parola = $ _GET ['parola']; if ($ stmt = $ mysqli-> prepare ("INSERT INTO tbl_users (name, password) VALUES (?,?)")) {// Legați variabilele la parametru ca șiruri. $ stmt-> bind_param ("ss", $ nume, $ parolă); // Executați instrucțiunea. $ stmt-> execute (); // Închideți declarația pregătită. $ stmt-> close (); }
Notă: Variabila $ mysqli este obiectul de conexiune mySQLi
Pasul 3. Creați interogarea mySQLi UPDATE
Utilizați codul de mai jos pentru a ACTUALIZA datele într-un tabel utilizând declarațiile pregătite mySQLi.
$ nume = $ _GET ['nume de utilizator']; $ parolă = $ _GET ['parolă']; if ($ stmt = $ mysqli-> prepare ("UPDATE tbl_users SET password =? WHERE name =?")) {// Legați variabilele la parametru ca șiruri. $ stmt-> bind_param ("ss", $ parolă, $ nume); // Executați instrucțiunea. $ stmt-> execute (); // Închideți declarația pregătită. $ stmt-> close (); }
Notă: Variabila $ mysqli este obiectul de conexiune mySQLi
Pasul 4. Creați interogarea mySQLi DELETE
Scriptul de mai jos este modul de ȘTERGERE a datelor dintr-un tabel folosind instrucțiunile pregătite mySQLi.
$ nume = $ _GET ['nume de utilizator']; $ parolă = $ _GET ['parolă']; if ($ stmt = $ mysqli-> prepare ("DELETE FROM tbl_users WHERE name =?")) {// Legați variabila de parametru ca un șir. $ stmt-> bind_param ("s", $ nume); // Executați instrucțiunea. $ stmt-> execute (); // Închideți declarația pregătită. $ stmt-> close (); }