Tämä wikiHow opettaa sinulle, miten voit estää SQL -ruiskutuksen PHP: n valmisteltujen lausuntojen avulla. SQL -injektio on nykyään yksi yleisimmistä haavoittuvuuksista verkkosovelluksissa. Valmistetut käskyt käyttävät sidottuja parametreja eivätkä yhdistä muuttujia SQL -merkkijonojen kanssa, minkä vuoksi hyökkääjä ei voi muokata SQL -käskyä.
Valmistetut lausunnot yhdistävät muuttujan koottuun SQL -käskyyn, joten SQL ja muuttujat lähetetään erikseen. Muuttujat tulkitaan sitten pelkkinä merkkijonoina eikä osana SQL -käskyä. Käyttämällä alla olevien vaiheiden menetelmiä sinun ei tarvitse käyttää muita SQL -ruiskutussuodatustekniikoita, kuten mysql_real_escape_string ().
Askeleet
Osa 1/2: SQL -injektion ymmärtäminen
Vaihe 1. SQL -injektio on eräänlainen haavoittuvuus sovelluksissa, jotka käyttävät SQL -tietokantaa
Haavoittuvuus syntyy, kun käyttäjän syötettä käytetään SQL -lauseessa:
$ name = $ _GET ['käyttäjänimi']; $ query = "VALITSE salasana FROM tbl_user WHERE name = '$ name'";
Vaihe 2. Arvo, jonka käyttäjä syöttää URL -muuttujan käyttäjätunnukseen, määritetään muuttujalle $ name
Se sijoitetaan sitten suoraan SQL -käskyyn, jolloin käyttäjä voi muokata SQL -käskyä.
$ name = "admin 'TAI 1 = 1 -"; $ query = "VALITSE salasana FROM tbl_user WHERE name = '$ name'";
Vaihe 3. SQL -tietokanta vastaanottaa SQL -käskyn seuraavasti:
VALITSE salasana FROM tbl_users WHERE name = 'admin' TAI 1 = 1 - '
-
Tämä on kelvollinen SQL, mutta sen sijaan, että palauttaisi yhtä salasanaa käyttäjälle, lause palauttaa kaikki taulukon tbl_user salasanat. Tämä ei ole jotain mitä haluat verkkosovelluksillesi.
Osa 2/2: Valmisteltujen lausuntojen luominen mySQLi: n avulla
Vaihe 1. Luo mySQLi SELECT -kysely
Valitse alla olevan koodin avulla tiedot taulukosta mySQLi Prepared Statements -ohjelman avulla.
$ name = $ _GET ['käyttäjänimi']; if ($ stmt = $ mysqli-> valmistella ("SELECT password from FROM tbl_users WHERE name =?")) {// Sido muuttuja merkkijonona. $ stmt-> bind_param ("s", $ nimi); // Suorita lause. $ stmt-> suorita (); // Hae muuttujat kyselystä. $ stmt-> bind_result ($ pass); // Hae tiedot. $ stmt-> hae (); // Näytä tiedot. printf ("Käyttäjän %s salasana on %s / n", $ nimi, $ pass); // Sulje valmis lausunto. $ stmt-> sulje (); }
Huomautus: Muuttuja $ mysqli on mySQLi -yhteysobjekti
Vaihe 2. Luo mySQLi INSERT -kysely
LISÄÄ tiedot taulukkoon käyttämällä alla olevaa koodia mySQLi Prepared Statements -ohjelman avulla.
$ name = $ _GET ['käyttäjänimi']; $ password = $ _GET ['salasana']; if ($ stmt = $ mysqli-> valmistella ("INSERT INTO tbl_users (nimi, salasana) ARVOT (?,?)")) {// Sido muuttujat parametriksi merkkijonoina. $ stmt-> bind_param ("ss", $ nimi, $ salasana); // Suorita lause. $ stmt-> suorita (); // Sulje valmis lausunto. $ stmt-> sulje (); }
Huomautus: Muuttuja $ mysqli on mySQLi -yhteysobjekti
Vaihe 3. Luo mySQLi UPDATE Query
Päivitä alla olevan koodin avulla taulukon tiedot käyttämällä mySQLi Prepared Statements -sovellusta.
$ name = $ _GET ['käyttäjänimi']; $ password = $ _GET ['salasana']; if ($ stmt = $ mysqli-> valmistella ("UPDATE tbl_users SET password =? WHERE name =?")) {// Sido muuttujat parametriksi merkkijonoina. $ stmt-> bind_param ("ss", $ salasana, $ nimi); // Suorita lause. $ stmt-> suorita (); // Sulje valmis lausunto. $ stmt-> sulje (); }
Huomautus: Muuttuja $ mysqli on mySQLi -yhteysobjekti
Vaihe 4. Luo mySQLi DELETE -kysely
Alla oleva skripti on kuinka poistaa tietoja taulukosta mySQLi Prepared Statements -ohjelman avulla.
$ name = $ _GET ['käyttäjänimi']; $ password = $ _GET ['salasana']; if ($ stmt = $ mysqli-> valmistella ("DELETE FROM tbl_users WHERE name =?")) {// Sido muuttuja parametriin merkkijonona. $ stmt-> bind_param ("s", $ nimi); // Suorita lause. $ stmt-> suorita (); // Sulje valmis lausunto. $ stmt-> sulje (); }