SQL -injektion estäminen PHP: ssä (kuvilla)

Sisällysluettelo:

SQL -injektion estäminen PHP: ssä (kuvilla)
SQL -injektion estäminen PHP: ssä (kuvilla)

Video: SQL -injektion estäminen PHP: ssä (kuvilla)

Video: SQL -injektion estäminen PHP: ssä (kuvilla)
Video: Гениальные Лайфхаки, Которые Действительно Работают ▶3 2024, Saattaa
Anonim

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

    2542820 1
    2542820 1

    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

    2542820 2
    2542820 2

    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

    2542820 3
    2542820 3

    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

    2542820 4
    2542820 4

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

Suositeltava: