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