Sådan undgår du en SQL-indsprøjtning i PHP

Denne artikel vil lære dig, hvordan du undgår SQL-indsprøjtningsangreb ved hjælp af PHP-forberedte udtalelser. SQL injektion er en af ​​de mest almindelige typer af sårbarhed findes i web-applikationer i dag, men forberedte erklæringer anvender bundne parametre, der ikke passer variabler med SQL-strenge, hvilket gør det umuligt for angriberen at ændre SQL-sætningen.

De udarbejdede udsagn kombinerer variablerne med den forkompilerede SQL-sætning, og det får SQL-koden og variablerne til at blive sendt separat. Derefter fortolkes variablerne som rene strings, ikke som en del af SQL-sætningen. Ved at bruge metoderne nedenfor skal du ikke bruge andre SQL-indsprøjtnings-angrebsfiltreringsteknikker, såsom mysql_real_escape_string ().

trin

Del 1
Forståelse af en SQL-indsprøjtning

  1. 1
    En SQL-indsprøjtning er en type sårbarhed, der udnyttes i applikationer, der bruger en SQL-database. Sårbarheden opstår, når en brugerindgang bruges i en SQL-sætning:
    $ name = $ _GET [`brugernavn`] - $ query = "VÆLG adgangskode FRA tbl_user HVOR navn = `$ navn`" -
  2. Video: Week 10

    2
    Hvad brugeren skriver i URL-variablen brugernavn vil blive tildelt til variablen $ navn. Derefter bruges den direkte i SQL-sætningen, så brugeren kan ændre erklæringen.
    $ name = "admin" ELLER 1 = 1 - "- $ query =" VÆLG adgangskode FRA tbl_user HVOR navn = `$ navn` "-
  3. 3
    Således modtager SQL-databasen opgørelsen som følger:
    SELECT password fra tbl_users hvor navnet = `admin` eller 1 = 1 - `
    • Dette er gyldig SQL-kode, men i stedet for at returnere en brugers adgangskode, vil denne sætning returnere adgangskoden for alle adgangskoderne i tabellen tbl_user. Sikkert, du vil ikke have den slags sårbarhed i dine programmer.

Del 2
Brug mySQLi til at oprette forberedte udtalelser

Billede betegnet 2542820 1
1
Opret en SELECT-anmodning i mySQLi.
Brug koden nedenfor til at vælge (VÆLG) data fra en tabel ved hjælp af de udarbejdede udsagn fra mySQLi.



$ Name = $ _GET [ `username`] - hvis ($ stmt = $ mysqli-> forberede ( "SELECT FROM adgangskode tbl_users WHERE navn =")) {// Hent parameteren som en variabel streng. stmt- $> bind_param ( "s", $ navn) -. // Udfør sætningen $ stmt-> eksekvere () - // Hent anmodningen variabler $ stmt-> bind_result ($ pass) -. // Hent data stmt- $> fetch () -. // Vis den dados.printf ( "Password for brugeren% s er% s n", $ navn, $ pass) - // lukke forberedt erklæring $ stmt-> tæt på. () -}


  • Bemærk: Variablen $ mysqli er mySQLi-forbindelsesobjektet.
  • Billede betegnet 2542820 2
    2
    Oprettelse af en INSERT-anmodning i mySQLi. Brug koden herunder til at indsætte (INSERT) data i tabellen ved hjælp af de udarbejdede udsagn fra mySQLi.

    $ Name = $ _GET [ `username`] - $ password = $ _GET [ `password`] - hvis ($ stmt = $ mysqli-> forberede () "INSERT INTO tbl_users (navn, password) VALUES (,)?" ) {// Bind variablerne til parameteren som strenge. $ Stmt-> bind_param ( "ss", $ navn, $ password) - // Udfør sætningen stmt- $> eksekvere () -. // Luk forberedt erklæring $ stmt-> tæt () -.}


    • Bemærk: Variablen $ mysqli er mySQLi-forbindelsesobjektet.
  • Video: Week 8, continued

    Video: Week 10, continued

    Billede betegnet 2542820 3
    3

    Video: Section 10

    Oprettelse af en UPDATE anmodning i mySQLi. Brug koden nedenfor til at opdatere (UPDATE) dataene i en tabel ved hjælp af de udarbejdede udsagn fra mySQLi.

    $ Name = $ _GET [ `username`] - $ password = $ _GET [ `password`] - hvis ($ stmt = $ mysqli-> forberede ( "? SET UPDATE tbl_users password = WHERE navn =")) {// Match variablerne til parameteren som strenge. $ Stmt-> bind_param ( "ss", $ password, $ navn) - // Udfør sætningen stmt- $> eksekvere () -. // Luk forberedt erklæring $ stmt-> tæt () -.}

    • Bemærk: Variablen $ mysqli er forbindelsesobjektet til mySQLi.
  • Billede betegnet 2542820 4
    4
    Oprettelse af en DELETE anmodning i mySQLi. Brug scriptet herunder til at slette (DELETE) data fra en tabel ved hjælp af udarbejdede udsagn fra mySQLi.

    $ Name = $ _GET [ `username`] - $ password = $ _GET [ `password`] - hvis ($ stmt = $ mysqli-> forberede () "DELETE FROM tbl_users hvor navn =?") {// Hent den variable til parameteren som streng. stmt- $> bind_param ( "s", $ navn) -. // Udfør sætningen $ stmt-> eksekvere () - // Luk forberedt erklæring $ stmt-> tæt () -.}


    • Bemærk: Variablen $ mysqli er forbindelsesobjektet til mySQLi.
  • Del på sociale netværk:

    Relaterede
    © 2024 HodTari.com