Kako preprečiti vbrizgavanje SQL v PHP (s slikami)

Kazalo:

Kako preprečiti vbrizgavanje SQL v PHP (s slikami)
Kako preprečiti vbrizgavanje SQL v PHP (s slikami)

Video: Kako preprečiti vbrizgavanje SQL v PHP (s slikami)

Video: Kako preprečiti vbrizgavanje SQL v PHP (s slikami)
Video: Как зашить ДЫРКУ на куртке, джинсах, штанах, носке, футболке, чтобы не было видно 2024, Maj
Anonim

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

    2542820 1
    2542820 1

    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

    2542820 2
    2542820 2

    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

    2542820 3
    2542820 3

    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

    2542820 4
    2542820 4

    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 (); }

Priporočena: