Hur man förhindrar SQL -injektion i PHP (med bilder)

Innehållsförteckning:

Hur man förhindrar SQL -injektion i PHP (med bilder)
Hur man förhindrar SQL -injektion i PHP (med bilder)

Video: Hur man förhindrar SQL -injektion i PHP (med bilder)

Video: Hur man förhindrar SQL -injektion i PHP (med bilder)
Video: Гениальные Лайфхаки, Которые Действительно Работают ▶3 2024, Maj
Anonim

Denna wikiHow lär dig hur du förhindrar SQL -injektion med hjälp av förberedda uttalanden i PHP. SQL -injektion är en av de vanligaste sårbarheterna i webbapplikationer idag. Förberedda uttalanden använder bundna parametrar och kombinerar inte variabler med SQL -strängar, vilket gör det omöjligt för en angripare att ändra SQL -satsen.

Prepared Statements kombinerar variabeln med den sammanställda SQL -satsen, så att SQL och variablerna skickas separat. Variablerna tolkas sedan som bara strängar och inte en del av SQL -satsen. Med hjälp av metoderna i stegen nedan behöver du inte använda några andra SQL -injektionsfiltreringstekniker som mysql_real_escape_string ().

Steg

Del 1 av 2: Förstå SQL -injektion

Steg 1. SQL -injektion är en typ av sårbarhet i applikationer som använder en SQL -databas

Sårbarheten uppstår när en användarinmatning används i ett SQL -uttalande:

$ name = $ _GET ['användarnamn']; $ query = "VÄLJ lösenord FRÅN tbl_user WHERE name = '$ name'";

Steg 2. Det värde som en användare anger i URL -variabelns användarnamn tilldelas variabeln $ name

Den placeras sedan direkt i SQL -satsen, vilket gör det möjligt för användaren att redigera SQL -satsen.

$ name = "admin 'ELLER 1 = 1 -"; $ query = "VÄLJ lösenord FRÅN tbl_user WHERE name = '$ name'";

Steg 3. SQL -databasen får sedan SQL -satsen enligt följande:

VÄLJ lösenord FRÅN tbl_users VAR namn = 'admin' ELLER 1 = 1 - '

  • Detta är giltig SQL, men i stället för att returnera ett lösenord för användaren returnerar satsen alla lösenord i tabellen tbl_user. Detta är inte något du vill ha i dina webbapplikationer.

Del 2 av 2: Använda mySQLi för att skapa förberedda uttalanden

2542820 1
2542820 1

Steg 1. Skapa mySQLi SELECT -frågan

Använd koden nedan för att VÄLJ data från en tabell med mySQLi Prepared Statements.

$ name = $ _GET ['användarnamn']; if ($ stmt = $ mysqli-> prepar ("VÄLJ lösenord FRÅN tbl_användare VAR namn =?")) {// Bind en variabel till parametern som en sträng. $ stmt-> bind_param ("s", $ namn); // Utför uttalandet. $ stmt-> execute (); // Hämta variablerna från frågan. $ stmt-> bind_result ($ pass); // Hämta data. $ stmt-> hämta (); // Visa data. printf ("Lösenord för användare %s är %s / n", $ namn, $ pass); // Stäng det förberedda uttalandet. $ stmt-> close (); }

Obs! Variabeln $ mysqli är mySQLi -anslutningsobjektet

2542820 2
2542820 2

Steg 2. Skapa mySQLi INSERT -frågan

Använd koden nedan för att INSERT data i en tabell med mySQLi Prepared Statements.

$ name = $ _GET ['användarnamn']; $ lösenord = $ _GET ['lösenord']; if ($ stmt = $ mysqli-> prepar ("INSERT INTL tbl_users (name, password) VALUES (?,?)")) {// Bind variablerna till parametern som strängar. $ stmt-> bind_param ("ss", $ namn, $ lösenord); // Utför uttalandet. $ stmt-> execute (); // Stäng det förberedda uttalandet. $ stmt-> close (); }

Obs! Variabeln $ mysqli är mySQLi -anslutningsobjektet

2542820 3
2542820 3

Steg 3. Skapa mySQLi UPDATE -frågan

Använd koden nedan för att UPPDATERA data i en tabell med mySQLi Prepared Statements.

$ name = $ _GET ['användarnamn']; $ lösenord = $ _GET ['lösenord']; if ($ stmt = $ mysqli-> prepar ("UPDATE tbl_users SET password =? WHERE name =?")) {// Bind variablerna till parametern som strängar. $ stmt-> bind_param ("ss", $ lösenord, $ namn); // Utför uttalandet. $ stmt-> execute (); // Stäng det förberedda uttalandet. $ stmt-> close (); }

Obs! Variabeln $ mysqli är mySQLi -anslutningsobjektet

2542820 4
2542820 4

Steg 4. Skapa mySQLi DELETE -frågan

Skriptet nedan är hur man tar bort data från en tabell med mySQLi Prepared Statements.

$ name = $ _GET ['användarnamn']; $ lösenord = $ _GET ['lösenord']; if ($ stmt = $ mysqli-> prepar ("DELETE FROM tbl_users WHERE name =?")) {// Bind variabeln till parametern som en sträng. $ stmt-> bind_param ("s", $ namn); // Utför uttalandet. $ stmt-> execute (); // Stäng det förberedda uttalandet. $ stmt-> close (); }

Rekommenderad: