Nukuu za kutoroka za Mysql. Na msaada mdogo zaidi utakuwa kutoka kwa kazi uliyotengeneza. Tabia isiyo na maana inatoroka


Kwanza, kidogo kuhusu kwa nini kufyeka hizi zinahitajika kwa ujumla.
Ikiwa tutabadilisha data yoyote kwa swali, basi ili kutofautisha data hii kutoka kwa amri za SQL, lazima ziwekwe katika nukuu.
Kwa mfano, ikiwa unaandika
CHAGUA * KUTOKA jedwali AMBAPO jina = Bill
basi hifadhidata itaamua kuwa Bill ni jina la uwanja mwingine, haitaipata, na itatupa makosa. Kwa hivyo, data iliyobadilishwa (katika kesi hii, jina la Bill) lazima liambatanishwe katika nukuu - basi hifadhidata itaiona kama kamba, ambayo thamani yake lazima ipewe kwa uwanja wa jina:
CHAGUA * KUTOKA jedwali WAPI jina = "Bill"
Walakini, nukuu zinaweza pia kuonekana kwenye data yenyewe. Kwa mfano,
CHAGUA * KUTOKA jedwali WAPI jina = "D"Artagnan"
Hapa database itaamua kuwa "D" ni data, na Artagnan ni amri ambayo haijui, na pia itatupa kosa. Kwa hivyo, inahitajika kufuatilia data zote ili kuelezea kwa hifadhidata kwamba alama za nukuu (na herufi zingine maalum) zinazopatikana ndani yao zinarejelea data.
Kama matokeo, tutapokea ombi sahihi ambalo halitasababisha makosa:
CHAGUA *KUTOKA jedwali WAPI jina = "D\"Artagnan"

Kwa hivyo, tuligundua kuwa wakati wa kubadilisha data ya kamba kwenye swala, sheria mbili zinapaswa kufuatwa:
- data zote za kamba zilizoingizwa lazima zimefungwa katika nukuu (moja au mbili, lakini moja ni rahisi zaidi na hutumiwa mara nyingi zaidi).
- wahusika maalum lazima waepukwe na kufyeka.

Inapaswa kuzingatiwa haswa: mikwaruzo iliyoongezwa HAIingii kwenye hifadhidata. Wanahitajika tu katika ombi. Wakati wa kupiga msingi, slashes hutupwa. Ipasavyo, kosa la kawaida ni kutumia mikwaruzo wakati wa kurejesha data kutoka kwa hifadhidata.

Yote hapo juu inatumika kwa data ya kamba na tarehe. Nambari zinaweza kuingizwa bila kufuatilia au kuzizunguka na alama za nukuu. Ukifanya hivi basi LAZIMA! lazimisha data kwa aina inayotaka kabla ya kuiingiza kwenye hoja, kwa mfano:
$id = intval ($id);
Walakini, kwa unyenyekevu (na kuegemea), unaweza kufanya kazi na nambari kama na kamba (kwani mysql bado inazibadilisha kuwa aina inayotaka). Kwa hivyo, tutafuatilia data yoyote iliyoingizwa kwenye ombi na kuifunga kwa alama za nukuu.

Pia, kuna sheria moja zaidi - hiari, lakini inapaswa kufuatwa ili kuzuia makosa:
Majina ya sehemu na jedwali yanapaswa kuambatanishwa kwa nukuu moja ya nyuma - "`" (ufunguo ulio na alama hii iko kwenye kibodi cha kawaida upande wa kushoto wa kitufe cha "1"). Baada ya yote, jina la uwanja linaweza sanjari na mysql. maneno muhimu, lakini ikiwa tutatumia nukuu ya nyuma, basi MySQL itaelewa kila kitu ni sawa:
CHAGUA * KUTOKA `meza` WAPI `tarehe` = "2006-04-04"
Unapaswa kutofautisha kati ya alama hizi za kunukuu na usichanganye moja na nyingine. Unapaswa pia kukumbuka kuwa vijiti havikwepeki na kufyeka.

Kwa hivyo, tumejifunza jinsi ya kubadilisha data kwa usahihi katika ombi.
LAKINI! Uundaji wa hoja unaobadilika hauzuiliwi na uingizwaji wa data. Mara nyingi tunapaswa kubadilisha amri za SQL na majina ya uwanja kwenye hoja. Na hapa tunaendelea na mada ya usalama:

SQL Injection ni mbinu ya mashambulizi ya hacker wakati data iliyohamishwa kwenye hati inarekebishwa kwa njia ambayo hoja inayotolewa katika hati hii huanza kufanya kitu tofauti kabisa na kile kilichokusudiwa.
Sheria za kulinda dhidi ya mashambulizi hayo zinaweza kugawanywa katika pointi mbili:
1. Kufanya kazi na data.
2. Kufanya kazi na vidhibiti vya hoja.

Tulijadili jambo la kwanza kwa undani hapo juu. Inaweza kusemwa kuwa sio, kwa kweli, utetezi. Utiifu wa sheria za kuongeza data kwenye hoja unaagizwa, kwanza kabisa, na mahitaji ya SQL SYNTAX. Na kama athari ya upande, pia tunayo ulinzi dhidi ya udukuzi.

Hoja ya pili ni ngumu zaidi, kwani hakuna sheria moja ya ulimwengu kama data - vijiti havitalinda jina la uwanja kutokana na kubadilishwa na mdukuzi. Haiwezekani kutumia nukuu kulinda majina ya jedwali, taarifa za SQL, vigezo vya amri LIMIT na taarifa zingine.
Kwa hivyo, sheria ya msingi wakati wa kubadilisha vitu vya udhibiti kwenye swala ni:
Iwapo unahitaji kuingiza taarifa za SQL au majina ya sehemu, hifadhidata, jedwali kwa nguvu kwenye hoja, basi kwa hali yoyote usiviweke moja kwa moja kwenye hoja.
Chaguo zote za nyongeza kama hizi lazima ziandikwe ADVANCE kwenye hati yako na zichaguliwe kulingana na kile ambacho mtumiaji aliingiza.
Kwa mfano, ikiwa unahitaji kupitisha jina la shamba kwa agizo na opereta, basi kwa hali yoyote usiibadilishe moja kwa moja. Tunahitaji kukiangalia kwanza. Kwa mfano, fanya safu ya maadili halali, na uibadilishe kwa ombi ikiwa tu kigezo kilichopitishwa kipo katika safu hii:
$orders =array("name" , "price" , "qty" );
$key = array_search($_GET["sort"], $orders));
$orderby = $orders [ $key ];
$swali = "CHAGUA * KUTOKA `meza` AGIZO KWA$orderby" ;

Tunatafuta safu ya chaguo zilizoelezwa hapo awali kwa neno lililoingia na mtumiaji, na ikiwa tunaipata, tunachagua kipengele kinachofanana cha safu. Ikiwa hakuna mechi inayopatikana, kipengele cha kwanza cha safu kitachaguliwa.
Kwa hivyo, kinachobadilishwa katika ombi sio kile ambacho mtumiaji aliingia, lakini kile kilichoandikwa katika hati yetu.
Vile vile lazima vifanyike katika kesi nyingine zote.
Kwa mfano, ikiwa kifungu cha WHERE kimetolewa kwa nguvu:
ikiwa (!empty($_GET [ "price" ])) $where .= "price="" . mysql_real_escape_string ($_GET [ "price" ]). """ ;
$query = "CHAGUA * KUTOKA `meza` WAPI $where" ;

Ni vigumu kwangu kufikiria kesi ambapo jina la meza linaweza kuingizwa kwenye swala kwa nguvu, lakini ikiwa hii itatokea, basi jina pia linahitaji kuingizwa tu kutoka kwa seti iliyoelezwa hapo awali kwenye hati.
Vigezo vya opereta LIMIT vinapaswa kulazimishwa kuwa aina kamili kwa kutumia shughuli za hesabu au kitendakazi cha intval().
Usifikirie kuwa mifano iliyoorodheshwa hapa inamaliza chaguzi zote za ujenzi wa hoja zenye nguvu. Unahitaji tu kuelewa kanuni na kuitumia katika matukio hayo yote.


Kwanza, kidogo kuhusu kwa nini kufyeka hizi zinahitajika kwa ujumla.
Ikiwa tutabadilisha data yoyote kwa swali, basi ili kutofautisha data hii kutoka kwa amri za SQL, lazima ziwekwe katika nukuu.
Kwa mfano, ikiwa unaandika
CHAGUA * KUTOKA jedwali AMBAPO jina = Bill
basi hifadhidata itaamua kuwa Bill ni jina la uwanja mwingine, haitaipata, na itatupa makosa. Kwa hivyo, data iliyobadilishwa (katika kesi hii, jina la Bill) lazima liambatanishwe katika nukuu - basi hifadhidata itaiona kama kamba, ambayo thamani yake lazima ipewe kwa uwanja wa jina:
CHAGUA * KUTOKA jedwali WAPI jina = "Bill"
Walakini, nukuu zinaweza pia kuonekana kwenye data yenyewe. Kwa mfano,
CHAGUA * KUTOKA jedwali WAPI jina = "D"Artagnan"
Hapa database itaamua kuwa "D" ni data, na Artagnan ni amri ambayo haijui, na pia itatupa kosa. Kwa hivyo, inahitajika kufuatilia data zote ili kuelezea kwa hifadhidata kwamba alama za nukuu (na herufi zingine maalum) zinazopatikana ndani yao zinarejelea data.
Kama matokeo, tutapokea ombi sahihi ambalo halitasababisha makosa:
CHAGUA *KUTOKA jedwali WAPI jina = "D\"Artagnan"

Kwa hivyo, tuligundua kuwa wakati wa kubadilisha data kwenye swala, sheria mbili zinapaswa kufuatwa:
- data zote zilizoingizwa kwenye ombi lazima zimefungwa kwa alama za nukuu (moja au mbili, lakini moja ni rahisi zaidi na hutumiwa mara nyingi zaidi).
- katika vigezo vyote vya kamba, wahusika maalum lazima waepukwe na kufyeka.

Inapaswa kuzingatiwa haswa: mikwaruzo iliyoongezwa HAIingii kwenye hifadhidata. Wanahitajika tu katika ombi. Wakati wa kupiga msingi, slashes hutupwa. Ipasavyo, kosa la kawaida ni kutumia mikwaruzo wakati wa kurejesha data kutoka kwa hifadhidata.

Kwa kweli, yote yaliyo hapo juu yanatumika kwa data ya kamba na tarehe. Nambari zinaweza kuingizwa bila kufuatilia au kuzizunguka na alama za nukuu. Ukifanya hivi basi LAZIMA! lazimisha data kwa aina inayotaka kabla ya kuiingiza kwenye hoja, kwa mfano:
$id = intval ($id);
Walakini, kwa unyenyekevu (na kuegemea), unaweza kufanya kazi na nambari kama na kamba (kwani mysql bado inazibadilisha kuwa aina inayotaka). Kwa hivyo, tutafuatilia data yoyote iliyoingizwa kwenye ombi na kuifunga kwa alama za nukuu.

Pia, kuna sheria moja zaidi - hiari, lakini inapaswa kufuatwa ili kuzuia makosa:
Majina ya sehemu na jedwali yanapaswa kuambatanishwa kwa nukuu moja ya nyuma - "`" (ufunguo ulio na alama hii iko kwenye kibodi cha kawaida upande wa kushoto wa kitufe cha "1"). Baada ya yote, jina la uwanja linaweza sanjari na mysql. maneno muhimu, lakini ikiwa tutatumia nukuu ya nyuma, basi MySQL itaelewa kila kitu ni sawa:
CHAGUA * KUTOKA `meza` WAPI `tarehe` = "2006-04-04"
Unapaswa kutofautisha kati ya alama hizi za kunukuu na usichanganye moja na nyingine. Unapaswa pia kukumbuka kuwa vijiti havikwepeki na kufyeka.

Kwa hivyo, tumejifunza jinsi ya kubadilisha data kwa usahihi katika ombi.
LAKINI! Uundaji wa hoja unaobadilika hauzuiliwi na uingizwaji wa data. Mara nyingi tunapaswa kubadilisha amri za SQL na majina ya uwanja kwenye hoja. Na hapa tunaendelea na mada ya usalama:

SQL Injection ni mbinu ya mashambulizi ya hacker wakati data iliyohamishwa kwenye hati inarekebishwa kwa njia ambayo hoja inayotolewa katika hati hii huanza kufanya kitu tofauti kabisa na kile kilichokusudiwa.
Sheria za kulinda dhidi ya mashambulizi hayo zinaweza kugawanywa katika pointi mbili:
1. Kufanya kazi na data.
2. Kufanya kazi na vidhibiti vya hoja.

Tulijadili jambo la kwanza kwa undani hapo juu. Inaweza kusemwa kuwa sio, kwa kweli, utetezi. Utiifu wa sheria za kuongeza data kwenye hoja unaagizwa, kwanza kabisa, na mahitaji ya SQL SYNTAX. Na kama athari ya upande, pia tunayo ulinzi dhidi ya udukuzi.

Hoja ya pili ni ngumu zaidi, kwani hakuna sheria moja ya ulimwengu kama data - vijiti havitalinda jina la uwanja kutokana na kubadilishwa na mdukuzi. Haiwezekani kutumia nukuu kulinda majina ya jedwali, taarifa za SQL, vigezo vya amri LIMIT na taarifa zingine.
Kwa hivyo, sheria ya msingi wakati wa kubadilisha vitu vya udhibiti kwenye swala ni:
Iwapo unahitaji kuingiza taarifa za SQL au majina ya sehemu, hifadhidata, jedwali kwa nguvu kwenye hoja, basi kwa hali yoyote usiviweke moja kwa moja kwenye hoja.
Chaguo zote za nyongeza kama hizi lazima ziandikwe ADVANCE kwenye hati yako na zichaguliwe kulingana na kile ambacho mtumiaji aliingiza.
Kwa mfano, ikiwa unahitaji kupitisha jina la shamba kwa agizo na opereta, basi kwa hali yoyote usiibadilishe moja kwa moja. Tunahitaji kukiangalia kwanza. Kwa mfano, fanya safu ya maadili halali, na uibadilishe kwa ombi ikiwa tu kigezo kilichopitishwa kipo katika safu hii:
$orders =array("name" , "price" , "qty" );
$key = array_search($_GET["sort"], $orders));
$orderby = $orders [ $key ];
$swali = "CHAGUA * KUTOKA `meza` AGIZA KWA $orderby";
Tunatafuta safu ya chaguo zilizoelezwa hapo awali kwa neno lililoingia na mtumiaji, na ikiwa tunaipata, tunachagua kipengele kinachofanana cha safu. Ikiwa hakuna mechi inayopatikana, kipengele cha kwanza cha safu kitachaguliwa.
Kwa hivyo, kinachobadilishwa katika ombi sio kile ambacho mtumiaji aliingia, lakini kile kilichoandikwa katika hati yetu.
Vile vile lazima vifanyike katika kesi nyingine zote.
Kwa mfano, ikiwa kifungu cha WHERE kimetolewa kwa nguvu:
ikiwa (!empty($_GET [ "price" ])) $where .= "price="" . mysql_real_escape_string ($_GET [ "price" ]). """ ;
$swali = "CHAGUA * KUTOKA `meza` WAPI $where";
Ni vigumu kwangu kufikiria kesi ambapo jina la meza linaweza kuingizwa kwenye swala kwa nguvu, lakini ikiwa hii itatokea, basi jina pia linahitaji kuingizwa tu kutoka kwa seti iliyoelezwa hapo awali kwenye hati.
Vigezo vya opereta LIMIT vinapaswa kulazimishwa kuwa aina kamili kwa kutumia shughuli za hesabu au kitendakazi cha intval().
Usifikirie kuwa mifano iliyoorodheshwa hapa inamaliza chaguzi zote za ujenzi wa hoja zenye nguvu. Unahitaji tu kuelewa kanuni na kuitumia katika matukio hayo yote.

Vipengele vya kufanya kazi na opereta LIKE
Kesi tofauti kabisa ni mwendeshaji wa LIKE.
Kwanza, pamoja na ufuatiliaji wa kawaida, mikwaruzo lazima iongezwe maradufu katika vigeu ambavyo vinabadilishwa kwa LIKE. Hiyo ni, ikiwa kutofautisha kuna \ herufi, basi lazima iongezwe mara mbili, na kisha uokoaji wa kawaida lazima ufanyike kupitia mysql_real_escape_string.
Kwa mfano, ikiwa tunatafuta kamba
herufi \ inaitwa "backslash" na tunahitaji mechi halisi, basi tunatumia tu mysql_real_escape_string na hoja ni ya kawaida:
CHAGUA * KUTOKA test WHERE field = "ishara \\ inaitwa \"backslash\"" Ikiwa tunataka kubadilisha mfuatano huu katika LIKE, basi kwanza tunahitaji kubadilisha kila mfsko na mbili, kisha tuweke mysql_real_escape_string. Matokeo yake yatakuwa
CHAGUA *KUTOKA jedwali AMBAPO uga KAMA "%tabia \\\\ inaitwa \"backslash\"%"
Jambo la pili la kuzingatia ni kwamba hakuna kipengele chochote cha kukokotoa ambacho kinaongeza mikwaju inayoziongeza kwenye vielelezo vya utafutaji "%" na "_" vinavyotumika katika opereta LIKE. Kwa hivyo, ikiwa unatumia opereta huyu na hutaki herufi _ na % zitumike kama kadi-mwitu, basi ongeza kufyeka mwenyewe. Hii inaweza kufanywa kwa amri
$data = addCslash($data, "%_"); Tahadhari - hii haina nyongeza! Jina hili la kukokotoa lina "c" ya ziada katika jina lake.

Kwa hivyo, inabadilika kuwa lazima tuchakate vigeuzo vinavyotumika katika operesheni ya LIKE kando.
kwanza badilisha kufyeka moja na mbili, ukitumia, kwa mfano, nambari kama hii:
$var = str_replace ("\\" , "\\\\" , $var ); basi (unaweza, pamoja na data zingine zote kwenda kwenye ombi), fuata:
$var = mysql_real_escape_string ($ var); na kisha ikiwa tunataka _ na % kufanana wao wenyewe, tunafanya
$var = addCslash($var, "_%");
Matokeo yake, ikiwa tunatafuta, kwa mfano, kwa kamba ifuatayo
herufi \ inaitwa "backslash" na herufi _ inaitwa "underscore" basi baada ya kusindika, katika ombi inapaswa kuonekana kama hii:
"Alama % \\\\ inaitwa \"backslash\" na alama \_ inaitwa \" underscore\" Hiyo ni, ufyekaji ambao hapo awali ulikuwa kwenye mstari umeongezeka mara nne. Wahusika waliobaki walifuatiliwa kama kawaida. Plus - tabia underscore ilionekana.

Kuhusu kufyeka. Jinsi ya kuwaondoa
Kufyeka, au kufyeka nyuma, kutoka kwa kufyeka kwa nyuma kwa Kiingereza ni kufyeka nyuma (“\”) ambayo hujitokeza kwa ghafla katika vigeu vyako. Imeongezwa kwa herufi maalum, lakini mara nyingi hugunduliwa kwa sababu ya alama za nukuu.
Hii hutokea kwa sababu ya mipangilio maalum ya PHP, kawaida huwezeshwa na chaguo-msingi kwenye mwenyeji. Kinadharia, mipangilio hii inaweza kuongeza usalama wa hati zinazofanya kazi na hifadhidata. Katika mazoezi, kuongeza moja kwa moja kufyeka mara nyingi husababisha kuchanganyikiwa na usumbufu, wote wakati wa kufanya kazi na database na kwa kutokuwepo.
Hapo chini tutachunguza kesi hizi zote mbili kwa undani.

Maagizo ya php.ini, ambayo kwa pamoja yanaitwa "nukuu za uchawi", yanawajibika kwa kuongeza mikwaju kiotomatiki:
magic_quotes_gpc na magic_quotes_runtime Ikiwa ya kwanza imewezeshwa, basi PHP huongeza kiotomatiki mikwaju kwa data inayotoka kwa mtumiaji - kutoka kwa POST, maombi ya GET na vidakuzi (pamoja na kuingia na nenosiri lililopokelewa kupitia Uidhinishaji wa HTTP).
Ikiwa ya pili, basi kufyeka huongezwa kwa data iliyopokelewa wakati wa utekelezaji wa hati - kwa mfano, kutoka kwa faili au hifadhidata.

Ikiwa unafanya kazi bila hifadhidata, au unafanya kazi na hifadhidata kwa usahihi (ambayo itajadiliwa hapa chini), kufyeka kwa ziada kunakusumbua tu, na unahitaji kujiondoa. Njia rahisi na sahihi zaidi ni kulemaza uongezaji kiotomatiki katika mipangilio ya PHP.
Hii inaweza kufanywa ama kwa kusahihisha maagizo yanayolingana katika php.ini, ikiwa una ufikiaji, au kwa kuunda faili ya .htaccess kwenye saraka ya mwisho ya tovuti na kuongeza mistari kwake.
php_flag magic_quotes_gpc 0
php_flag magic_quotes_wakati wa utekelezaji 0

Ikiwa huwezi kuizima kwa njia hii, itabidi uandike msimbo wa viwango tofauti vya utata ili kufuta data inayoingia kutoka kwa mikwaju. (Hata hivyo, ikiwa unataka kuandika programu-tumizi inayobebeka ambayo haitegemei mipangilio ya PHP, basi bado utahitaji kuiandika. Na ijumuishe kama kizuizi tofauti mwanzoni mwa hati zako).

Njia rahisi zaidi ya kuelewa data iliyopatikana wakati wa operesheni ni kuandika mwanzoni mwa hati:
set_magic_quotes_runtime(0); Kwa data iliyopokelewa kutoka kwa mtumiaji, kila kitu ni ngumu zaidi. Kwa nambari hii tunahitaji kazi mbili:

  • Unaweza kuangalia ikiwa PHP imeiongeza kwa kutumia get_magic_quotes_gpc kitendakazi.
  • Kazi ya vipande huondoa kufyeka.
    Ipasavyo, unahitaji kuangalia kwa kutumia ya kwanza, na ikiwa PHP imeongezwa, basi pitia vigezo vyote vinavyoingia na uifute kwa kutumia ya pili.
    Ikiwa unafanya kazi kwa usahihi, na register_globals = off , basi inatosha kutumia vipande kwenye safu zote zilizo na data kutoka kwa kivinjari.
    kwa mfano, unaweza kujumuisha nambari ifuatayo katika hati zote za tovuti:
    vipande vya kazi (& $el ) (
    ikiwa (is_array($el))
    foreach($el as $k => $v )
    vipande($el[$k]);
    kingine $el = stripslashs ($el);
    }
    ikiwa (get_magic_quotes_gpc()) (
    vipande($_GET);
    vipande($_POST);
    vipande($_COOKIE);
    vipande($_REQUEST);
    ikiwa (isset($_SERVER [ "PHP_AUTH_USER" ]))) vipande ($_SERVER [ "PHP_AUTH_USER" ]);
    ikiwa (isset($_SERVER [ "PHP_AUTH_PW" ]))) vipande ($_SERVER [ "PHP_AUTH_PW" ]);
    }
    Katika kesi ya mipangilio isiyo sahihi ya register_globals, itakuwa vigumu kupata suluhisho linalokubalika, hivyo ni bora - narudia - kufanya kazi mara moja na mipangilio sahihi.

    Vidokezo

    • Miongoni mwa sababu kwa nini hupaswi kutegemea "nukuu za uchawi" ni nyingine. Haiwezekani sana, lakini bado. "Nukuu za uchawi" kwa kweli hurejelea sio maagizo mawili, lakini matatu. Ya tatu ni magic_quotes_sybase. Sio tu kuongeza nukuu badala ya kufyeka, lakini pia hughairi athari za magic_quotes_gpc. Ikiwa kwa muujiza fulani maagizo haya yote mawili yana hadhi "ya", basi ya mwisho haitafanya kazi! Hiyo ni, kwa kutegemea "nukuu za uchawi", katika kesi hii tutapata furaha zote za maswali yaliyotungwa vibaya. Kwa ujumla, kwa kinadharia tu, lazima tuzingatie uwepo wa maagizo haya, kwani pia inatoa mshangao kama ... kubadilisha tabia ya kazi za kuongeza na vipande! Ikiwa magic_quotes_sybase = on , basi chaguo za kukokotoa hizi huanza kuongeza na kuondoa nukuu moja badala ya kufyeka, mtawalia.
    • Mifano yote iliyotolewa inahusu hifadhidata ya Mysql pekee. Sheria mahususi za kutunga hoja zinaweza kutofautiana kwa DBMS nyingine, lakini kanuni ya jumla inabakia ileile:
      • ikiwa API ya kufanya kazi na hifadhidata au maktaba ya wahusika wengine hutoa kazi maalum za kutunga maswali, na kuna uwezekano wa kuzitumia, basi unahitaji kuzitumia kwanza.
      • Ikiwa hakuna kazi kama hizo, basi unapaswa kuangalia katika nyaraka za kazi za kutoroka wahusika maalum kwa DBMS hii.
    Kumbuka: fomu
    Wakati wa kuonyesha thamani katika lebo za ingizo za fomu, mikwaju haisaidii.
    Ili kuonyesha maandishi yote katika uwanja kama huo, thamani lazima iambatanishwe katika nukuu, na kwa data ya pato tumia kazi ya htmlspecialchars().
    Mfano:

    Ikumbukwe pia (ingawa hii haihusiani na nukuu na mikwaju) kwamba chaguo za kukokotoa za htmlspecialchars zinafaa kutumika wakati wa kutoa kwa kivinjari kwa ujumla kwa data zote zinazopokelewa kutoka kwa mtumiaji ambaye hajathibitishwa. Kwa nini hii inapaswa kufanywa, unaweza kusoma kwenye Google kwa ombi la hatari ya XSS ni nini
    kwa phpfaq.ru
  • Kutokana na hali ya kazi yangu, sina budi kufanya ukaguzi wa usalama wa msimbo wa chanzo cha programu za wavuti.
    Programu nyingi za wavuti na nambari nyingi ...

    Sio siri kuwa udhaifu wa sindano wa SQL ndio unaojulikana zaidi kati ya udhaifu wote wa programu ya wavuti ya upande wa seva. Kuna majukwaa na mifumo ambapo vitu kama hivyo karibu kutengwa kabisa, kwa mfano ORM na kadhalika.Lakini takwimu zinaendelea kutuambia juu ya utawala kamili wa programu za wavuti zilizo na maswali rahisi ya SQL yaliyounganishwa kwenye Mtandao. Kwa kuongezea, kuna visa ambapo ORM ni kwa ujumla inatumika Haiwezi, kwa mfano, wakati si tu vigezo vya maneno, lakini pia mantiki ya swala yenyewe katika ngazi ya operator lazima inategemea data ya mtumiaji.

    Kwa hiyo, hebu tuanze.

    Tabia isiyo na maana inatoroka
    Imepatikana katika 83% ya programu za wavuti za PHP ambazo zinaweza kuathiriwa na sindano za SQL
    Kutumia kitendakazi cha kutoroka kwa herufi kama vile
    mysql_escape_string
    mysql_real_esscape_string
    mikwaju
    bila alama za nukuu. Mara nyingi hujidhihirisha katika vigezo vya nambari (aina zote za *_id).
    Mfano
    $sql = "CHAGUA mtumiaji KUTOKA orodha ya watumiaji WHERE userid=".mysql_real_escape_string($_GET["uid"]);

    Inaonekana kuwa nambari salama, lakini juu ya uso tu. Mtindo wa kawaida wa sindano za SQL katika PHP katika mazoezi yangu uliingia hapa. Ili kushambulia athari hii, mvamizi anahitaji tu kuepuka kutumia " " \x00 \r \n \n \x1a vibambo kwenye vekta ya mashambulizi.
    Kwa mfano:
    /index.php?uid=-777 MUUNGANO CHAGUA nenosiri KUTOKA kwenye orodha ya watumiaji

    Tafuta katika msimbo
    Imechangiwa na semantiki ya lugha. Kwa utaftaji rahisi unaweza kutumia egrep:
    egrep -Rin "(chagua|sasisha|ingiza|futa|badilisha).*(kutoka|weka|ingia).*(mysql_escape_string|mysql_real_escape_string|addslash)" . | grep -v "[\""]["\"]"

    Mantiki ya usemi wa utaftaji ni kama ifuatavyo: pata mistari yote ambayo hakuna mlolongo wa herufi za nukuu ("", "", "", "") upande wa kushoto wa vitendaji vya kuchuja. Njia, bila shaka, ni mbali na 100%, lakini haiwezekani kuhitaji kujieleza mara kwa mara kufanya uchambuzi wa semantic.
    Ili kurahisisha kuonyesha habari, unaweza kuangazia kitendakazi kwa rangi kwenye koni:
    egrep -Rin "(chagua|sasisha|ingiza|futa|badilisha).*(kutoka|weka|ingia).*(mysql_escape_string|mysql_real_escape_string|addslash)" . | grep -v "[\""]["\"]" | egrep --color "(mysql_escape_string|mysql_real_escape_string|addslash)"

    Ili kulinda dhidi ya uwezekano huu wa wildcard, ni bora kutumia aina ya casting.
    Hii daima hufanya kazi kwa kasi na inaaminika zaidi kuliko aina zote za uchujaji na uchunguzi.
    Kwa mfano hapo juu, kiraka kinaweza kuwa kama hii:
    $sql = "CHAGUA mtumiaji KUTOKA orodha ya watumiaji WHERE userid=".intval($_GET["uid"]);

    Hii inahitimisha insha fupi. Ninawasihi watengenezaji wote wa wavuti kujaribu kuangalia vyanzo vyao vya miundo kama hii. Bora zaidi, panua hati ya utaftaji uliyopewa kwa watu.

    (PHP 4 >= 4.3.0, PHP 5)

    mysql_real_escape_string - Huepuka herufi maalum katika mfuatano kwa matumizi katika taarifa ya SQL

    Maelezo

    mysql_real_esscape_string (mfuatano $unescaped_string [, rasilimali $link_identifier = NULL]): kamba

    Huepuka herufi maalum kwenye unescaped_string , kwa kuzingatia seti ya herufi ya sasa ya muunganisho ili iwe salama kuiweka kwenye mysql_query(). Ikiwa data ya jozi itaingizwa, chaguo hili la kukokotoa lazima litumike.

    mysql_real_escape_string() huita kazi ya maktaba ya MySQL mysql_real_escape_string, ambayo hutayarisha mikwaruzo kwa herufi zifuatazo: \x00, \n, \r, \ , " , " na \x1a.

    Chaguo hili la kukokotoa lazima kila wakati (isipokuwa vichache) litumike kufanya data kuwa salama kabla ya kutuma swali kwa MySQL.

    Tahadhari

    Usalama: seti ya herufi chaguo-msingi

    Seti ya herufi lazima iwekwe katika kiwango cha seva, au na kitendakazi cha API mysql_set_charset() ili kuathiri mysql_real_escape_string() . Tazama sehemu ya dhana kwenye seti za wahusika kwa habari zaidi.

    Vigezo

    unescaped_string

    Kamba ambayo inapaswa kutoroka.

    Kitambulisho_kiungo

    Muunganisho wa MySQL. Ikiwa kitambulisho cha kiungo hakijabainishwa, kiungo cha mwisho kilifunguliwa na mysql_connect() inachukuliwa. Ikiwa hakuna kiungo kama hicho kinachopatikana, itajaribu kuunda moja kana kwamba mysql_connect() aliitwa bila hoja. Ikiwa hakuna muunganisho unaopatikana au kuanzishwa, a E_ONYO kosa la kiwango hutolewa.

    Rudisha Maadili

    Hurejesha kamba iliyotoroka, au UONGO kwenye makosa.

    Makosa/Vighairi

    Utekelezaji wa chaguo hili bila muunganisho wa MySQL uliopo pia utatoa E_ONYO makosa ya kiwango cha PHP. Tekeleza chaguo hili la kukokotoa ukiwa na muunganisho halali wa MySQL pekee.

    Mifano

    Mfano #1 Rahisi mysql_real_escape_string() mfano

    //Unganisha
    $link = mysql_connect("mysql_host" , "mysql_user" , "mysql_password" )
    AU kufa (mysql_error());

    //Swala
    $query = sprintf ( "CHAGUA *KUTOKA KWA watumiaji AMBAPO mtumiaji="%s" NA nenosiri="%s"",
    mysql_real_escape_string($user),
    mysql_real_escape_string (nenosiri la $));
    ?>

    Mfano #2 mysql_real_escape_string() inahitaji mfano wa uunganisho

    Mfano huu unaonyesha kile kinachotokea ikiwa muunganisho wa MySQL haupo wakati wa kupiga chaguo la kukokotoa.

    Mfano hapo juu utatoa kitu sawa na:

    Onyo: mysql_real_escape_string(): Hakuna faili au saraka katika /this/test/script.php kwenye mstari wa 5 Onyo: mysql_real_escape_string(): Kiungo cha seva hakikuweza kuanzishwa katika /this/test/script.php kwenye mstari wa 5 bool(false) string(41) "CHAGUA *KUTOKA kwa waigizaji WHERE last_name = """

    Mfano #3 Mfano wa Mashambulizi ya Sindano ya SQL

    // Hatukuangalia $_POST["nenosiri"], inaweza kuwa chochote mtumiaji alitaka! Kwa mfano:
    $_POST [ "jina la mtumiaji" ] = "aidan" ;
    $_POST [ "nenosiri" ] = "" AU ""="" ;

    // Hifadhidata ya hoja ili kuangalia ikiwa kuna watumiaji wanaolingana
    $query = ( $_POST [ "jina la mtumiaji" ]) " NA password=" ( $_POST [ "nenosiri" ]) "" ;
    mysql_query($query);

    // Hii inamaanisha kuwa hoja iliyotumwa kwa MySQL itakuwa:
    echo $query ;
    ?>

    Swali lilitumwa kwa MySQL:

    Hii itaruhusu mtu yeyote kuingia bila nenosiri halali.

    Vidokezo

    Muunganisho wa MySQL unahitajika kabla ya kutumia mysql_real_escape_string() vinginevyo kosa la kiwango E_ONYO inazalishwa, na UONGO inarudishwa. Ikiwa kiungo_kitambulisho hakijafafanuliwa, muunganisho wa mwisho wa MySQL unatumika.

    Kumbuka: mysql_real_escape_string() haina kutoroka % na _ . Hizi ni kadi za mwitu katika MySQL ikiwa imejumuishwa na KAMA, RUZUKU, au KUBATISHA.

    Miaka 8 iliyopita

    Utendakazi kidogo tu ambao unaiga mysql_real_escape_string asilia lakini hauhitaji muunganisho amilifu wa mysql. Inaweza kutekelezwa kama kazi tuli katika darasa la hifadhidata. Tunatumai itasaidia mtu.

    fanya kazi mysql_escape_mimic ($inp) (
    ikiwa(ni_safu($inp))
    rudisha array_map (__METHOD__ , $inp );

    If(!empty($inp ) && is_string ($inp )) (
    return str_replace (array("\\" , "\0" , "\n" , "\r" , """ , """ , "\x1a" ), safu("\\\\" , "\ \0" , "\\n" , "\\r" , "\\"" , "\\"" , "\\Z" ), $inp );
    }

    Rudisha $inp ;
    }
    ?>

    Miaka 13 iliyopita

    Kumbuka kuwa mysql_real_escape_string haitayarishi mikwaju ya nyuma kwa \x00, \n, \r, na \x1a kama ilivyotajwa kwenye hati, lakini kwa kweli hubadilisha herufi na uwakilishi unaokubalika wa MySQL kwa maswali (k.m. \n inabadilishwa na "\ n" litteral). (\, ", na " zimeepukwa kama ilivyoandikwa) Hii haibadilishi jinsi unapaswa kutumia chaguo hili la kukokotoa, lakini nadhani ni vyema kujua.

    Miaka 6 iliyopita

    Hakuna mjadala wa kutoroka umekamilika bila kumwambia kila mtu kuwa kimsingi haupaswi kamwe kutumia ingizo la nje kutoa nambari iliyotafsiriwa. Hii huenda kwa taarifa za SQL, au kitu chochote unachoweza kuita aina yoyote ya kazi ya "eval".

    Kwa hivyo, badala ya kutumia kazi hii iliyovunjika vibaya, tumia taarifa zilizoandaliwa za parametric badala yake.

    Kusema kweli, kutumia data iliyotolewa na mtumiaji kutunga taarifa za SQL kunapaswa kuchukuliwa kuwa uzembe wa kitaalamu na unapaswa kuwajibishwa na mwajiri au mteja wako kwa kutotumia taarifa zilizotayarishwa.

    Hiyo ina maana gani?

    Inamaanisha badala ya kujenga taarifa ya SQL kama hii:

    "WEKA NDANI YA X (A) THAMANI(".$_POST["a"].)"

    Unapaswa kutumia mysqli"s prepare() function () kutekeleza taarifa inayoonekana kama hii:

    "INGIZA KATIKA THAMANI X (A)(?)"

    NB: Hii haimaanishi kwamba hupaswi kamwe kutoa taarifa za SQL zinazobadilika. Maana yake ni kwamba usiwahi kutumia data iliyotolewa na mtumiaji kuzalisha taarifa hizo. Data yoyote iliyotolewa na mtumiaji inapaswa kupitishwa kama vigezo vya taarifa baada ya kuwa nayo. imeandaliwa.

    Kwa hivyo, kwa mfano, ikiwa unaunda mfumo mdogo na unataka kuingiza kwenye jedwali kulingana na URI ya ombi, ni kwa manufaa yako kutochukua thamani ya $_SERVER["REQUEST_URI"] (au yoyote. sehemu yake) na uambatanishe moja kwa moja na hoja yako. Badala yake, unapaswa kuchanganua sehemu ya thamani ya $_SERVER["REQUEST_URI"] unayotaka, na upange ramani hiyo kupitia aina fulani ya utendaji au safu shirikishi kwa mtu ambaye si mtumiaji. thamani iliyotolewa. Iwapo uchoraji wa ramani hautoi thamani yoyote, unajua kuwa kuna kitu kibaya na data iliyotolewa na mtumiaji.

    Kukosa kufuata hii imekuwa sababu ya shida kadhaa za sindano za SQL katika mfumo wa Ruby On Rails, ingawa hutumia taarifa zilizotayarishwa za parametric. Hivi ndivyo GitHub ilidukuliwa wakati mmoja. Kwa hiyo, hakuna lugha isiyoweza kukabili tatizo hili. Ndio maana hii ni mazoezi bora ya jumla na sio kitu maalum kwa PHP na kwa nini unapaswa kuipitisha.

    Pia, bado unapaswa kufanya aina fulani ya uthibitishaji wa data iliyotolewa na watumiaji, hata wakati wa kutumia taarifa zilizoandaliwa za parametric. Hii ni kwa sababu data iliyotolewa na mtumiaji mara nyingi itakuwa sehemu ya baadhi ya HTML iliyotolewa, na unataka kuhakikisha kuwa data iliyotolewa na mtumiaji haitasababisha matatizo ya usalama kwenye kivinjari.

    miaka 9 iliyopita

    Kuna jambo la kufurahisha katika mfano # 2 kuhusu sindano ya SQL: NA inachukua kipaumbele juu ya AU, kwa hivyo swala iliyoingizwa hutekelezwa kama WAPI (user="aidan" AND password="") AU ""="", kwa hivyo badala yake ya kurejesha rekodi ya hifadhidata inayolingana na jina la mtumiaji kiholela (katika kesi hii "aidan"), itarudisha rekodi ZOTE za hifadhidata. Bila mpangilio maalum. Kwa hivyo mshambulizi anaweza kuingia kama akaunti yoyote, lakini si lazima kwa kutumia akaunti yoyote. kudhibiti ni akaunti gani.

    Bila shaka mtu anayeweza kushambulia anaweza kurekebisha tu vigezo vyake ili kulenga watumiaji mahususi wanaowavutia:

    //Mf. maadili ya mshambuliaji
    $_POST [ "jina la mtumiaji" ] = "" ;
    $_POST["nenosiri"] = "" AU mtumiaji = "msimamizi" NA "" = "";

    // Swali lisilo na muundo
    $swali = "CHAGUA *KUTOKA kwa watumiaji WAPI mtumiaji="$_POST [ jina la mtumiaji ] " NA nenosiri = " $_POST [ nenosiri ] "" ;

    echo $query ;

    // Hoja iliyotumwa kwa MySQL ingesoma:
    // CHAGUA * KUTOKA KWA watumiaji AMBAPO user="" NA password="" AU mtumiaji="msimamizi" NA ""="";
    // ambayo ingeruhusu mtu yeyote kupata ufikiaji wa akaunti inayoitwa "msimamizi"

    ?>

    Mwaka 1 uliopita

    @mlisha
    Nilifafanua maelezo yake kama ifuatavyo:
    $string = "asda\0sd\x1aas\\\\\\\\dasd\"asdasd\na\"\"sdasdad";
    $array1 = safu("\\\\\\\\", "\0", "\n", "\r", """, """, "\x1a");
    $array2 = safu("\\\\\\\\\\\\\\\", "\\\0", "\\\n", "\\\r", "\\\ "", "\\\"", "\\\Z");
    echo (kamba ya $);
    mwangwi(PHP_EOL);
    kwa($i=0; $i ikiwa ($i==0)
    $p = "/(?mwingine
    $p = "/(?mwangwi($i);
    mwangwi($p);
    echo($array2[$i]);
    $string = preg_replace($p, $array2[$i], $string);
    mwangwi ("\t");
    echo (kamba ya $);
    mwangwi(PHP_EOL);
    }
    mwangwi(PHP_EOL);
    echo (kamba ya $);

    Miaka 2 iliyopita

    Ili Kunukuu Sam katika Numb Safari

    [ "Hakuna majadiliano ya kutoroka yamekamilishwa bila kumwambia kila mtu kwamba kimsingi hupaswi kamwe kutumia ingizo la nje kutoa msimbo uliofasiriwa. Hii huenda kwa taarifa za SQL, au kitu chochote ambacho ungeita aina yoyote ya chaguo la kukokotoa la "eval".

    Kwa hivyo, badala ya kutumia kazi hii iliyovunjika vibaya, tumia taarifa zilizoandaliwa za parametric badala yake.

    Kusema kweli, kutumia data iliyotolewa na mtumiaji kutunga taarifa za SQL kunapaswa kuzingatiwa kuwa ni uzembe wa kitaalamu na unapaswa kuwajibishwa na mwajiri au mteja wako kwa kutotumia taarifa zilizotayarishwa za vigezo." ]

    Sam yuko sahihi.......

    Walakini sidhani kama ni busara kuacha usafishaji wote na kupitisha kazi hiyo kwa taarifa zilizoandaliwa za parametric.

    Msanidi programu fulani anayefanya kazi katika hali fulani daima atajua zaidi kuhusu ingizo halali (maalum kwa muktadha huo).

    Ukiuliza mtumiaji kupitisha thamani ambayo tayari umewapa na unajua kuwa maadili yote kama haya huanza AB****** na kamba inapaswa kuwa ya urefu wa 7 au 11 lakini sio urefu mwingine wowote basi unayo. msingi wa kisafisha-safishaji kizuri cha awali - urefu tofauti unaoruhusiwa wa mfuatano unaweza kuonyesha data ya urithi.

    Nisingependa kamwe kupitisha takataka ambazo mtumiaji hasidi anaweza kuwa amepitisha kupitia fomu kwa taarifa zilizoandaliwa za parametric, ningetaka kufanya ukaguzi wangu mwenyewe wa akili kwanza na katika hali zingine hizi zinaweza kukosea kwa tahadhari na. chagua tu kuacha Hifadhidata op kabisa.

    Kwa njia hiyo DB yangu haizingiwi na taarifa zisizo salama zilizowekwa salama - haizingiki ambayo ni bora.

    Usalama katika tabaka - usafishaji na uthibitishaji bado unapaswa kuzingatiwa katika kila hali KABLA ya kutumia taarifa zilizotayarishwa.

    Kwa kuongeza kadiri ninavyoweza kusoma kwenye hati rasmi
    ==============================================

    "Kutoroka na sindano ya SQL

    Vigezo vilivyofungwa vinatumwa kwa seva kando na hoja na kwa hivyo haziwezi kuliingilia. Seva hutumia maadili haya moja kwa moja kwenye hatua ya utekelezaji, baada ya kiolezo cha taarifa kuchanganuliwa. Vigezo vilivyofungwa havihitaji kuepukwa kwani havibadilishwi kwenye safu ya hoja moja kwa moja"

    Hiyo inaashiria kwangu kuwa hatari inaepukwa katika mambo ya ndani kwa kushughulikia mbadala sio kwa kubatilisha.

    Hii ina maana kwamba mradi mkubwa ambao haujakamilika uongofu kwa taarifa zilizotayarishwa, msimbo wa urithi katika sehemu tofauti za shirika au seva zinazozungumza zenyewe zinaweza kusambaza habari mbaya kutoka eneo la kinga au hali hadi moja ambayo si salama.

    Alimradi usafishaji unafanywa kwa ustadi bila kuleta hatari zaidi basi binafsi ningeshikamana na tabaka fulani za usafishaji na kisha kupiga taarifa zilizotayarishwa.

    Kwa hivyo kimsingi nilichimba sana katika maeneo ya MySQL na PHP... haswa hatua za usalama ninazopaswa kuchukua ninaposhughulika na hifadhidata na pembejeo za fomu. Kufikia sasa nimeona yafuatayo yanapendekezwa sana:

    1. Taarifa Zilizotayarishwa
    2. Kwa kutumia _real_esscape_string()
    3. SI kwa kutumia nukuu za uchawi kwani inachanganya hifadhidata na kuishia kukupa vitu kama "Hukuiita ...".

    Hii yote ni nzuri na ninaifuatilia. Hata hivyo, nilikuwa najiuliza ikiwa ningeepuka vibambo kama vile alama ya dola [$], asilimia ya ishara [%], na pengine vingine. Swali linaweza kufasiri ishara ya dola kama utaftaji wa PHP labda? Je, sintaksia ya LIKE ambayo nimesikia inatumia alama ya % au hata kadi-mwitu? Taarifa zilizotayarishwa zinapaswa kutunza haya yote kitaalam, lakini nilitaka tu kuwa katika upande salama na kuhakikisha kuwa kila kitu kimefunikwa vizuri. Katika hali ambapo ninasahau kutumia taarifa zilizoandaliwa au kuzipuuza tu, nilitumaini kwamba safu hii ya pili ya utetezi inaweza kuniambia kuwa naweza kuondokana na kizunguzungu.

    Hii ndio ninayotumia kwa sasa kutoroka:

    Chaguo za kutoroka ($connection, $data)( $new_data = trim($data); $new_data = i_real_escape_string($connection, $new_data); $new_data = addcslashes($new_data, "%_$"); $new_data = htmlspecialchars ($new_data, ENT_NOQUOTES); rudisha $new_data;)

    Kwa hivyo hii ni sahihi? Je, ninafanya kitu kibaya sana? Tafadhali kumbuka kuwa wakati wa kurudisha data ya hifadhidata nitalazimika kuondoa mikwaruzo kabla ya herufi za $,% na _.

    Je, ninafanya kitu kibaya sana?

    Kwanza kuhusu utafiti wako.

    Taarifa zilizotayarishwa - wa pekee jambo la ajabu umepata.

    Ingawa kutumia mysqli_real_escape_string (ikizingatiwa kuwa unatumia taarifa zilizoandaliwa) itakuwa isiyo na maana na yenye madhara(kuunda matokeo ambayo ulijiona: "Uliita sio \ t...").

    Na Nukuu za Uchawi zimeondolewa kwa muda mrefu kutoka kwa lugha - kwa hivyo hazina thamani yoyote.

    Kwa hivyo hata sehemu nyingi za majengo yako ya awali sio sawa.

    Sasa kwa swali lako.

    Swali linaweza kufasiri ishara ya dola kama utaftaji wa PHP labda?

    Je, sintaksia ya LIKE ambayo nimesikia inatumia alama ya % au hata kadi-mwitu?

    Ndio, umesikia hivyo. Madhumuni kamili ya opereta ya LIKE ni kutafuta muundo. Kuzima wahusika hawa katika LIKE hakutakuwa na maana hata kidogo.

    Kila wakati utatumia opereta ya LIKE, lazima uamue ni herufi gani mahususi ya kutumia na ipi ya kukataa. Huwezi kutumia suluhisho la wakati mmoja. Bila kutaja kuwa katika mwingiliano mwingine wa mysql ishara ya % haina maana maalum.

    Taarifa zilizotayarishwa zinapaswa kutunza haya yote kitaalam

    Taarifa zilizotayarishwa hazina uhusiano wowote na alama za $ au %. Taarifa zilizotayarishwa hurejelea sindano ya SQL, lakini hakuna mhusika anayeweza kuisababisha (hungeweza kuita "sindano" opereta inayotumika kama KAMA, unaweza?).

    Hatimaye, kwa sehemu mbaya zaidi.

    Iwapo utasahau kutumia taarifa zilizotayarishwa au kupuuza tu kuzifuata,

    hakuna kitakachokuokoa.

    Na msaada mdogo zaidi utakuwa kutoka kwa kazi uliyotengeneza.

    Fanya muhtasari.

    1. Ondoa kipengele hiki.
    2. Tumia vichungi * kuwakilisha kila tofauti ya mtu binafsi katika swala.
    3. Escape % na herufi _ kwenye ingizo ikiwa tu zitatumika katika opereta LIKE na hutaki zitafsiriwe.
    4. Tumia htmlspecialchars() kwa pato, sio uingizaji wa mysql.

    *soma taarifa zilizotayarishwa ikiwa neno hili hulifahamu.

    Sio lazima uepuke ishara ya dola. MySQL haiangalii mhusika huyu haswa, na PHP inaitambua tu katika msimbo wa chanzo, sio kwa maadili ya kamba (isipokuwa ukiita eval kwenye kamba, lakini hiyo ni minyoo nyingine kabisa).

    Utahitaji tu kutoroka % na _ ikiwa unatumia ingizo la mtumiaji kama hoja ya LIKE na haukutaka mtumiaji aweze kutumia kadi-mwitu. Hii inaweza kutokea ikiwa unachakata fomu ya utafutaji. Huna haja ya kuitumia wakati wa kuhifadhi katika hifadhidata.

    Huna haja ya kutumia htmlchars maalum wakati wa kufikia hifadhidata. Hii inapaswa kutumika tu wakati wa kuonyesha data kwa mtumiaji kwenye ukurasa wa HTML ili kuzuia sindano ya XSS.

    Kulingana na data gani na inatumika kwa nini.

    Ukigundua kuwa taarifa za msingi za nje ya kisanduku cha PHP ni kubwa sana na ngumu, ninapendekeza uangalie baadhi ya madarasa yanayopatikana kwenye github ili kukupa wazo la maswali yaliyorahisishwa.

    Mfano wa kuingiza maswali na darasa hili

    $data = Array ("login" => "admin", "active" => kweli, "firstName" => "John", "lastName" => "Doe", "password" => $db->func( "SHA1(?)",Array ("secretpassword+chumvi")), // password = SHA1("secretpassword+chumvi") "createdAt" => $db->now(), // createdAt = NOW() " inaisha" => $db->sasa("+1Y") // inaisha = SASA() + muda mwaka 1 // Vipindi vinavyotumika [s]sekunde, [m]dakika, [h]saa, [d]siku, [M] mwezi, [Y] sikio); $id = $db->insert("users", $data); ikiwa ($id) echo "mtumiaji aliundwa. Id=" . $id; else echo "insert imeshindwa:" . $db->getLastError();