Kas yra SQL įpurškimas ir kaip išvengti PHP programų?

Taigi, jūsų manymu, jūsų SQL duomenų bazė yra efektyvi ir saugi nuo greito sunaikinimo? Na, SQL injekcija nesutinka!


Taip, tai yra greitas sunaikinimas, apie kurį mes kalbame, nes nenoriu atidaryti šio straipsnio, naudodamas įprastą nevykusią terminų „griežtinti saugą“ ir „užkirsti kelią kenkėjiškam prieigai“ terminologiją. SQL įpurškimas yra toks senas knygos triukas, kad visi, kiekvienas kūrėjas, apie tai žino labai gerai ir žino, kaip jo išvengti. Išskyrus tą vieną keistą laiką, kai jie slenka aukštyn, ir rezultatai negali būti nieko blogo.

Jei jau žinote, kas yra SQL įpurškimas, nedvejodami pereikite prie paskutinės straipsnio pusės. Tiems, kurie dar tik pradeda kurti internetinę svetainę ir svajoja imtis vyresnių vaidmenų, yra keletas įvadų..

Kas yra SQL įpurškimas?

Raktas norint suprasti SQL injekciją yra jo pavadinime: SQL + Injection. Žodis „injekcija“ neturi jokios medicininės reikšmės, veikiau yra veiksmažodžio „inject“ vartojimas. Kartu šie du žodžiai perteikia SQL įdėjimo į interneto programą idėją.

SQL įtraukimas į interneto programą. . . hmmm. . . Ar vis tiek tai nedarome? Taip, bet mes nenorime, kad užpuolikas tvarkytų mūsų duomenų bazę. Supraskime tai naudodamiesi pavyzdžiu.

Tarkime, kad kuriate tipinę PHP svetainę vietinei el. Prekybos parduotuvei, todėl nusprendėte pridėti tokią kontaktinę formą:

Tavo vardas

Tavo žinutė

Tarkime, kad failas send_message.php saugo viską duomenų bazėje, kad parduotuvių savininkai vėliau galėtų skaityti vartotojo pranešimus. Tai gali turėti tokį kodą:

<?php

$ name = $ _POST [‘vardas’];
$ message = $ _POST [‘message’];

// patikrinkite, ar šis vartotojas jau turi pranešimą
mysqli_query ($ konn, "PASIRINKITE * iš pranešimų, kuriuose vardas = vardas");

// Kitas kodas čia

Taigi pirmiausia bandote išsiaiškinti, ar šis vartotojas jau neturi neskaityto pranešimo. Užklausa SELECT * iš pranešimų, kuriuose vardas = $ vardas atrodo pakankamai paprastas, tiesa?

KELIAS!

Savo nekaltumu mes atvėrėme duris betarpiškam duomenų bazės sunaikinimui. Kad tai įvyktų, užpuolikas turi atitikti šias sąlygas:

  • Programa veikia SQL duomenų bazėje (šiandien beveik kiekviena programa yra)
  • Dabartinis duomenų bazės ryšys turi „redaguoti“ ir „ištrinti“ teises į duomenų bazę
  • Galima atspėti svarbių lentelių pavadinimus

Trečias punktas reiškia, kad dabar, kai užpuolikas žino, kad naudojate elektroninės prekybos parduotuvę, labai tikėtina, kad užsakymų duomenis kaupsite užsakymų lentelėje. Apsiginklavę tuo, užpuolikas turi pateikti tik savo vardą:

Džo; sutrumpinti įsakymai ;? Taip, pone! Pažiūrėkime, kokia užklausa taps, kai ją įvykdys PHP scenarijus:

PASIRINKITE * IŠ pranešimų, KUR vardas = Džo; sutrumpinti įsakymai;

Gerai, kad pirmojoje užklausos dalyje yra sintaksės klaida (jokių kabučių aplink „Joe“ nėra), tačiau kabliataškis verčia „MySQL“ variklį pradėti aiškinti naują: sutrumpinti užsakymus. Lygiai taip pat per vieną srautą dingo visa užsakymų istorija!

Dabar, kai žinote, kaip veikia „SQL injekcija“, laikas ieškoti, kaip ją sustabdyti. Sėkmingo SQL įpurškimo turi atitikti dvi sąlygos:

  1. PHP scenarijus turėtų modifikuoti / ištrinti duomenų bazės privilegijas. Manau, kad tai galioja visoms programoms, ir jūs negalėsite pritaikyti savo programų tik skaityti. Ir atspėkite, net jei pašalinsime visas modifikavimo privilegijas, SQL injekcija vis tiek gali leisti kam nors vykdyti SELECT užklausas ir peržiūrėti visą duomenų bazę, įskaitant neskelbtinus duomenis. Kitaip tariant, duomenų bazės prieigos lygio sumažinimas neveikia, ir jūsų programai to reikia.
  2. Vartotojo įvestis apdorojama. Vienintelis SQL įpurškimo būdas gali veikti, kai jūs priimate duomenis iš vartotojų. Vėlgi, nėra praktiška sustabdyti visus jūsų programos įvestis vien todėl, kad nerimaujate dėl SQL įvedimo.

SQL injekcijos prevencija PHP

Dabar, kaip užkirsti kelią SQL įvedimui, atsižvelgiant į tai, kad duomenų bazių jungtys, užklausos ir vartotojo įvestos dalys yra gyvenimo dalis? Laimei, tai gana paprasta ir tai padaryti yra du būdai: 1) sutvarkyti vartotojo įvestį ir 2) naudoti paruoštus teiginius.

Išvalykite vartotojo įvestį

Jei naudojate senesnę PHP versiją (5.5 ar senesnės versijos, o tai dažnai nutinka pasidalijamajam prieglobai), išmintinga paleisti visą savo vartotojo įvestą funkciją, vadinamą mysql_real_escape_string (). Iš esmės tai pašalina visus specialius eilutės simbolius, kad jie prarastų prasmę, kai juos naudoja duomenų bazė.

Pvz., Jei turite eilutę, pavyzdžiui, aš esu eilutė, užpuolikas gali naudoti vieną kabučių ženklą (‘) manipuliuoti kuriama duomenų bazės užklausa ir sukelti SQL injekciją. Vykdydamas ją per mysql_real_escape_string (), aš sukuriu eilutę, kuri prideda pasvirąjį brūkšnį prie vienos citatos, išvengdama jos. Dėl to visa eilutė dabar perduodama kaip nekenksminga eilutė į duomenų bazę, užuot dalyvavus atliekant manipuliacijas užklausa..

Šis požiūris turi vieną trūkumą: tai tikrai labai sena technika, naudojama kartu su senesnėmis prieigos prie duomenų bazių formomis PHP. Nuo 7-ojo PHP šios funkcijos net nebėra, todėl galime rasti kitą sprendimą.

Naudokite paruoštus teiginius

Parengti teiginiai yra būdas saugiau ir patikimiau pateikti užklausas duomenų bazėse. Idėja yra ta, kad užuot siųsdavę neapdorotą užklausą į duomenų bazę, pirmiausia pateikiame duomenų bazei užklausos, kurią mums siųs, struktūrą. Tai turime omenyje „rengdami“ pareiškimą. Parengę pareiškimą, mes perduodame informaciją kaip parametrizuotus įėjimus, kad duomenų bazė galėtų „užpildyti spragas“, įvesdami įvestis į užklausos struktūrą, kurią mes anksčiau išsiuntėme. Tai atima bet kokią ypatingą galią, kurią gali turėti įėjimai, todėl visame procese jie bus traktuojami kaip tik kintamieji (arba, jei jums tiks, naudingos apkrovos). Štai kaip atrodo paruošti pareiškimai:

<?php
$ serverio vardas = "vietinis dvasininkas";
$ vartotojo vardas = "Vartotojo vardas";
$ slaptažodis = "Slaptažodis";
$ dbname = "„myDB“";

// Sukurti ryšį
$ conn = naujas mysqli ($ serverio vardas, $ vartotojo vardas, $ slaptažodis, $ dbname);

// Patikrinkite ryšį
if ($ konn->connect_error) {
mirti ("Nepavyko prisijungti: " . $ konn->prisijungti_error);
}

// paruoškite ir įriškite
$ stmt = $ konn->paruošti ("ĮDĖTI Į „MyGuests“ (vardas, pavardė, el. Paštas) VERTĖS (?,?,?)");
$ stmt->bind_param ("sss", $ vardas, $ pavardė, $ el. paštas);

// nustatykite parametrus ir vykdykite
$ vardas = "Jonas";
$ pavardė = "Doe";
$ el. paštas = "[apsaugotas el. paštu]";
$ stmt->vykdyti ();

$ vardas = "Marija";
$ pavardė = "Moe";
$ el. paštas = "[apsaugotas el. paštu]";
$ stmt->vykdyti ();

$ vardas = "Džulje";
$ pavardė = "Dooley";
$ el. paštas = "[apsaugotas el. paštu]";
$ stmt->vykdyti ();

aidas "Nauji įrašai sukurti sėkmingai";

$ stmt->Uždaryti();
$ konn->Uždaryti();
?>

Aš žinau, kad procesas skamba nereikalingai sudėtingai, jei jūs dar nesate pasiruošę pareiškimams, tačiau idėja yra verta pastangų. Štai graži įžanga į tai.

Tiems, kurie jau yra susipažinę su PHP SKVN plėtiniu ir naudoja jį parengtiems teiginiams kurti, turiu nedidelę patarimą.

Įspėjimas: būkite atsargūs nustatydami SKVN

Naudodami SKVN duomenų bazės prieigai, mes galime įsijausti į klaidingą saugumo jausmą. „Na, aš naudoju SKVN. Dabar man nereikia galvoti apie nieką kitą “- taip paprastai mąstome. Tiesa, kad SKVN (arba „MySQLi“ parengtų teiginių) pakanka, kad būtų išvengta visų rūšių SQL įpurškimo atakų, tačiau ją nustatydami turite būti atsargūs. Įprasta tiesiog nukopijuoti ir įklijuoti kodą iš vadovėlių ar ankstesnių projektų ir judėti toliau, tačiau šis nustatymas gali panaikinti viską:

$ dbSijungimas->setAttribute (SKVN :: ATTR_EMULATE_PREPARES, tiesa);

Šis nustatymas reiškia, kad nurodoma SKVN mėgdžioti paruoštus teiginius, o ne faktiškai naudoti parengtų teiginių duomenų bazės funkciją. Todėl PHP siunčia paprastas užklausų eilutes į duomenų bazę, net jei jūsų kodas atrodo kaip sukuriantis paruoštus teiginius ir nustatantis parametrus. Kitaip tariant, jūs esate toks pat pažeidžiamas kaip SQL injekcija. ��

Sprendimas yra paprastas: įsitikinkite, kad ši emuliacija nustatyta kaip klaidinga.

$ dbSijungimas->setAttribute (SKVN :: ATTR_EMULATE_PREPARES, klaidinga);

Dabar PHP scenarijus yra priverstas naudoti paruoštus teiginius duomenų bazės lygiu, užkertant kelią visoms SQL injekcijoms.

Neleidžiama naudoti WAF

Ar žinote, kad taip pat galite apsaugoti interneto programas nuo SQL įpurškimo naudodami WAF (žiniatinklio programų užkardą)?

Na, ne tik SQL įterpimas, bet ir daugelis kitų 7 lygmens pažeidžiamumų, tokių kaip scenarijų sukūrimas keliose svetainėse, neveikiantis autentifikavimas, klastojimas kitose svetainėse, duomenų ekspozicija ir kt. Arba galite naudoti savarankišką priglobtą kompiuterį, pvz., „Mod Security“, arba debesį, kaip aprašytą toliau..

SQL įterpimas ir modernios PHP sistemos

SQL įpurškimas yra toks įprastas, toks lengvas, toks varginantis ir toks pavojingas, kad visos šiuolaikinės PHP žiniatinklio struktūros yra įmontuotos priešingai. Pvz., „WordPress“ turime $ wpdb->paruošti () funkciją, tuo tarpu jei naudojate MVC sistemą, tai daro visą nešvarų darbą jūsų labui ir jums net nereikia galvoti apie SQL injekcijos prevenciją. Šiek tiek erzina, kad naudodamiesi „WordPress“ turite aiškiai paruošti pareiškimus, bet, ei, tai yra „WordPress“, apie kurį mes kalbame. ��

Bet kokiu atveju, mano mintis, šiuolaikinės internetinių kūrėjų veislės neturi galvoti apie SQL įterpimą, todėl net nežino apie tokią galimybę. Iš esmės, net jei jie palieka vieną atvirą durį savo programoje (galbūt tai yra $ _GET užklausos parametras ir seni įpročiai sušaudyti nešvarią užklausą, rezultatas) gali būti katastrofiški. Taigi visada geriau skirti laiko pasinerti į pamatus.

Išvada

SQL įpurškimas yra labai nemalonus žiniatinklio programos išpuolis, tačiau jo galima lengvai išvengti. Kaip matėme šiame straipsnyje, būkite atsargūs tvarkydami vartotojo įvestį (beje, SQL įpurškimas nėra vienintelė grėsmė, kurią sukelia vartotojo įvestis) ir teiraudamiesi duomenų bazės, viskas, kas joje yra. Nepaisant to, mes ne visada dirbame užtikrindami žiniatinklio sistemos saugumą, todėl geriau žinoti apie tokio tipo išpuolius, o ne už juos atsisakyti..

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map