Ovaj wikiHow vas uči kako spriječiti ubrizgavanje SQL -a pomoću pripremljenih izjava u PHP -u. SQL injekcija jedna je od najčešćih ranjivosti današnjih web aplikacija. Pripremljene izjave koriste vezane parametre i ne kombiniraju varijable sa SQL nizovima, što onemogućuje napadaču izmjenu SQL izraza.
Pripremljeni izrazi kombiniraju varijablu s prevedenom SQL naredbom, tako da se SQL i varijable šalju zasebno. Varijable se tada tumače samo kao nizovi, a ne kao dio SQL izraza. Koristeći metode u koracima u nastavku, nećete morati koristiti bilo koju drugu tehniku filtriranja SQL injekcija, poput mysql_real_escape_string ().
Koraci
1. dio 2: Razumijevanje SQL ubrizgavanja
Korak 1. SQL Injection je vrsta ranjivosti u aplikacijama koje koriste SQL bazu podataka
Ranjivost nastaje kada se korisnički unos koristi u SQL izrazu:
$ name = $ _GET ['korisničko ime']; $ query = "SELECT password FROM tbl_user WHERE name = '$ name'";
Korak 2. Vrijednost koju korisnik unese u URL varijable korisničko ime bit će dodijeljena varijabli $ name
Zatim se stavlja izravno u SQL izraz, što korisniku omogućuje uređivanje SQL izraza.
$ name = "admin 'ILI 1 = 1 -"; $ query = "SELECT password FROM tbl_user WHERE name = '$ name'";
Korak 3. SQL baza podataka tada će primiti SQL izraz na sljedeći način:
ODABERITE lozinku OD tbl_users WHERE name = 'admin' ILI 1 = 1 - '
-
Ovo je valjani SQL, ali umjesto da vrati jednu lozinku za korisnika, izraz će vratiti sve lozinke u tablici tbl_user. To nije nešto što želite u svojim web aplikacijama.
Dio 2 od 2: Korištenje mySQLi za stvaranje pripremljenih izjava
Korak 1. Izradite upit za SELECT mySQLi
Upotrijebite donji kôd za ODABIR podataka iz tablice pomoću pripremljenih izjava mySQLi.
$ name = $ _GET ['korisničko ime']; if ($ stmt = $ mysqli-> pripremiti ("SELECT password FROM tbl_users WHERE name =?")) {// Vezite varijablu na parametar kao niz. $ stmt-> bind_param ("s", $ name); // Izvršite naredbu. $ stmt-> izvrši (); // Dohvaćanje varijabli iz upita. $ stmt-> bind_result ($ pass); // Dohvaćanje podataka. $ stmt-> fetch (); // Prikaz podataka. printf ("Zaporka za korisnika %s je %s / n", $ name, $ pass); // Zatvorite pripremljenu izjavu. $ stmt-> close (); }
Napomena: Varijabla $ mysqli je objekt povezivanja mySQLi
Korak 2. Izradite mySQLi INSERT upit
Upotrijebite donji kod za UMETANJE podataka u tablicu pomoću pripremljenih izjava mySQLi.
$ name = $ _GET ['korisničko ime']; $ password = $ _GET ['lozinka']; if ($ stmt = $ mysqli-> pripremiti ("INSERT INTO tbl_users (name, password) VALUES (?,?)"))) {// Vezite varijable za parametar kao nizove. $ stmt-> bind_param ("ss", $ name, $ lozinka); // Izvršite naredbu. $ stmt-> izvrši (); // Zatvorite pripremljenu izjavu. $ stmt-> close (); }
Napomena: Varijabla $ mysqli je objekt povezivanja mySQLi
Korak 3. Izradite upit za ažuriranje mySQLi
Upotrijebite donji kod za ažuriranje podataka u tablici pomoću pripremljenih izjava mySQLi.
$ name = $ _GET ['korisničko ime']; $ password = $ _GET ['lozinka']; if ($ stmt = $ mysqli-> pripremiti ("UPDATE tbl_users SET password =? WHERE name =?")) {// Vezite varijable za parametar kao nizove. $ stmt-> bind_param ("ss", $ lozinka, $ name); // Izvršite naredbu. $ stmt-> izvrši (); // Zatvorite pripremljenu izjavu. $ stmt-> close (); }
Napomena: Varijabla $ mysqli je objekt povezivanja mySQLi
Korak 4. Izradite mySQLi DELETE upit
Sljedeća skripta prikazuje način BRIŠENJA podataka iz tablice pomoću pripremljenih izjava mySQLi.
$ name = $ _GET ['korisničko ime']; $ password = $ _GET ['lozinka']; if ($ stmt = $ mysqli-> pripremiti ("DELETE FROM tbl_users WHERE name =?")) {// Vezati varijablu s parametrom kao niz. $ stmt-> bind_param ("s", $ name); // Izvršite naredbu. $ stmt-> izvršiti (); // Zatvorite pripremljenu izjavu. $ stmt-> close (); }