Ako zabrániť injekcii SQL v PHP (s obrázkami)

Obsah:

Ako zabrániť injekcii SQL v PHP (s obrázkami)
Ako zabrániť injekcii SQL v PHP (s obrázkami)

Video: Ako zabrániť injekcii SQL v PHP (s obrázkami)

Video: Ako zabrániť injekcii SQL v PHP (s obrázkami)
Video: Портал под телевизор!Скрытая подсветка!Секреты монтажа гипсокартона! 2024, Smieť
Anonim

Tento wikiHow vás naučí, ako zabrániť injekcii SQL pomocou pripravených príkazov v PHP. Injekcia SQL je dnes jednou z najbežnejších zraniteľností webových aplikácií. Pripravené príkazy používajú viazané parametre a nekombinujú premenné s reťazcami SQL, čo útočníkovi znemožňuje úpravu príkazu SQL.

Pripravené príkazy kombinujú premennú so zostaveným príkazom SQL, takže SQL a premenné sa odosielajú oddelene. Premenné sú potom interpretované ako obyčajné reťazce a nie sú súčasťou príkazu SQL. Použitím metód v nižšie uvedených krokoch nebudete musieť používať žiadne ďalšie techniky filtrovania injekcie SQL, ako napríklad mysql_real_escape_string ().

Kroky

Časť 1 z 2: Pochopenie SQL Injection

Krok 1. SQL Injection je typ chyby zabezpečenia v aplikáciách, ktoré používajú databázu SQL

Zraniteľnosť vzniká, keď je vstup užívateľa použitý vo vyhlásení SQL:

$ name = $ _GET ['užívateľské meno']; $ query = "VYBERTE heslo Z tbl_user WHERE name = '$ name'";

Krok 2. Hodnota, ktorú používateľ zadá do používateľského mena premennej URL, bude priradená k premennej $ name

Potom sa umiestni priamo do príkazu SQL, čo užívateľovi umožní príkaz SQL upraviť.

$ name = "admin 'ALEBO 1 = 1 -"; $ query = "VYBERTE heslo Z tbl_user WHERE name = '$ name'";

Krok 3. Databáza SQL potom prijme príkaz SQL nasledovne:

VYBERTE heslo OD tbl_users WHERE name = 'admin' ALEBO 1 = 1 - '

  • Toto je platný kód SQL, ale namiesto vrátenia jedného hesla používateľovi príkaz vráti všetky heslá v tabuľke tbl_user. Nie je to niečo, čo by ste vo svojich webových aplikáciách chceli.

    Časť 2 z 2: Použitie mySQLi na vytváranie pripravených vyhlásení

    2542820 1
    2542820 1

    Krok 1. Vytvorte dotaz mySQLi SELECT

    Pomocou nižšie uvedeného kódu VYBERTE údaje z tabuľky pomocou pripravených príkazov mySQLi.

    $ name = $ _GET ['užívateľské meno']; if ($ stmt = $ mysqli-> připravit ("VYBRAŤ heslo OD Tbl_users WHERE name =?")) {// Viazanie premennej na parameter ako reťazec. $ stmt-> bind_param ("s", $ name); // Vykonajte príkaz. $ stmt-> execute (); // Získajte premenné z dotazu. $ stmt-> bind_result ($ priechod); // Načítajte údaje. $ stmt-> fetch (); // Zobrazenie údajov. printf ("Heslo pre používateľa %s je %s / n", $ name, $ pass); // Zatvorte pripravený príkaz. $ stmt-> close (); }

    Poznámka: Premenná $ mysqli je objekt pripojenia mySQLi

    2542820 2
    2542820 2

    Krok 2. Vytvorte dopyt mySQLi INSERT

    Pomocou nižšie uvedeného kódu VLOŽTE údaje do tabuľky pomocou pripravených príkazov mySQLi.

    $ name = $ _GET ['užívateľské meno']; $ heslo = $ _GET ['heslo']; if ($ stmt = $ mysqli-> prepar ("INSERT INTO tbl_users (name, password) VALUES (?,?)"))) {// Väzba premenných k parametru ako reťazcov. $ stmt-> bind_param ("ss", $ meno, $ heslo); // Vykonajte príkaz. $ stmt-> execute (); // Zatvorte pripravený príkaz. $ stmt-> close (); }

    Poznámka: Premenná $ mysqli je objekt pripojenia mySQLi

    2542820 3
    2542820 3

    Krok 3. Vytvorte aktualizačný dotaz mySQLi

    Na aktualizáciu údajov v tabuľke pomocou pripravených príkazov mySQLi použite nižšie uvedený kód.

    $ name = $ _GET ['užívateľské meno']; $ heslo = $ _GET ['heslo']; if ($ stmt = $ mysqli-> prepar ("UPDATE tbl_users SET heslo =? WHERE name =?"))) {// Spojte premenné s parametrom ako reťazce. $ stmt-> bind_param ("ss", $ heslo, $ meno); // Vykonajte príkaz. $ stmt-> execute (); // Zatvorte pripravený príkaz. $ stmt-> close (); }

    Poznámka: Premenná $ mysqli je objekt pripojenia mySQLi

    2542820 4
    2542820 4

    Krok 4. Vytvorte dotaz mySQLi DELETE

    Nasledujúci skript popisuje, ako vymazať údaje z tabuľky pomocou príkazov pripravených pre mySQLi.

    $ name = $ _GET ['užívateľské meno']; $ heslo = $ _GET ['heslo']; if ($ stmt = $ mysqli-> prepar ("DELETE FROM tbl_users WHERE name =?"))) {// Spojte premennú s parametrom ako reťazec. $ stmt-> bind_param ("s", $ name); // Vykonajte príkaz. $ stmt-> execute (); // Zatvorte pripravený príkaz. $ stmt-> close (); }

Odporúča: