Denne wikiHow lærer dig, hvordan du forhindrer SQL -injektion ved hjælp af forberedte udsagn i PHP. SQL -injektion er en af de mest almindelige sårbarheder i webapplikationer i dag. Udarbejdede udsagn bruger bundne parametre og kombinerer ikke variabler med SQL -strenge, hvilket gør det umuligt for en hacker at ændre SQL -sætningen.
Udarbejdede udsagn kombinerer variablen med den kompilerede SQL -sætning, så SQL og variablerne sendes separat. Variablerne fortolkes derefter som blot strenge og ikke en del af SQL -sætningen. Ved hjælp af metoderne i nedenstående trin behøver du ikke at bruge andre SQL -indsprøjtningsfiltreringsteknikker, f.eks. Mysql_real_escape_string ().
Trin
Del 1 af 2: Forståelse af SQL Injection
Trin 1. SQL -indsprøjtning er en type sårbarhed i applikationer, der bruger en SQL -database
Sårbarheden opstår, når et brugerinput bruges i en SQL -erklæring:
$ name = $ _GET ['brugernavn']; $ query = "SELECT password FROM tbl_user WHERE name = '$ name'";
Trin 2. Den værdi, en bruger indtaster i URL -variablen brugernavn, tildeles variablen $ navn
Det placeres derefter direkte i SQL -sætningen, hvilket gør det muligt for brugeren at redigere SQL -sætningen.
$ name = "admin 'ELLER 1 = 1 -"; $ query = "SELECT password FROM tbl_user WHERE name = '$ name'";
Trin 3. SQL -databasen modtager derefter SQL -sætningen som følger:
VÆLG adgangskode FRA tbl_users HVOR navn = 'admin' ELLER 1 = 1 - '
-
Dette er gyldig SQL, men i stedet for at returnere en adgangskode til brugeren, returnerer sætningen alle adgangskoder i tabellen tbl_user. Dette er ikke noget, du vil have i dine webapplikationer.
Del 2 af 2: Brug af mySQLi til at oprette forberedte erklæringer
Trin 1. Opret mySQLi SELECT -forespørgslen
Brug nedenstående kode til at VÆLGE data fra en tabel ved hjælp af mySQLi Prepared Statements.
$ name = $ _GET ['brugernavn']; if ($ stmt = $ mysqli-> prepar ("SELECT password FROM tbl_users WHERE name =?")) {// Bind en variabel til parameteren som en streng. $ stmt-> bind_param ("s", $ navn); // Udfør erklæringen. $ stmt-> execute (); // Hent variablerne fra forespørgslen. $ stmt-> bind_result ($ pass); // Hent dataene. $ stmt-> hente (); // Vis dataene. printf ("Adgangskode til bruger %s er %s / n", $ navn, $ pass); // Luk den udarbejdede erklæring. $ stmt-> luk (); }
Bemærk: Variablen $ mysqli er mySQLi -forbindelsesobjektet
Trin 2. Opret mySQLi INSERT -forespørgslen
Brug nedenstående kode til at INSERT data i en tabel ved hjælp af mySQLi Prepared Statements.
$ name = $ _GET ['brugernavn']; $ password = $ _GET ['password']; hvis ($ stmt = $ mysqli-> prepar ("INSERT INTL tbl_users (name, password) VALUES (?,?)")) {// Bind variablerne til parameteren som strenge. $ stmt-> bind_param ("ss", $ navn, $ password); // Udfør erklæringen. $ stmt-> execute (); // Luk den udarbejdede erklæring. $ stmt-> luk (); }
Bemærk: Variablen $ mysqli er mySQLi -forbindelsesobjektet
Trin 3. Opret mySQLi UPDATE -forespørgslen
Brug nedenstående kode til at OPDATERE data i en tabel ved hjælp af mySQLi Prepared Statements.
$ name = $ _GET ['brugernavn']; $ password = $ _GET ['password']; if ($ stmt = $ mysqli-> prepar ("UPDATE tbl_users SET password =? WHERE name =?")) {// Bind variablerne til parameteren som strenge. $ stmt-> bind_param ("ss", $ password, $ name); // Udfør erklæringen. $ stmt-> execute (); // Luk den udarbejdede erklæring. $ stmt-> luk (); }
Bemærk: Variablen $ mysqli er mySQLi -forbindelsesobjektet
Trin 4. Opret mySQLi DELETE Query
Nedenstående script er, hvordan man sletter data fra en tabel ved hjælp af mySQLi Prepared Statements.
$ name = $ _GET ['brugernavn']; $ password = $ _GET ['password']; if ($ stmt = $ mysqli-> prepar ("DELETE FROM tbl_users WHERE name =?")) {// Bind variablen til parameteren som en streng. $ stmt-> bind_param ("s", $ navn); // Udfør erklæringen. $ stmt-> execute (); // Luk den udarbejdede erklæring. $ stmt-> luk (); }