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