Ta wikiHow vas uči, kako preprečiti injiciranje SQL z uporabo pripravljenih izjav v PHP. Injekcija SQL je ena najpogostejših ranljivosti današnjih spletnih aplikacij. Pripravljene izjave uporabljajo vezane parametre in ne združujejo spremenljivk z nizi SQL, zaradi česar napadalec ne more spremeniti stavka SQL.
Pripravljene izjave združujejo spremenljivko s sestavljenim stavkom SQL, tako da se SQL in spremenljivke pošljeta ločeno. Spremenljivke se nato razlagajo samo kot nizi in niso del stavka SQL. Z uporabo metod v spodnjih korakih vam ne bo treba uporabiti drugih tehnik filtriranja injekcij SQL, kot je mysql_real_escape_string ().
Koraki
1. del 2: Razumevanje vbrizgavanja SQL
Korak 1. Injekcija SQL je vrsta ranljivosti v aplikacijah, ki uporabljajo bazo podatkov SQL
Ranljivost nastane, ko se v stavku SQL uporabi uporabniški vnos:
$ name = $ _GET ['uporabniško ime']; $ query = "SELECT password FROM tbl_user WHERE name = '$ name'";
Korak 2. Vrednost, ki jo uporabnik vnese v spremenljivko URL, bo dodeljena spremenljivki $ name
Nato se vstavi neposredno v stavek SQL, kar uporabniku omogoča urejanje stavka SQL.
$ name = "admin 'ALI 1 = 1 -"; $ query = "SELECT password FROM tbl_user WHERE name = '$ name'";
Korak 3. Baza podatkov SQL bo nato prejela stavek SQL na naslednji način:
IZBERI geslo FROM tbl_users WHERE name = 'admin' ALI 1 = 1 - '
-
To je veljaven SQL, vendar namesto da vrne eno geslo za uporabnika, bo stavek vrnil vsa gesla v tabeli tbl_user. Tega v svojih spletnih aplikacijah ne želite.
2. del 2: Uporaba mySQLi za ustvarjanje pripravljenih izjav
Korak 1. Ustvarite poizvedbo mySQLi SELECT
Uporabite spodnjo kodo, da izberete podatke iz tabele z uporabo pripravljenih izjav mySQLi.
$ name = $ _GET ['uporabniško ime']; if ($ stmt = $ mysqli-> Prepare ("SELECT password FROM tbl_users WHERE name =?")) {// Vezavo spremenljivke na parameter kot niz. $ stmt-> bind_param ("s", $ name); // Izvedi stavek. $ stmt-> execute (); // Pridobite spremenljivke iz poizvedbe. $ stmt-> bind_result ($ pass); // Pridobite podatke. $ stmt-> fetch (); // Prikaz podatkov. printf ("Geslo za uporabnika %s je %s / n", $ name, $ pass); // Zaprite pripravljeno izjavo. $ stmt-> close (); }
Opomba: Spremenljivka $ mysqli je povezovalni objekt mySQLi
Korak 2. Ustvarite poizvedbo mySQLi INSERT
S spodnjo kodo vstavite podatke v tabelo z uporabo pripravljenih izjav mySQLi.
$ name = $ _GET ['uporabniško ime']; $ password = $ _GET ['geslo']; if ($ stmt = $ mysqli-> Prepare ("INSERT INTO tbl_users (name, password) VALUES (?,?)")) {// Vezavo spremenljivk na parameter kot nizov. $ stmt-> bind_param ("ss", $ name, $ geslo); // Izvedi stavek. $ stmt-> execute (); // Zaprite pripravljeno izjavo. $ stmt-> close (); }
Opomba: spremenljivka $ mysqli je povezovalni objekt mySQLi
Korak 3. Ustvarite poizvedbo za posodobitev mySQLi
Uporabite spodnjo kodo za posodobitev podatkov v tabeli z uporabo pripravljenih izjav mySQLi.
$ name = $ _GET ['uporabniško ime']; $ password = $ _GET ['geslo']; if ($ stmt = $ mysqli-> Prepare ("UPDATE tbl_users SET password =? WHERE name =?")) {// Vezava spremenljivk na parameter kot nizov. $ stmt-> bind_param ("ss", $ geslo, $ name); // Izvedi stavek. $ stmt-> execute (); // Zaprite pripravljeno izjavo. $ stmt-> close (); }
Opomba: Spremenljivka $ mysqli je povezovalni objekt mySQLi
Korak 4. Ustvarite poizvedbo DELETE mySQLi
Spodnji skript prikazuje, kako izbrišete podatke iz tabele z uporabo pripravljenih izjav mySQLi.
$ name = $ _GET ['uporabniško ime']; $ password = $ _GET ['geslo']; if ($ stmt = $ mysqli-> Prepare ("DELETE FROM tbl_users WHERE name =?")) {// Vezavo spremenljivke na parameter kot niz. $ stmt-> bind_param ("s", $ name); // Izvedi stavek. $ stmt-> execute (); // Zaprite pripravljeno izjavo. $ stmt-> close (); }