Ky wikiHow ju mëson se si të parandaloni injektimin SQL duke përdorur Deklaratat e Përgatitura në PHP. Injeksioni SQL është një nga dobësitë më të zakonshme në aplikacionet në internet sot. Deklaratat e përgatitura përdorin parametra të lidhur dhe nuk kombinojnë variablat me vargjet SQL, duke e bërë të pamundur që një sulmues të modifikojë deklaratën SQL.
Deklaratat e përgatitura kombinojnë ndryshoren me deklaratën e përpiluar SQL, në mënyrë që SQL dhe variablat të dërgohen veçmas. Variablat pastaj interpretohen si vargje të thjeshta dhe jo pjesë e deklaratës SQL. Duke përdorur metodat në hapat e mëposhtëm, nuk do të keni nevojë të përdorni ndonjë teknikë tjetër filtrimi të injektimit SQL siç është mysql_real_escape_string ().
Hapa
Pjesa 1 nga 2: Kuptimi i injeksionit SQL
Hapi 1. Injektimi SQL është një lloj dobësie në aplikacionet që përdorin një bazë të dhënash SQL
Dobësia lind kur një hyrje e përdoruesit përdoret në një Deklaratë SQL:
$ name = $ _GET ['username']; $ query = "SELECT fjalëkalimin NGA tbl_user WHERE name = '$ name'";
Hapi 2. Vlera që një përdorues fut në emrin e përdoruesit të ndryshores URL do t'i caktohet emrit të ndryshores $
Pastaj vendoset drejtpërdrejt në deklaratën SQL, duke bërë të mundur që përdoruesi të redaktojë deklaratën SQL.
$ name = "admin 'OR 1 = 1 -"; $ query = "SELECT fjalëkalimin NGA tbl_user WHERE name = '$ name'";
Hapi 3. Baza e të dhënave SQL do të marrë deklaratën SQL si më poshtë:
ZGJIDH fjalëkalimin NGA tbl_users KU emri = 'admin' OR 1 = 1 - '
-
Kjo është SQL e vlefshme, por në vend që të kthejë një fjalëkalim për përdoruesin, deklarata do të kthejë të gjitha fjalëkalimet në tabelën tbl_user. Kjo nuk është diçka që dëshironi në aplikacionet tuaja në internet.
Pjesa 2 nga 2: Përdorimi i mySQLi për të krijuar deklarata të përgatitura
Hapi 1. Krijoni pyetjen mySQLi SELECT
Përdorni kodin më poshtë për të SELEKTUAR të dhënat nga një tabelë duke përdorur deklaratat e përgatitura të mySQLi.
$ name = $ _GET ['username']; nëse ($ stmt = $ mysqli-> përgatis ("ZGJIDH fjalëkalimin NGA tbl_users KU emri =?")) {// Lidh një ndryshore me parametrin si një varg. $ stmt-> bind_param ("s", $ name); // Ekzekutoni deklaratën. $ stmt-> ekzekuto (); // Merrni ndryshoret nga pyetja. $ stmt-> bind_result ($ pass); // Merrni të dhënat. $ stmt-> marr (); // Shfaq të dhënat. printf ("Fjalëkalimi për përdoruesin %s është %s / n", $ name, $ pass); // Mbyllni deklaratën e përgatitur. $ stmt-> mbyll (); }
Shënim: Ndryshorja $ mysqli është objekti i lidhjes mySQLi
Hapi 2. Krijoni pyetjen mySQLi INSERT
Përdorni kodin më poshtë për të futur të dhënat në një tabelë duke përdorur deklaratat e përgatitura të mySQLi.
$ name = $ _GET ['username']; $ password = $ _GET ['password']; nëse ($ stmt = $ mysqli-> përgatis ("INSERT INTO tbl_users (name, password) VLERAT (?,?)")) {// Lidh variablat me parametrin si vargje. $ stmt-> bind_param ("ss", $ name, $ password); // Ekzekutoni deklaratën. $ stmt-> ekzekuto (); // Mbyllni deklaratën e përgatitur. $ stmt-> mbyll (); }
Shënim: Ndryshorja $ mysqli është objekti i lidhjes mySQLi
Hapi 3. Krijoni pyetjen mySQLi UPDATE
Përdorni kodin e mëposhtëm për të PPRDITSUAR të dhënat në një tabelë duke përdorur deklaratat e përgatitura të mySQLi.
$ name = $ _GET ['username']; $ password = $ _GET ['password']; if ($ stmt = $ mysqli-> përgatis ("PPRDITSO tbl_users SET password =? KU emri =?")) {// Lidh variablat me parametrin si vargje. $ stmt-> bind_param ("ss", $ password, $ name); // Ekzekutoni deklaratën. $ stmt-> ekzekuto (); // Mbyllni deklaratën e përgatitur. $ stmt-> mbyll (); }
Shënim: Ndryshorja $ mysqli është objekti i lidhjes mySQLi
Hapi 4. Krijoni pyetjen mySQLi DELETE
Skenari i mëposhtëm është se si të fshihen të dhënat nga një tabelë duke përdorur deklaratat e përgatitura të mySQLi.
$ name = $ _GET ['username']; $ password = $ _GET ['password']; nëse ($ stmt = $ mysqli-> përgatis ("FSHIJ NGA tbl_users WHERE name =?")) {// Lidh ndryshoren me parametrin si një varg. $ stmt-> bind_param ("s", $ name); // Ekzekutoni deklaratën. $ stmt-> ekzekuto (); // Mbyllni deklaratën e përgatitur. $ stmt-> mbyll (); }