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