See wikiHow õpetab teile, kuidas vältida SQL -i süstimist, kasutades PHP -s ettevalmistatud avaldusi. SQL -i süstimine on tänapäeval üks levinumaid haavatavusi veebirakendustes. Ettevalmistatud avaldused kasutavad seotud parameetreid ja ei ühenda muutujaid SQL -stringidega, mistõttu ründajal on võimatu muuta SQL -avaldust.
Ettevalmistatud avaldused ühendavad muutuja koostatud SQL -lausega, nii et SQL ja muutujad saadetakse eraldi. Muutujaid tõlgendatakse seejärel lihtsalt stringidena, mitte SQL -lause osana. Kasutades allpool toodud meetodeid, ei pea te kasutama muid SQL -i süstimise filtreerimistehnikaid, näiteks mysql_real_escape_string ().
Sammud
Osa 1 /2: SQL -i sisestamise mõistmine
Samm 1. SQL -i süstimine on SQL -andmebaasi kasutavate rakenduste haavatavuse tüüp
Haavatavus tekib siis, kui kasutaja sisendit kasutatakse SQL -i avalduses:
$ name = $ _GET ['kasutajanimi']; $ query = "VALI parool FROM tbl_user WHERE name = '$ name'";
Samm 2. Väärtus, mille kasutaja sisestab URL -i muutuja kasutajanimi, määratakse muutujale $ name
Seejärel paigutatakse see otse SQL -avaldusse, võimaldades kasutajal SQL -avaldust redigeerida.
$ name = "admin" VÕI 1 = 1 - "; $ query = "VALI parool FROM tbl_user WHERE name = '$ name'";
Samm 3. Seejärel saab SQL -andmebaas SQL -avalduse järgmiselt:
VALI parool FROM tbl_users WHERE nimi = 'admin' VÕI 1 = 1 - '
-
See on kehtiv SQL, kuid selle asemel, et tagastada kasutajale üks parool, tagastab lause kõik tabelis tbl_user olevad paroolid. See pole midagi, mida soovite oma veebirakendustes kasutada.
Osa 2 /2: MySQLi kasutamine koostatud avalduste loomiseks
Samm 1. Looge päring mySQLi SELECT
Kasutage allolevat koodi, et valida tabelist andmeid, kasutades mySQLi ettevalmistatud avaldusi.
$ name = $ _GET ['kasutajanimi']; if ($ stmt = $ mysqli-> prep ("VALI parool FROM tbl_users WHERE nimi =?")) {// Seo parameetrile muutuja stringina. $ stmt-> bind_param ("s", $ nimi); // Käivita avaldus. $ stmt-> käivita (); // Hankige muutujad päringust. $ stmt-> bind_result ($ pass); // Andmete toomine. $ stmt-> tuua (); // Kuva andmed. printf ("Kasutaja %s parool on %s / n", $ nimi, $ pass); // Sule koostatud avaldus. $ stmt-> sulge (); }
Märkus. Muutuja $ mysqli on mySQLi ühenduse objekt
Samm 2. Looge päring mySQLi INSERT
Kasutage allolevat koodi, et sisestada andmed tabelisse, kasutades mySQLi ettevalmistatud avaldusi.
$ name = $ _GET ['kasutajanimi']; $ password = $ _GET ['parool']; if ($ stmt = $ mysqli-> prep ("INSERT INTO tbl_users (nimi, parool) VÄÄRTUSED (?,?)")) {// Seo muutujad parameetriks stringidena. $ stmt-> bind_param ("ss", $ nimi, $ parool); // Käivita avaldus. $ stmt-> käivita (); // Sulgege ettevalmistatud avaldus. $ stmt-> sulge (); }
Märkus. Muutuja $ mysqli on mySQLi ühenduse objekt
Samm 3. Looge mySQLi UPDATE päring
Kasutage allolevat koodi, et värskendada tabelis olevaid andmeid, kasutades mySQLi ettevalmistatud avaldusi.
$ name = $ _GET ['kasutajanimi']; $ password = $ _GET ['parool']; if ($ stmt = $ mysqli-> prep ("UPDATE tbl_users SET password =? WHERE name =?")) {// Seo muutujad parameetriks stringidena. $ stmt-> bind_param ("ss", $ parool, $ nimi); // Käivita avaldus. $ stmt-> käivita (); // Sule koostatud avaldus. $ stmt-> sulge (); }
Märkus. Muutuja $ mysqli on mySQLi ühenduse objekt
Samm 4. Looge päring mySQLi DELETE
Allpool olev skript kirjeldab andmete kustutamist tabelist, kasutades mySQLi ettevalmistatud avaldusi.
$ name = $ _GET ['kasutajanimi']; $ password = $ _GET ['parool']; if ($ stmt = $ mysqli-> prep ("DELETE FROM tbl_users WHERE name =?")) {// Seo muutuja parameetriks stringina. $ stmt-> bind_param ("s", $ nimi); // Käivita avaldus. $ stmt-> käivita (); // Sule koostatud avaldus. $ stmt-> sulge (); }