Hvordan forhindre SQL -injeksjon i PHP (med bilder)

Innholdsfortegnelse:

Hvordan forhindre SQL -injeksjon i PHP (med bilder)
Hvordan forhindre SQL -injeksjon i PHP (med bilder)

Video: Hvordan forhindre SQL -injeksjon i PHP (med bilder)

Video: Hvordan forhindre SQL -injeksjon i PHP (med bilder)
Video: Гениальные Лайфхаки, Которые Действительно Работают ▶3 2024, Kan
Anonim

Denne wikiHow lærer deg hvordan du forhindrer SQL -injeksjon ved å bruke Prepared Statements i PHP. SQL -injeksjon er en av de vanligste sårbarhetene i webapplikasjoner i dag. Utarbeidede setninger bruker bundne parametere og kombinerer ikke variabler med SQL -strenger, noe som gjør det umulig for en angriper å endre SQL -setningen.

Prepared Statements kombinerer variabelen med den kompilerte SQL -setningen, slik at SQL og variablene sendes separat. Variablene blir deretter tolket som bare strenger og ikke en del av SQL -setningen. Ved å bruke metodene i trinnene nedenfor trenger du ikke å bruke andre SQL -injeksjonsfiltreringsteknikker, for eksempel mysql_real_escape_string ().

Trinn

Del 1 av 2: Forstå SQL -injeksjon

Trinn 1. SQL -injeksjon er en type sårbarhet i applikasjoner som bruker en SQL -database

Sårbarheten oppstår når en brukerinngang brukes i en SQL -setning:

$ name = $ _GET ['brukernavn']; $ query = "VELG passord FRA tbl_user WHERE name = '$ name'";

Trinn 2. Verdien en bruker angir i brukernavn for URL -variabelen vil bli tilordnet variabelen $ name

Den plasseres deretter direkte i SQL -setningen, noe som gjør det mulig for brukeren å redigere SQL -setningen.

$ name = "admin 'ELLER 1 = 1 -"; $ query = "VELG passord FRA tbl_user WHERE name = '$ name'";

Trinn 3. SQL -databasen vil deretter motta SQL -setningen som følger:

VELG passord FRA tbl_users WHERE name = 'admin' ELLER 1 = 1 - '

  • Dette er gyldig SQL, men i stedet for å returnere ett passord for brukeren, vil setningen returnere alle passordene i tabellen tbl_user. Dette er ikke noe du vil ha i webapplikasjonene dine.

    Del 2 av 2: Bruke mySQLi til å lage utarbeidede utsagn

    2542820 1
    2542820 1

    Trinn 1. Opprett mySQLi SELECT Query

    Bruk koden nedenfor for å VELGE data fra en tabell ved hjelp av mySQLi Prepared Statements.

    $ name = $ _GET ['brukernavn']; if ($ stmt = $ mysqli-> prepar ("SELECT password FROM tbl_users WHERE name =?")) {// Bind en variabel til parameteren som en streng. $ stmt-> bind_param ("s", $ name); // Utfør uttalelsen. $ stmt-> execute (); // Få variablene fra spørringen. $ stmt-> bind_result ($ pass); // Hent dataene. $ stmt-> hente (); // Vis dataene. printf ("Passord for bruker %s er %s / n", $ navn, $ pass); // Lukk den forberedte uttalelsen. $ stmt-> close (); }

    Merk: Variabelen $ mysqli er mySQLi -tilkoblingsobjektet

    2542820 2
    2542820 2

    Trinn 2. Lag mySQLi INSERT -spørringen

    Bruk koden nedenfor for å Sette inn data i en tabell ved hjelp av mySQLi Prepared Statements.

    $ name = $ _GET ['brukernavn']; $ passord = $ _GET ['passord']; if ($ stmt = $ mysqli-> prepar ("INSERT INTL tbl_users (name, password) VALUES (?,?)"))) {// Bind variablene til parameteren som strenger. $ stmt-> bind_param ("ss", $ navn, $ passord); // Utfør uttalelsen. $ stmt-> execute (); // Lukk den forberedte uttalelsen. $ stmt-> close (); }

    Merk: Variabelen $ mysqli er mySQLi -tilkoblingsobjektet

    2542820 3
    2542820 3

    Trinn 3. Opprett mySQLi UPDATE -spørringen

    Bruk koden nedenfor for å OPPDATERE data i en tabell ved hjelp av mySQLi Prepared Statements.

    $ name = $ _GET ['brukernavn']; $ passord = $ _GET ['passord']; if ($ stmt = $ mysqli-> prepar ("UPDATE tbl_users SET password =? WHERE name =?")) {// Bind variablene til parameteren som strenger. $ stmt-> bind_param ("ss", $ passord, $ navn); // Utfør uttalelsen. $ stmt-> execute (); // Lukk den forberedte uttalelsen. $ stmt-> lukk (); }

    Merk: Variabelen $ mysqli er mySQLi -tilkoblingsobjektet

    2542820 4
    2542820 4

    Trinn 4. Opprett mySQLi DELETE Query

    Skriptet nedenfor er hvordan du sletter data fra en tabell ved hjelp av mySQLi Prepared Statements.

    $ name = $ _GET ['brukernavn']; $ passord = $ _GET ['passord']; if ($ stmt = $ mysqli-> prepar ("DELETE FROM tbl_users WHERE name =?")) {// Bind variabelen til parameteren som en streng. $ stmt-> bind_param ("s", $ name); // Utfør uttalelsen. $ stmt-> execute (); // Lukk den forberedte uttalelsen. $ stmt-> close (); }

Anbefalt: