Hvað er SQL stungulyf og hvernig á að koma í veg fyrir í PHP forritum?

Svo þú heldur að SQL gagnagrunnurinn þinn sé afkastamikill og öruggur fyrir augnablik eyðingu? Jæja, SQL Injection er ósammála!


Já, það er augnablik eyðilegging sem við erum að tala um, vegna þess að ég vil ekki opna þessa grein með hinni venjulegu haltu hugtök „hert öryggi“ og „koma í veg fyrir illgjarn aðgang.“ SQL Injection er svo gamalt bragð í bókinni að allir, allir verktaki, vita mjög vel um hana og vita vel hvernig hægt er að koma í veg fyrir það. Nema í þetta eina skrýtna tíma þegar þeir renna upp og niðurstöðurnar geta verið ekkert nema hörmulegar.

Ef þú veist nú þegar hvað SQL Injection er skaltu ekki hika við að seinni hluta greinarinnar. En fyrir þá sem eru að koma upp á sviði þróunar vefa og dreyma um að taka að sér eldri hlutverk, þá er einhver kynning í röð.

Hvað er SQL Injection?

Lykillinn að því að skilja SQL Injection er í nafni þess: SQL + Injection. Orðið „innspýting“ hérna er ekki með neinar læknisfræðilegar tengingar, heldur er það notað sagnorðið „sprauta.“ Saman flytja þessi tvö orð þá hugmynd að setja SQL í netforrit.

Að setja SQL í vefforrit. . . hmmm. . . Er það ekki það sem við erum að gera samt? Já, en við viljum ekki að árásarmaður reki gagnagrunninn okkar. Við skulum skilja það með dæmi.

Við skulum segja að þú sért að byggja upp dæmigerða PHP vefsíðu fyrir staðbundna netverslun, svo þú ákveður að bæta við snertingareyðublaði eins og þessu:

Nafn þitt

Skilaboð þín

Við skulum gera ráð fyrir að skjalið send_message.php geymi allt í gagnagrunni svo að verslunareigendur geti lesið notendaskilaboð síðar. Það kann að vera með einhvern kóða eins og þennan:

<?php

$ name = $ _POST [‘name’];
$ skilaboð = $ _POST [‘skilaboð’];

// athugaðu hvort þessi notandi sé þegar með skilaboð
mysqli_query ($ teng, "VELJA * úr skilaboðum þar sem nafn = $ nafn");

// Annar kóða hér

Svo þú ert fyrst að reyna að sjá hvort þessi notandi er þegar með ólesin skilaboð. Fyrirspurnin SELECT * úr skilaboðum þar sem nafn = $ nafn virðist nógu einfalt, ekki satt?

Röng!

Í sakleysi okkar höfum við opnað dyrnar fyrir tafarlausri eyðingu gagnagrunnsins. Til að þetta gerist þarf árásarmaðurinn að hafa eftirfarandi skilyrði uppfyllt:

  • Forritið er keyrt í SQL gagnagrunni (í dag er næstum hvert forrit)
  • Núverandi gagnagrunnstenging hefur „breyta“ og „eyða“ heimildum í gagnagrunninum
  • Giska má á nöfn mikilvægu töflanna

Þriðja atriðið þýðir að nú þegar árásarmaðurinn veit að þú ert að reka verslun í e-verslun, þá ertu líklega að geyma pöntunargögnin í pöntunartöflu. Vopnaðir öllu þessu, sem allt sem árásarmaðurinn þarf að gera er að gefa þetta sem nafn þeirra:

Jói; styttu pantanir ;? Já herra! Við skulum sjá hvað fyrirspurnin verður þegar hún verður keyrð af PHP handritinu:

VELJA * FRÁ skeyti HVAR nafn = Jói; styttu pantanir;

Allt í lagi, fyrsti hluti fyrirspurnarinnar er með setningafræðilegan villu (engar tilvitnanir í kringum „Joe“), en hálfkistillinn neyðir MySQL vélina til að hefja túlkun á nýrri: styttu pantanir. Rétt eins og það, í einni sveiflu, er öll pöntunarsagan horfin!

Nú þegar þú veist hvernig SQL Injection virkar er kominn tími til að skoða hvernig á að stöðva það. Þau tvö skilyrði sem þarf að uppfylla til að ná árangri SQL innspýtingu eru:

  1. PHP handritið ætti að hafa breytt / eyða forréttindum í gagnagrunninum. Ég held að þetta eigi við um öll forrit og þú munt ekki geta gert forritin þín skrifleg. �� Og giska á hvað, jafnvel þó að við fjarlægjum öll breytt forréttindi, SQL sprautun getur samt leyft einhverjum að keyra SELECT fyrirspurnir og skoða alla gagnagrunninn, viðkvæm gögn innifalin. Með öðrum orðum, að draga úr aðgangsstigi gagnagrunns virkar ekki og umsókn þín þarfnast þess hvort sem er.
  2. Verið er að vinna úr inntak notanda. Eina leiðin sem SQL sprautun getur virkað er þegar þú ert að samþykkja gögn frá notendum. Enn og aftur er ekki raunhæft að stöðva öll inntak fyrir umsókn þína bara af því að þú hefur áhyggjur af SQL sprautun.

Að koma í veg fyrir SQL innspýtingu í PHP

Í ljósi þess að gagnagrunnstengingar, fyrirspurnir og inntak notenda eru hluti af lífinu, hvernig forðumst við SQL innspýting? Sem betur fer er það frekar einfalt og það eru tvær leiðir til að gera það: 1) hreinsa inntak notenda og 2) nota undirbúnar yfirlýsingar.

Hreinsið inntak notenda

Ef þú ert að nota eldri PHP útgáfu (5.5 eða lægri, og þetta gerist mikið á sameiginlegri hýsingu), þá er skynsamlegt að keyra öll notendanotkun þína í gegnum aðgerð sem kallast mysql_real_escape_string (). Í grundvallaratriðum, hvað það gerir það fjarlægir alla sérstafi í streng þannig að þeir missa merkingu sína þegar þeir eru notaðir í gagnagrunninum.

Til dæmis, ef þú ert með streng eins og ég er strengur, getur árásarmaðurinn notað tiltekna tilvitnunartáknið (‘) til að vinna með gagnagrunnsspurninguna sem er búin til og valdið SQL innspýtingu. Að keyra hann í gegnum mysql_real_escape_strring () framleiðir ég streng, sem bætir bakslag við eina tilvitnunina og sleppur því. Fyrir vikið fær nú allur strengurinn liðinn sem skaðlaus strengur í gagnagrunninn, í stað þess að geta tekið þátt í meðferð fyrirspurna.

Það er einn galli við þessa aðferð: þetta er virkilega gömul tækni sem fylgir eldri myndum aðgangs gagnagrunns í PHP. Frá og með PHP 7 er þessi aðgerð ekki einu sinni til lengur sem færir okkur í næstu lausn okkar.

Notaðu undirbúnar yfirlýsingar

Tilbúnar yfirlýsingar eru leið til að gera fyrirspurnir um gagnagrunn öruggari og áreiðanlegri. Hugmyndin er sú að í stað þess að senda hráu fyrirspurnina í gagnagrunninn, segjum við fyrst gagnagrunninum uppbyggingu fyrirspurnarinnar sem við munum senda. Þetta er það sem við áttum við með því að „undirbúa“ yfirlýsingu. Þegar yfirlýsing er útbúin, sendum við upplýsingarnar sem innlagðar aðföng svo að gagnagrunnurinn geti „fyllt eyðurnar“ með því að tengja aðföngin við fyrirspurnarskipulagið sem við sendum áður. Þetta tekur burt alla sérstakan kraft sem aðföngin geta haft, sem gerir það að verkum að þeir eru meðhöndlaðir sem aðeins breytur (eða álag, ef þú vilt) í öllu ferlinu. Svona líta útbúin yfirlýsingar út:

<?php
$ servername = "localhost";
$ notandanafn = "notandanafn";
$ lykilorð = "lykilorð";
$ dbname = "myDB";

// Búa til tengingu
$ conn = nýtt mysqli ($ servername, $ notendanafn, $ lykilorð, $ dbname);

// Athugaðu tengingu
ef ($ teng->connect_error) {
deyja("Tenging mistókst: " . $ teng->connect_error);
}

// undirbúið og bindið
$ stmt = $ teng->undirbúa ("Settu inn í MyGuests (fornafn, eftirnafn, tölvupóstur) GILDIR (?,?,?)");
$ stmt->bind_param ("sss", $ fornafn, $ eftirnafn, $ tölvupóstur);

// setja færibreytur og framkvæma
$ fornafn = "Jóhannes";
$ eftirnafn = "Doe";
$ tölvupóstur = "[varið með tölvupósti]";
$ stmt->framkvæma ();

$ fornafn = "María";
$ eftirnafn = "Moe";
$ tölvupóstur = "[varið með tölvupósti]";
$ stmt->framkvæma ();

$ fornafn = "Julie";
$ eftirnafn = "Dooley";
$ tölvupóstur = "[varið með tölvupósti]";
$ stmt->framkvæma ();

bergmál "Nýjar skrár búnar til";

$ stmt->nálægt ();
$ teng->nálægt ();
?>

Ég veit að ferlið hljómar óþarflega flókið ef þú ert nýr í tilbúnum yfirlýsingum en hugmyndin er vel þess virði. Hérna fín kynning á því.

Fyrir þá sem eru nú þegar búnir að þekkja PHO viðbótina og nota það til að búa til tilbúnar yfirlýsingar, þá hef ég lítið ráð.

Viðvörun: Vertu varkár þegar þú setur upp PDO

Þegar PDO er notað fyrir aðgang að gagnagrunni getum við sogast inn í ranga öryggistilfinningu. „Ah, jæja, ég er með PDO. Nú þarf ég ekki að hugsa um neitt annað “- svona gengur hugsun okkar almennt. Það er rétt að PDO (eða MySQLi undirbúin yfirlýsingar) dugar til að koma í veg fyrir alls konar SQL sprautuárásir, en þú verður að vera varkár þegar þú setur það upp. Algengt er að afrita og líma kóða frá kennsluefnum eða frá fyrri verkefnum þínum og halda áfram, en þessi stilling getur afturkallað allt:

$ dbTenging->setAttribute (PDO :: ATTR_EMULATE_PREPARES, satt);

Hvað þessi stilling gerir er að segja PDO að líkja eftir tilbúnum fullyrðingum frekar en að nota tilbúna yfirlýsingareiginleika gagnagrunnsins. Þess vegna sendir PHP einfalda fyrirspurnastreng í gagnagrunninn jafnvel þó að kóðinn þinn lítur út eins og hann er að búa til tilbúnar yfirlýsingar og stilla breytur og allt það. Með öðrum orðum, þú ert jafn viðkvæm fyrir SQL sprautun og áður. ��

Lausnin er einföld: vertu viss um að þessi líking sé stillt á rangar.

$ dbTenging->setAttribute (PDO :: ATTR_EMULATE_PREPARES, ósatt);

Nú neyðist PHP handritið til að nota tilbúnar fullyrðingar á gagnagrunni stigi og koma í veg fyrir alls kyns SQL sprautu.

Að koma í veg fyrir notkun WAF

Veistu að þú getur líka verndað vefforrit gegn SQL sprautun með því að nota WAF (netforrit eldvegg)?

Jæja, ekki bara SQL innspýting heldur mörg önnur lag 7 varnarleysi eins og forskriftir á vefsvæði, brotin sannvottun, fölsun yfir vefsvæði, útsetningu gagna o.s.frv. Annaðhvort geturðu notað sjálfshýsingu eins og Mod Security eða skýjabundið sem eftirfarandi.

SQL innspýting og nútíma PHP ramma

SQL innspýtingin er svo algeng, svo auðveld, svo pirrandi og svo hættuleg að öll nútímaleg PHP netrammar eru innbyggðir með mótvægisaðgerðum. Í WordPress höfum við til dæmis $ wpdb->undirbúa () virka, en ef þú ert að nota MVC ramma, þá vinnur það alla óhreina vinnu fyrir þig og þú þarft ekki einu sinni að hugsa um að koma í veg fyrir SQL sprautu. Það er svolítið pirrandi að í WordPress verðurðu að undirbúa yfirlýsingar beinlínis, en hey, það er WordPress sem við erum að tala um. ��

Engu að síður, punkturinn minn er að nútíma tegund vefur verktaki þarf ekki að hugsa um SQL sprautun og þar af leiðandi eru þeir ekki einu sinni meðvitaðir um möguleikann. Sem slíkt, jafnvel þó að þeir skilji eftir einn afturhurð opinn í umsókn sinni (ef til vill er þetta $ _GET fyrirspurnarmæli og gamlar venjur við að skjóta af sér óhreina fyrirspurnaspyrnu), niðurstöðurnar geta verið skelfilegar. Svo það er alltaf betra að gefa sér tíma til að kafa dýpra í grunninn.

Niðurstaða

SQL Injection er mjög viðbjóðsleg árás á vefforrit en auðvelt er að forðast það. Eins og við sáum í þessari grein, að vera varkár við vinnslu innsláttar notenda (við the vegur, SQL Injection er ekki eina ógnin sem meðhöndlun notenda færir í för með sér) og fyrirspurn gagnagrunnsins er allt sem það er til staðar. Sem sagt, við erum ekki alltaf að vinna í öryggi netramma, svo það er betra að vera meðvitaður um þessa tegund árása og ekki falla fyrir því.

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