Tento wikiHow vás naučí, jak zabránit injekci SQL pomocí připravených příkazů v PHP. Injekce SQL je dnes jednou z nejběžnějších chyb zabezpečení webových aplikací. Připravené příkazy používají vázané parametry a nekombinují proměnné s řetězci SQL, což útočníkovi znemožňuje upravit příkaz SQL.
Připravené příkazy kombinují proměnnou se zkompilovaným příkazem SQL, takže SQL a proměnné jsou odesílány samostatně. Proměnné jsou pak interpretovány jako pouhé řetězce a nejsou součástí příkazu SQL. Pomocí metod v níže uvedených krocích nebudete muset používat žádné jiné techniky filtrování injekce SQL, jako je mysql_real_escape_string ().
Kroky
Část 1 ze 2: Porozumění SQL Injection
Krok 1. SQL Injection je typ chyby zabezpečení v aplikacích, které používají databázi SQL
Tato chyba zabezpečení vzniká, když je v příkazu SQL použit vstup uživatele:
$ name = $ _GET ['uživatelské jméno']; $ query = "VYBRAT heslo Z tbl_user WHERE name = '$ name'";
Krok 2. Hodnota, kterou uživatel zadá do uživatelského jména proměnné URL, bude přiřazena proměnné $ name
Poté je umístěn přímo do příkazu SQL, což uživateli umožňuje upravit příkaz SQL.
$ name = "admin 'NEBO 1 = 1 -"; $ query = "VYBRAT heslo Z tbl_user WHERE name = '$ name'";
Krok 3. Databáze SQL poté obdrží příkaz SQL následujícím způsobem:
VYBRAT heslo OD tbl_users WHERE name = 'admin' NEBO 1 = 1 - '
-
Toto je platné SQL, ale namísto vrácení jednoho hesla pro uživatele vrátí příkaz všechna hesla v tabulce tbl_user. To ve svých webových aplikacích nechcete.
Část 2 ze 2: Použití mySQLi k vytváření připravených prohlášení
Krok 1. Vytvořte dotaz mySQLi SELECT
Pomocí níže uvedeného kódu VYBERTE data z tabulky pomocí připravených příkazů mySQLi.
$ name = $ _GET ['uživatelské jméno']; if ($ stmt = $ mysqli-> připravit ("VYBRAT heslo OD tbl_users WHERE name =?")) {// Váže proměnnou k parametru jako řetězec. $ stmt-> bind_param ("s", $ name); // Proveďte příkaz. $ stmt-> execute (); // Získejte proměnné z dotazu. $ stmt-> bind_result ($ průchod); // Načíst data. $ stmt-> fetch (); // Zobrazení dat. printf ("Heslo uživatele %s je %s / n", $ name, $ pass); // Zavřete připravený příkaz. $ stmt-> close (); }
Poznámka: Proměnná $ mysqli je objekt připojení mySQLi
Krok 2. Vytvořte mySQLi INSERT Query
Pomocí níže uvedeného kódu VLOŽTE data do tabulky pomocí připravených příkazů mySQLi.
$ name = $ _GET ['uživatelské jméno']; $ heslo = $ _GET ['heslo']; if ($ stmt = $ mysqli-> prepar ("INSERT INTO tbl_users (name, password) VALUES (?,?)"))) {// Váže proměnné k parametru jako řetězce. $ stmt-> bind_param ("ss", $ name, $ heslo); // Proveďte příkaz. $ stmt-> execute (); // Zavřete připravený příkaz. $ stmt-> close (); }
Poznámka: Proměnná $ mysqli je objekt připojení mySQLi
Krok 3. Vytvořte dotaz mySQLi UPDATE
Pomocí níže uvedeného kódu AKTUALIZUJTE data v tabulce pomocí připravených příkazů mySQLi.
$ name = $ _GET ['uživatelské jméno']; $ heslo = $ _GET ['heslo']; if ($ stmt = $ mysqli-> připravit ("UPDATE tbl_users SET heslo =? WHERE name =?")) {// Spojte proměnné s parametrem jako řetězce. $ stmt-> bind_param ("ss", $ heslo, $ jméno); // Proveďte příkaz. $ stmt-> execute (); // Zavřete připravený příkaz. $ stmt-> close (); }
Poznámka: Proměnná $ mysqli je objekt připojení mySQLi
Krok 4. Vytvořte dotaz mySQLi DELETE
Níže uvedený skript popisuje, jak odstranit data z tabulky pomocí příkazů připravených pro mySQLi.
$ name = $ _GET ['uživatelské jméno']; $ heslo = $ _GET ['heslo']; if ($ stmt = $ mysqli-> prepar ("DELETE FROM tbl_users WHERE name =?"))) {// Váže proměnnou k parametru jako řetězec. $ stmt-> bind_param ("s", $ name); // Proveďte příkaz. $ stmt-> execute (); // Zavřete připravený příkaz. $ stmt-> close (); }