Jak zabránit injekci SQL v PHP (s obrázky)

Obsah:

Jak zabránit injekci SQL v PHP (s obrázky)
Jak zabránit injekci SQL v PHP (s obrázky)

Video: Jak zabránit injekci SQL v PHP (s obrázky)

Video: Jak zabránit injekci SQL v PHP (s obrázky)
Video: ANDROID MÁ JEDNO SKRYTÉ NASTAVENÍ 🤖 2024, Smět
Anonim

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í

    2542820 1
    2542820 1

    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

    2542820 2
    2542820 2

    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

    2542820 3
    2542820 3

    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

    2542820 4
    2542820 4

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

Doporučuje: