Denne wikiHow lærer dig, hvordan man forhindrer SQL-indsprøjtning ved hjælp af forberedte udsagn i PHP. SQL-indsprøjtning er en af ​​de mest almindelige sårbarheder i webapplikationer i dag. Forberedte udtalelser bruger bundne parametre og kombinerer ikke variabler med SQL-strenge, hvilket gør det umuligt for en hacker at ændre SQL-sætningen.
Forberedte udtalelser kombinerer variablen med den kompilerede SQL-sætning, så SQL og variablerne sendes separat. Variablerne tolkes så som blot strenge og ikke en del af SQL-sætningen. Brug af metoderne i trinene nedenfor, behøver du ikke bruge andre SQL-indsprøjtningsfiltreringsteknikker som mysql_real_escape_string ().[1]

Første del af to:
Forståelse af SQL Injection

  1. 1 SQL Injection er en type sårbarhed i applikationer, der bruger en SQL-database. Sårbarheden opstår, når en brugerindgang bruges i en SQL-erklæring:
     $ navn = $ _GET['Username']; $ query = "VÆLG adgangskode FRA tbl_user HVOR navn = '$ navn' "; 
  2. 2 Værdien en bruger indtaster URL-variablen brugernavn vil blive tildelt til variablen $ navn. Det placeres derefter direkte i SQL-sætningen, hvilket gør det muligt for brugeren at redigere SQL-sætningen.
     $ navn = "admin" ELLER 1 = 1 - "; $ query = "VÆLG adgangskode FRA tbl_user HVOR navn = '$ navn' "; 
  3. 3 SQL-databasen modtager så SQL-sætningen som følger:
     VÆLG adgangskode FRA tbl_users HVOR navn = 'Admin' ELLER 1=1 -- ' 
    • Dette er gyldigt SQL, men i stedet for at returnere en adgangskode til brugeren returnerer sætningen alle passwords i tabellen tbl_user. Dette er ikke noget, du vil have i dine webapplikationer.

Del to af to:
Brug mySQLi til at oprette forberedte udtalelser

  1. 1 Opret mySQLi SELECT Query.
    Brug koden nedenfor til at VÆLGE data fra en tabel ved hjælp af mySQLi Prepared Statements.
     $ navn = $ _GET['Username']; hvis ($ stmt = $ MySQLi->forberede("VÆLG adgangskode FRA tbl_users HVOR navn =?"))  // Bind en variabel til parameteren som en streng.  $ stmt->bind_param("S", $ navn); // Udfør erklæringen. $ stmt->udføre(); // Få 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->tæt();  

    • Bemærk: Variablen $ MySQLi er mySQLi-forbindelsesobjektet.
  2. 2 Opret mySQLi INSERT Query. Brug koden nedenfor til at indsætte data i en tabel ved hjælp af mySQLi forberedte udtalelser.
     $ navn = $ _GET['Username']; $ adgangskode = $ _GET['adgangskode']; hvis ($ stmt = $ MySQLi->forberede("Indsæt i tbl_users (navn, kodeord) VÆRDIER (?,?)"))  // Bind variablerne til parameteren som strenge.  $ stmt->bind_param("Ss", $ navn, $ adgangskode); // Udfør erklæringen. $ stmt->udføre(); // Luk den udarbejdede erklæring. $ stmt->tæt();  

    • Bemærk: Variablen $ MySQLi er mySQLi-forbindelsesobjektet.
  3. 3 Opret mySQLi UPDATE Query. Brug koden nedenfor til UPDATE data i en tabel ved hjælp af mySQLi Prepared Statements.
     $ navn = $ _GET['Username']; $ adgangskode = $ _GET['adgangskode']; hvis ($ stmt = $ MySQLi->forberede("UPDATE tbl_users SET password =? HVOR navn =?"))  // Bind variablerne til parameteren som strenge.  $ stmt->bind_param("Ss", $ adgangskode, $ navn); // Udfør erklæringen. $ stmt->udføre(); // Luk den udarbejdede erklæring. $ stmt->tæt();  

    • Bemærk: Variablen $ MySQLi er mySQLi-forbindelsesobjektet.
  4. 4 Opret mySQLi DELETE Query. Det nedenstående script er, hvordan man sletter data fra et bord ved hjælp af mySQLi Prepared Statements.
     $ navn = $ _GET['Username']; $ adgangskode = $ _GET['adgangskode']; hvis ($ stmt = $ MySQLi->forberede("Slet fra tbl_users HVOR navn =?"))  // Bind variablen til parameteren som en streng.  $ stmt->bind_param("S", $ navn); // Udfør erklæringen. $ stmt->udføre(); // Luk den udarbejdede erklæring. $ stmt->tæt();  

    • Bemærk: Variablen $ MySQLi er mySQLi-forbindelsesobjektet.