Internet Derazalar Android
Kengaytirmoq

Belgilarning skriningi. Oddiy iboralarda qanday maxsus belgilarni himoya qilish kerak? HTML-da saqlanayotgan

Odatda dasturlash tillar, matn buyrug'i interfeyslari, matnni belgilash Tillar (HTML, Tex, Wiki-belgisi) tuzilgan matn bilan shug'ullanadi, unda ba'zi belgilar (va kombinatsiyalar) ishlatiladi menejer, shu jumladan, matnning boshqaruv tuzilmasi. Bunday ramzni "an'anaviy tilning ramzi" sifatida ishlatish zarurati qo'llaniladigan vaziyatda qo'llaniladi himoya qilish.

Shartli ravishda himoyalanishni uch turga bo'lish mumkin:

  • yagona belgilar ekran
  • "Ekraning" belgisi ketma-ketligi yordamida belgilar guruhini skriga o'tkazish
  • "Ekraningni boshlang" va "ekranlash" tugmachasini "ekranlanish tugashini" boshlagichi, ekranlangan matnning boshlanishiga o'rnatiladi.

Zaiflashmaslik sabab sifatida himoyalanishning etishmasligi

Belgilangan belgi avtomatik ravishda ishlab chiqarilgan matnda aks ettirilgan taqdirda. O'zboshimchalik bilan simli ma'lumotlarning kiritilishi ulardagi boshqaruv belgilarining majburiy himoyalanganligini o'z ichiga oladi. Shu bilan birga, ko'pincha bunday belgilarning haqiqiy satrlari ushbu operatsiyani umuman o'tkazib yuboradigan va "har qanday oqilona" simli chiziqlar bilan to'g'ri ishlayotgan sodda dasturni qabul qiladi. Biroq, bunday soddalashtirilgan kod yashirin zaiflikga ega, chunki uchinchi tomonning (satr ma'lumotnomasi muallifi) ruxsatsiz ta'sirga ega bo'lishi mumkin tuzilish Yaratilgan matn. Agar matn yaratilgan matnning dasturi bo'lsa, zaiflik jiddiy bo'ladi. An'anaga ko'ra, bunday muammolar Sval tillariga bo'ysunadi (SQL-in'ektsiyaga qarang) va HTML (Sayt skriptasini ko'ring).

Misollar

Yagona belgilar ekran

  • Si dasturlash tilida, chiziqlar ichida belgilar ekranida "" o'rnatilgan belgi oldidan joylashtirilgan belgilar yordamida amalga oshiriladi. (Shu bilan birga, "\\" belgisi, ya'ni BEXLEXni chiqarish uchun "\\\\" kombinatsiyasidan foydalanishi mumkin, bu esa "\\\\" kombinatsiyasi.
  • Microsoft Windows buyruqining so'rovi, belgilarning belgi qismining ekranida himoyalangan belgi oldida qo'yilgan "^" belgisi yordamida amalga oshiriladi.

Ekspleys guruhi

  • Pitson dasturlash tilida satrda r belgisi guruhining skrining (Ingliz tilidan. Xom - xom, xom, xom xom), i.e ketma-ketligi bilan himoyalangan r "himoyalangan matn "
  • Wiki-markirovk matnli ekranli shlyapa soxtalarning yordami bilan amalga oshiriladi va . Agar siz psevdotegning o'zi yozishingiz kerak bo'lsa , bu almashtirishning ramzlari bilan amalga oshiriladi ( ).

Yakuniy belgisi bilan armatura

Matnda ko'plab boshqaruv belgilari mavjud bo'lganda, ko'plab ekranli belgilar bo'ladi, matn og'irlashadi. Bunday holatlar uchun alternativ xaterlik usuli - yakuniy matn bilan ishlatiladi. Bunday holda, barcha boshqarish belgilari belgilar bo'ladi (boshqarish funktsiyasini ko'tarmang) va kompilyator bir oz ketma-ketlikni aniqlaganda, yakuniy matn.

O'chirishsiz qachon va nimadan qochish kerakligini tushunish uchun siz satr o'tadigan kontekstlar zanjirini aniq tushunishingiz kerak. Siz eng uzun tomondan oxirgi manzilga yo'naltirasiz, bu oddiy ifoda sintacal tahlil kodini muntazam ravishda qayta ishlayotgan xotirani ko'rsatasiz.

Suv xotirada qayta ishlanganligini eslang: agar u kod satriga kiritilgan oddiy chiziq bo'lishi mumkin bo'lsa, u interfaol buyruq satri yoki qobiq skript faylida ko'rsatilgan buyruq satri yoki Kod yoki (satr) tomonidan tasdiqlangan xotira o'zgaruvchisi ichida, yoki boshqa har qanday terapiya bilan dinamik ravishda yaratilgan kodni o'z ichiga olgan satrda.

Ushbu kontekstning har biri maxsus funktsiyalar bilan bir nechta belgilar tayinlanadi.

Agar siz ramziy belgini maxsus funktsiyasidan foydalanmasdan (mahalliy kontekst uchun mahalliy) foydalanmasdan, siz uni keyingi kontekst uchun himoya qilishingiz mumkin ... qo'shimcha ravishda amalga oshirilishi mumkin bo'lgan boshqa ba'zi qahramon belgilari kerak bo'lishi mumkin Oldingi kontekst (oh). Bundan tashqari, belgi kodlashiga o'xshash narsalar bo'lishi mumkin (UTF-8 eng xavfli bo'lgan, chunki u umumiy belgilar uchun ASCIIga o'xshaydi, ammo u qo'shimcha ravishda o'z sozlamalariga qarab, qo'shimcha ravishda talqin qilish mumkin HTML / XML kodlash atributi jarayonni to'g'ri tushunish uchun zarurdir.

Masalan, Perl -NPE dan boshlab buyruq satrida muntazam ifoda faylni qayta ko'rib chiqadigan kanal sifatida o'tkazilishi kerak, bu faylni qayta ko'rib chiqadigan kanal sifatida o'tkazilishi kerak, ularning har biri ajratilgan dalillar ro'yxatiga ega (himoyalanmagan) bo'shliqlar va ehtimol kanallar (|) va qayta yo'naltirish (\u003e n\u003e n\u003e m), qavslar, interfaol kengaytma * vami? , $ (()) ... (Bularning barchasi * tomonidan ishlatiladigan maxsus belgilardir, ular quyidagi kontekstda muntazam ifoda echishiga xalaqit berishi mumkin, ammo ular buyurtma berishadi: buyruq satridan oldin. Bu buyruq satri Dastur bilan o'qing / Sh / CSH / TCSH / TCSH / Zsh sifatida o'qing, aslida qo'shinli va bitta tirnoq ichkariga kiradi, chunki buyruq satrida buyruq satrida qator qo'yish kerak emas, chunki asosan bo'shliq teskari yoriq xususiyatlari va kotirovkadan boshlanishi kerak, belgilar * va?, ammo u kotirovkada, lekin bu kabi kontekstni qoldiradi. Keyinchalik, xotirada olingan oddiy ibora. (buyruq satrida qayd etilganidek) manbadagi kabi ishlov berishni amalga oshiradi. Kvadrat qavslardagi oddiy ifodalar uchun mos keladigan belgilar kontekstida oddiy perl ifodasi katta bo'lmagan belgilarning katta to'plamiga o'rnatilishi mumkin (Masalan, m // il va m: / yaxshiroq / usuli: ...).

Sizda turli xil javoblar haqida batafsil ma'lumot bor, ular muntazam ifodaning yakuniy mazmuni uchun juda o'ziga xosdir. Siz ta'kidlaganimdek, siz boshqa kontekstni urinishlaringizni sozlagan boshqa belgilar mavjudligi sababli, ehtimol, boshqa kontekstning boshqa to'plamiga ega ekanligi haqida eslatib o'tasiz (ko'pincha teskari sli boshqa) o'z funktsiya o'rniga tom ma'noda aldash uchun kontekst.).

Eslatma: Saytning moslashuvchan versiyasi avtomatik ravishda brauzeringizning kichik hajmiga moslashtiradi va ba'zi saytlarning ba'zi sayt ma'lumotlarini o'qiganlik uchun tezlashtiradi. Baxtli tomosha!

Hammalarni muvaffaqiyatli tashkil etish va reklama qilishning barcha bosbaqlarini keltirib chiqaradigan barcha xushchaqchaq sahifalarda yana bir bor qabul qilishdan xursandman - Sayt. Yoqing! Bugungi PHP darsida biz quyidagi mavzularga murojaat qilamiz: o'zgaruvchilar, himoya qilish, mutaxassislar, shuningdek, PHP-da HereDoc Syntsiss.

O'zgaruvchi turlari

PHPda sakkiz xil o'zgaruvchi mavjud

4 Scalar turlari:

  • boolean (Boolean yoki mantiq turi)
  • butun son (butun sonlar)
  • suzish (suzuvchi nuqta raqami)
  • satr

2 aralashtirilgan turlar:

  • massiv (qator)
  • ob'ekt (ob'ekt)

2 Maxsus tur:

  • manba

Har bir turni batafsil ko'rib chiqish uchun davom etishdan oldin, php stansial tilda yozilgan, ammo dinamik yozish bilan til. Bu shuni anglatadiki, biz oldindan (yaratishda) har bir o'zgaruvchining turini e'lon qilish kerak emas. Ushbu o'zgaruvchini qo'yganimizdan kelib chiqqan holda, PHP o'zi bir yoki boshqa o'zgaruvchini taxmin qiladi. Shuningdek, bu qat'iy ravishda tvoroglar bilan farqli o'laroq, biz o'zgaruvchini (butun son) olib o'tishimiz mumkin va satrni (satrni) qo'yamiz va u xato bo'lmaydi! Bu PHPning xususiyatlaridan biridir, ular juda ko'p odamlar (yangi), ilgari dasturlash bilan shug'ullanmagan. Qoida tariqasida, oxirida hamma minus til, va plyus ekanligiga.

Boolean (mantiqiy) - eng oddiy tur. Atigi 2 qiymatni olishi mumkin: to'g'ri. yoki yolg'on (O'ng yoki noto'g'ri), ular mustaqil ro'yxatga olingan (siz haqiqat, to'g'ri va boshqa yozishingiz mumkin.). Valuar misol:

echo $ ism,
", $ 2;?\u003e

Natijada:

Ko'rinib turibdiki, brauzer phpdan farqli o'laroq, phpdan farqli o'laroq, php-dan farqli o'laroq, php turini tushunmaydi to'g'ri. yoki yolg'on U raqamni ko'rsatadi 1 yoki bo'sh satr.

Mantiqiy turga o'tishda quyidagi qiymatlar yolg'on deb hisoblanadi:

  • butun 0 (nol)
  • suzuvchi nuqta 0,0 (nol)
  • bo'sh satr va "0" yoki "0" satri
  • bo'sh massiv
  • maxsus NULL (shu jumladan noma'lum o'zgaruvchilar)

Boshqa barcha qadriyatlar haqiqat deb hisoblanadi.

// o'nlik raqam $ int \u003d -5; // salbiy raqam $ int \u003d 05; // oktal raqami $ int \u003d 0x1a; // hekadutimal raqam
// suzuvchi nuqta raqamlari (haqiqiy): $ FLT \u003d 1.4; $ FLT \u003d 1.2e3; $ FLT \u003d 7E-10; ?\u003e

Biroq, PHP-da eng ko'p ishlatiladigan turni hisobga olish mumkin satrlar (satr). Qatorlarni yakka yoki ikki marotaba yozib olish mumkin, ammo men sizdagi o'zgaruvchilarning mavjudligi uchun php tarjimonini "Payo" deb yozib qo'yishni hech qachon yozmayman, lekin biroz bo'lsa ham, lekin sekin ishning pasayishi. Agar siz belingizda o'zgaruvchilardan foydalanmoqchi bo'lsangiz, uni bitta tirnoq yordamida amalga oshirish mumkin (bir yoki undan ko'p chiziqlar). Nima uchun barchasini ikki baravar talab qiladi? Masalan, mutaxassislar (\\ n, \\ r va boshqalar) dan foydalanmoqchi bo'lganimizda, lekin ular haqida biroz vaqt o'tgach.

Bundan tashqari, foydalanishga arziydi yagona tirnoq + bog'lanish Elektron narxlar ortda bo'lganidan ko'ra ko'proq o'qiydi. Ammo etarlicha ilonlar, endi siz hamma narsani o'zingiz ko'rasiz va tushunasiz:

$ Raqam \u003d 2; // $ cleger1 \u003d "Odamlardagi qo'llar soni:"; // torli + o'zgaruvchilar uchun odamni yarating $ qo'l2 \u003d "inson qo'llari:"; // satr
// Ushbu satrlarga o'zgaruvchini qo'shish: $ resp1 \u003d "Odamlardagi qo'llar soni: $ raqami va hali ham matn ..."; // Men $ 2 \u003d "Biror kishiga qo'llar soni:". $ Raqam. "Va hali ham matn ..."; // tavsiya eting!
echo $ resp, "
", $ qo'li2;?\u003e

Natijada:

Keyingi maqolada bog'lanish haqida ko'proq gaplashamiz.

  • u doimiy ravishda tayinlangan Nol.
  • u hali biron bir ma'noga ega bo'lmagan.
  • u yordamida olib tashlandi damsiz ()

Ushbu bosqichda qolgan o'zgaruvchilarning qolgan turlarini o'rganish ma'nosiz bo'ladi. Qolgan turlar bilan biz ularni PHP-ni chuqur o'rganish bilan tanishamiz va sezamiz.

PHP-da saqlanmoqda.

Agar biz o'zingizning o'zgaruvchan qiymatini olishni istamasak-chi, lekin biz $ raqami raqami raqami yozishni xohlaymizmi? Ikkita variantni ko'rib chiqing:

$ resp1 \u003d "Odamlardagi qo'llar soni: \\ $ raqami va hali ham matn ..."; // men $ 2 \u003d "Odamlardagi qo'llar soni: $ raqami va hali ham matnni tavsiya qilmayman ..."; // tavsiya eting!
echo $ resp, "
", $ qo'li2;?\u003e

Natijada:

Birinchi versiyada (ikki marotaba), biz ushbu mutaxassisning o'ziga xos maqsadi (o'zgaruvchilarning belgisi) bo'lganligi sababli, biz bir dollarning maxsus ramzini ishlatdik.

Ikkinchi variantda (bitta tirnoq bilan) - siz allaqachon bilganingizcha (PHP tarjimoni o'zgaruvchini topishga ham harakat qilmadi va shuning uchun skrining kerak bo'lishi shart emas edi.

PHP-da maxsus tegirmonlar.

Ayniqsa blog o'quvchilari uchun Sayt. Yoqing! Men PHP dasturlash tilida maxsus belgilarning kichik ro'yxatini tayyorladim:

  • \\ N yangi qator
  • \\ r qaytish aravachasi
  • \\ T gorizontal jadval
  • \\\\ teskari jingalak (orqaga qaytish)
  • \\ $ dollar belgisi
  • \\ "Ikkita tirnoq

Keling, maxsus liniyani (kiruvchi sifatida) tarjima qilishga imkon beradigan maxsus mutaxassislar ishini ko'rib chiqaylik, ammo brauzerlar buni e'tiborsiz qoldirmaydilar (va kerak emas). Sahifaning manbali sahifasida ko'rish:

echo $ qoida, "
", $ 2;?\u003e

Natijada:

Manba kodi (Ctrl + u):

Agar brauzerga tashrif buyuruvchilar uchun maxsus mikser hech qanday tarzda namoyish etilmaydi, unda uning ma'nosi nima?

Birinchidan, maxsus ramzlar va \\ n, ayniqsa, siz sahifada kodni (yuqoridagi misolda) qulay tarzda formatlashingiz mumkin.

Ikkinchidan, \\ n ishlatilishi mumkin, masalan, pulni (Enter) va yangi liniyada qayd etishni davom ettirishda davom ettirishda.

Ushbu formatlashning alternativasi.

PHP-da HereDoc sintaksisi

Natijada:

Manba kodi (Ctrl + u):

Natijada o'zi uchun gapiradi, endi hamma narsa qanday tashkil etilganligini ko'rib chiqamiz:

  • Satr uchta burchakli qavs bilan boshlanadi<<<, далее следует имя идентификатора.
  • Hech qanday holatda ochilmagan identifikator (yorliq) bo'lgan satrda boshqa belgilar, shu jumladan bo'sh joyni o'z ichiga olishi kerak. Ya'ni, boshqacha qilib aytganda, bizning etikimizdan keyin darhol biz kirishimiz kerak, bo'sh joysiz kiring!
  • O'tkazmoq
  • Darslik

SQL in'ektsiya, o'zaro ta'sirlangan XML ... qo'rqinchli, dahshatli narsalar, biz o'zingizni himoya qilishni yaxshi ko'ramiz, lekin nima uchun bularning barchasi nima uchun sodir bo'lishini bilamiz. Ushbu maqolada bularning barchasining asosiy tushunchasini tushuntiradi: qatorlar ichida qatorlar va satrlarni qayta ishlash.

Asosiy muammo

Bu shunchaki matn. Ha, shunchaki matn - bu asosiy muammo. Kompyuter tizimidagi deyarli hamma narsa matn bilan ifodalanadi (bu, o'z navbatida, baytlar bilan ifodalanadi). Ba'zi matnlar kompyuter uchun mo'ljallangan va boshqa odamlar uchun mo'ljallangan. Ammo bular va ular hali ham matnda qoladilar. Men nima haqida gapirayotganimni tushunish uchun men ozgina misol keltiraman:
Homo sapiens. Aytaylik, ingliz tilida men ingliz tiliga tarjima qilishni xohlamayman

Bunga ishonmang: bu matn. Ba'zi odamlar buni XML deb atashadi, lekin bu shunchaki matn. Ehtimol, u ingliz tili o'qituvchisini namoyish etish uchun mos emas, lekin u hali ham shunchaki matn. Siz uni plakatda chop etishingiz va u bilan mitinglarga olib borishingiz mumkin, siz uni uyingiz maktubida yozishingiz mumkin ... Bu matn. Bu matn.

Shunga qaramay, ushbu matnning ba'zi qismlari bizning kompyuterimiz uchun ba'zi qiymatga ega bo'lishni xohlaymiz. Biz kompyuterni matn muallifini va matnning o'zi ajratib olishni istaymiz, shunda siz u bilan biron bir narsa qilishingiz uchun. Masalan, yuqorida aytib o'tilgan narsalarni o'zgartiring:
Aytaylik, ingliz tilida ingliz tilida homo sapiens tomonidan tarjima qilishni istamayman
Kompyuter buni qanday qilishni qaerda biladi? Xo'sh, biz matnning ba'zi qismlarini juda qiziqarli so'zlar bilan juda qiziqarli so'zlar bilan, masalan, masalan va va. Biz buni qilganimiz sababli, biz ushbu ba'zi qismlarni qidiradigan dasturni yozishimiz, matnni olib tashlagan va uni o'z ixtirolarimiz uchun ishlatishimiz mumkin.

Boshqacha qilib aytganda, biz bir xil qoidalarga rioya qilgan holda kimdir, kimdir muhim ahamiyatga ega ekanligini aniqlash uchun biz ma'lum bir qoidalardan foydalandik.
Mayli, tushunish unchalik qiyin emas. Va agar biz matnimizdagi ba'zi bir muhim ma'noga ega bo'lgan bu kulgili qavslardan foydalanmoqchi bo'lsak-chi, lekin bu ma'nodan foydalanmasdan? .. shunga o'xshash narsa:

Homo sapiens. < n and y >

Ramzlar "<" и ">"Ular alohida emas. Ular har qanday joyda, har qanday matnda, yuqorida aytilgandek, masalan, qanday qilib maxsus so'zlar haqida, masalan, qandaydir kalit so'z? XML-da? Ha. Va emas. Bu noaniqlik. Agar kompyuterlar noaniqliklar bilan shug'ullanmasa, men yuqoridagi barcha nuqtalarga xiyonat qilmasa va noaniqlikni yo'q qilmasak, kutilmagan natija berishi mumkin.
Siz bu dilemmani hal qilishingiz, noaniq narsaning noaniq belgilarini almashtirishingiz mumkin.
Homo sapiens. Asosiy matematik, agar x bo'lsa, agar x< n and y > N, x Yga qaraganda kattaroq bo'lishi mumkin emas.

Endi matn mutlaqo aniq bo'lishi kerak. "<" равносильно "<", а ">" - ">".
Buning texnik ta'rifi - himoya qilish Biz ularning alohida ahamiyatiga ega bo'lishlarini istamasligimizni istamasligimiz uchun maxsus belgilardan qochamiz.
Qochish | ISKAP | [Hech e'qirilmaydi. ] BEPUL [OBJ bilan. ] Biz sezmang / eslamang [...] [ObJ bilan. ] Bu: boshqacha tarjima qilinishiga olib keladi [...]
Agar matndagi belgilar yoki belgilarning ba'zi belgilari yoki ketma-ketligi alohida ahamiyatga ega bo'lsa, ushbu belgilar o'z ahamiyatini jalb qilmasdan, qanday qilib ishlatilishi kerakligini aniqlaydigan qoidalar bo'lishi kerak. Yoki boshqacha qilib aytganda, himoyachi savolga javob beradi: "Agar bu belgilar juda o'ziga xos bo'lsa, men ularni matningizda qanday ishlatishim kerak?".
Yuqoridagi misolni e'tiborga olish mumkin bo'lganligi sababli, ampersand (va) alohida ramz. Ammo biz yozishni istasak, nima qilish kerak "<", но без интерпретации этого как "<"? В XML, escape-последовательность для &, это - " & ", т.е. мы должны написать: " &< "

Boshqa misollar

XML maxsus belgilardan "azob chekish" ning yagona holati emas. Har qanday dasturlash tilidagi har qanday dastlabki kod buni namoyish qilishi mumkin:
Var Name \u003d "Homo Sapiens"; Var tarkibi \u003d "Aytaylik, ingliz tilida" rus tiliga tarjima qilishni xohlamayman ";
Hamma narsa oddiy - odatiy matn "matnni emas" ikki marotaba chiziqdan ajratilgan. Xuddi shu tarzda, mening matematik tahlil kursidan matndan foydalanishingiz mumkin:
Var Name \u003d "Homo Sapiens"; Var-kontent \u003d "Asosiy matematik, agar x bo'lsa< n and y > N, x Y ga qaraganda kattaroq bo'lishi mumkin emas. ";
Salqin! Va himoyalanishga murojaat qilish ham kerak emas! Ammo kuting va kimnidir iqtibos qilmoqchi bo'lsam nima bo'ladi?
Var Name \u003d "Homo Sapiens"; Var tarkibi \u003d "" Lorem Ipsum Dolor Sayt Amet "deb aytgan.
Hm ... qayg'u, qayg'u. Biror kishi sifatida siz qayerda boshlanadi va tugaydi va quotning qayerda joylashganligini aniqlay olasiz. Biroq, u yana har qanday kompyuter uchun noaniq edi. Biz tom ma'noda ajratishimizga yordam beradigan "va" matnning tugashini anglatadigan ba'zi bir ekranli qoidalar bilan tanishishimiz kerak. Ko'pgina tillarni dasturlashda murakkab xususiyatlardan foydalaning:
Var Name \u003d "Homo Sapiens"; Var tarkibi \u003d "Platoni bir marta" Lorem Ipsum Dolor "o'tirishiga ishongan."
"\\" o'ziga xos bo'lmagandan keyin belgi qo'yadi. Ammo bu yana, bu "\\" - bu maxsus ramz. Matndagi ushbu ramzning aniq yozilishi uchun siz yozma ravishda quyidagi belgini qo'shishingiz kerak: "\\\\". Kulgili, to'g'rimi?

Hujum!

Agar ular ekranni himoya qilish uchun murojaat qilishlari kerak bo'lsa, hamma ham yomon bo'lar edi. Albatta shtatlar, lekin bu unchalik dahshatli emas. Muammolar ba'zi dasturlar boshqa dasturlarni "O'qish" uchun matn yozishni boshlaydi. Yo'q, bu ilmiy fantastika emas, u doimo sodir bo'ladi. Masalan, ushbu saytda siz xabarni nashr qilasiz, HTML formatida qo'lda termang va faqatgina ushbu saytda HTML-ga aylantirgan matnni yozing, shundan keyin brauzer allaqachon " yaratilgan "html yana o'qilishi mumkin.

Boshqa xavfsizlik muammolarining yana bir umumiy namunasi va manbai - SQL so'rovlari. SQL - ma'lumotlar bazalari bilan aloqalarni soddalashtirish uchun mo'ljallangan til:
Ushbu matnda deyarli maxsus belgilar, asosan inglizcha so'zlar mavjud emas. Va aslida, SQL-dagi har bir so'z alohida ma'noga ega. U dunyodagi ko'plab dasturlash tillarida bir shaklda yoki boshqasida ishlatiladi, masalan:
$ so'rov \u003d "Ism \u003d" Aleks "" nomli foydalanuvchilardan telefon_Number-ni tanlang; $ natija \u003d mysql_query ($ so'rov);
Ushbu ikkita oddiy chiziqlar bizning talablarimizga javob beradigan ma'lumotlar bazasi dasturi uchun so'rovning dahshatli vazifasini bajaradi. "E'lonlar" ma'lumotlar bazasi, ehtimol, so'rovni amalga oshirgan dasturning chiroyli formatlangan natijasini qaytarish uchun bitlar va baytlar Terabayt va baytlar ma'lumot bazasi. Jiddiy ravishda, bularning barchasi oddiy anglo-ga o'xshash taklifda birlashadi.

Buni foydali qilish uchun bunday so'rovlar qattiq kodlar emas, balki foydalanuvchi kirish asosida qurilgan. Bu turli foydalanuvchilardan foydalanishga qaratilgan taklif:
$ ism \u003d $ _post ["Ism"]; $ so'rov \u003d "Ism \u003d" $ ism "" ni ulangan foydalanuvchilarning telefon_Numberini tanlang; $ natija \u003d mysql_query ($ so'rov);
Agar siz ushbu maqolani shunchaki ko'rsangiz: Bu anti-misol! Bu siz qila oladigan eng yomoni! Bu xavfsizlik dahshati! Har safar bunday narsa yozganingizda, bitta begunoh mushukchani o'ladi! Ktulhu bu uchun joningizni yutib yuboradi!

Va bu erda nima bo'lishini ko'rib chiqaylik. $ _Post ["Ism"] - tasodifiy foydalanuvchi tasodifiy veb-saytingizdagi tasodifiy shaklga kiritilgan qiymat. Sizning dasturingiz ushbu qiymatni ma'lumotlar bazasida topishni istagan foydalanuvchi nomi sifatida foydalanadigan SQL so'rovini yaratadi. Keyin bu SQL "Taklif" to'g'ri ma'lumotlar bazasiga yuboriladi.

Hamma narsa shunchalik dahshatli emas, ha? Keling, tasodifiy veb-saytingizga kiritilishi mumkin bo'lgan bir nechta tasodifiy qiymatlarni kiritishga harakat qilaylik va bu haqda qaysi so'rovlar paydo bo'ladi:

Alex.
Ism \u003d "Alex" ni ulovchi foydalanuvchilar_number-ni tanlang
MC "Donalds.
Ism \u003d "MC" Donalds "nomidagi foydalanuvchilardan telefon_Num raqamini tanlang
Jo '; Drop Stol foydalanuvchilar; -
Ism \u003d "Jo" dagi foydalanuvchilardan telefon_Num raqamini tanlang; Drop Stol foydalanuvchilar; -
Birinchi so'rov qo'rqinchli ko'rinmaydi, ammo juda yaxshi, to'g'rimi? 2 raqami, "biroz" biz sintaksisimiz bilan bog'liq. "Jin ursin nemis! 4 Raqam. Kim buni yozadi? Bu sezgir emasmi?
Ammo ma'lumotlar bazasini qayta ishlash so'rovi uchun emas ... ma'lumotlar bazasi ushbu so'rov kelib chiqqan joydan hech narsa yo'q va u nimani anglatishi kerak. U ko'rgan yagona narsa - ikkita so'rov: Jo ismli foydalanuvchi raqamini toping, so'ngra foydalanuvchilar jadvalini (bu sharh bilan o'chirib tashlang) va u muvaffaqiyatli amalga oshiriladi.

Siz uchun bu yangilik bo'lmasligi kerak. Agar shunday bo'lsa, iltimos, ushbu maqolani yana o'qing, chunki siz dasturlashda ham yangi kelgansiz yoki oxirgi 10 yil g'orda yashagansiz. Ushbu misol butun dunyodagi SQL in'ektsiyalarining asoslarini ko'rsatadi. Ma'lumotni o'chirish yoki ma'lumotlarni olish yoki tizimga kirmasdan, tizimga kirmaslik yoki tizimga kirmaslik kerak. Va ma'lumotlar bazasi juda ko'p "jumlani" ni ham o'z ichiga oladi.

Oooeeeee!

Keyingi qadam: XSS hujumlari. Ular xuddi shu tarzda harakat qilishadi, faqat HTML-ga murojaat qilishadi.
Aytaylik, siz ma'lumotlar bazasi bilan bog'liq muammolarni hal qildingiz, foydalanuvchidan ma'lumotlarni oling, ma'lumotlar bazasiga yozing va foydalanuvchilarga kirish uchun ularni veb-saytga qaytaring. Bu odatiy forum, sharh tizimini va boshqa narsani qiladi. Saytingizdagi biron bir joyda quyidagicha narsa bor:

E'lon qilingan. Yoqilgan.


Agar sizning foydalanuvchilaringiz yaxshi va mehribon bo'lsa, ular eski faylasuflarning tirnoqlarini joylashtiradilar va xabarlar quyidagi turga ega bo'ladi:

Platon tomonidan 2-yanvar 15:31

Aytdimki, "Lorem Ipsum Dolor, Conerertur Eits EriusMod Proreidid Haltahund UT Labeiam" Minim Minka Alika "," Minim Magna "alikasidir.


Agar foydalanuvchilar aqlli bo'lsa, ehtimol ular matematika haqida gaplashishadi va bunday xabarlar bo'ladi:

Paskal tomonidan e'lon qilingan 23-noyabr, 04:12

Asosiy matematik, agar x bo'lsa, agar x< n and y > N, x Yga qaraganda kattaroq bo'lishi mumkin emas.


Hmm ... yana bu bizning qavslarimizning odatiy qismi. Xo'sh, texnik nuqtai nazardan ular noaniq bo'lishi mumkin, ammo brauzer buni kechiradi, to'g'rimi?


Xo'sh, to'xtang, nima do'zax? Sizning forumingizga nima jovascript teglarini kiritdi? Saytingizdagi ushbu xabarga qaragan har bir kishi saytingizdagi yangiliklarga ega bo'lmagan saytingiz kontekstida skriptlarni yuklaydi va bajaradi. Va bu yaxshi emas.

Tom ma'noda tushunmang

Yuqoridagi holatlarda biz bizning ma'lumotlar bazamiz yoki brauzerimiz haqida qandaydir tarzda xabar berishni istaymiz, bu shunchaki matnni, u bilan hech narsa qilmaysiz! Boshqacha aytganda, biz barcha maxsus belgilarning maxsus qiymatlarini va foydalanuvchi tomonidan taqdim etilgan har qanday ma'lumotlarning kalit so'zlarini "o'chirishni" istaymiz, chunki biz unga ishonmaymiz. Nima qilsa bo'ladi?

Nima? Siz nima deysiz, bola? Oh, siz "ekranlash" deb aytasizmi? Va siz mutlaqo to'g'ri, cookie-ni oling!
Agar biz ularni so'rov bilan birlashtirishdan oldin foydalanuvchi ma'lumotlarini himoya qilish huquqiga ega bo'lsak, muammo hal qilinadi. Bizning ma'lumotlar bazamizning so'rovlari uchun u quyidagicha bo'ladi:
$ ism \u003d $ _post ["Ism"]; $ ism \u003d mysql_real_cing ($ ism); $ so'rov \u003d "Ism \u003d" $ ism "" ni ulangan foydalanuvchilarning telefon_Numberini tanlang; $ natija \u003d mysql_query ($ so'rov);
Faqat bitta kodi, lekin endi hech kim bizning ma'lumotlar bazamizni "hack" qila olmaydi. Keling, foydalanuvchi kirishiga qarab SQL so'rovlarini yana qanday ko'rinishini ko'rib chiqaylik:
Alex.
Ism \u003d "Alex" ni ulovchi foydalanuvchilar_number-ni tanlang
MC "Donalds.
Ism \u003d "MC \\" Donalds "nomidagi foydalanuvchilar tomonidan telefon_number-ni tanlang
Jo '; Drop Stol foydalanuvchilar; -
Ism \u003d "Jo \\" nomli foydalanuvchilar tomonidan telefon_Number-ni tanlang. Drop Stol foydalanuvchilar; -
MySQL_Real_cecappe_string - bu har bir narsaning oldida qiyshiq chiziq yopiq chiziq.


Biz HTMSPEIIalchars xususiyatlarini barcha ma'lumotlarga, ularni olib kelishdan oldin foydalanamiz. Endi zararkunandalar xabari quyidagicha ko'rinadi:

JackTtr tomonidan 18-iyul, 12:56


E'tibor bering, foydalanuvchilardan olingan qadriyatlar haqiqatan ham "buzilgan". Har qanday brauzer paritsi bu HTML kabi va to'g'ri shakldagi hamma narsani ko'rsatadi.

Bizni yana nima olib keladi ...

Yuqoridagi barcha barcha tizimlarning muammoli barcha muammolar mavjudligini ko'rsatadi: matndagi matn, agar u maxsus belgilar bo'lmasligi kerak deb taxmin qilinsa. SQL yilda Matnlarni qadriyatlarni joylashtirish, ular SQL qoidalar bilan himoyalanganligini kerak. Matnli qiymatlarni HTML-da joylashtirish, ular HTML qoidalari bilan himoyalangan bo'lishi kerak. Matn qiymatlarini (texnologiyali nomi) joylashtirish orqali ular qoidalar (texnologiya nomi) bilan himoyalanishi kerak. Ana xolos.

Tasdiqlash uchun

yoki maxsus belgilar bo'lmasligi kerak kerak jangovar foydalanuvchi ixtirochilar, boshqa yo'llari, albatta, bor:
  • Tasdiqlash.
    Foydalanuvchi kirishi ba'zi bir aniq xususiyatlarga mos kelishini tekshirishingiz mumkin. Agar siz raqamni kiritishni talab qilsangiz va foydalanuvchi boshqa narsaga kirsa, dastur unga bu haqda xabar berish va o'zgartirishni bekor qilishi kerak. Agar bularning barchasi to'g'ri tashkil etilgan bo'lsa, unda "Drop Stol foydalanuvchilari" ni olish uchun xavf yo'q, u erda qabul qilingan, foydalanuvchi "42" ni joriy qiladi. Bu, chunki, HTML / SQL enjeksiyonları oldini olish uchun juda foydali emas Ko'pincha "sayohat" ni o'z ichiga oladigan bepul format matnini qabul qilish kerak. Odatda tekshirish boshqa choralarga qo'shimcha ravishda qo'llaniladi.
  • Sanktsiya
    Siz xavfli deb hisoblagan har qanday belgilarni olib tashlash uchun siz ham "nam" mumkin. Masalan, forumingizga qo'shilmaydigan HTML yorlig'iga o'xshash narsani olib tashlang. muammo matn juda qonuniy qismlari o'chirish mumkin, deb hisoblanadi.
    Tayyorlangan SQL bayonotlari
    Biz erishgan biron bir narsani yaratadigan maxsus funktsiyalar mavjud: ma'lumotlar bazasini foydalanuvchilar tomonidan taqdim etilgan SQL so'rovi va ma'lumotlari o'rtasidagi farqlarni tushunish uchun ma'lumotlar bazasini majburlash. RNRda ular shunday ko'rinadi:
    $ STMT \u003d $ PDO-\u003e TAYYoRLANISh ( "foydalanuvchilar tanlang PHONE_NUMBER QAERDA NAME \u003d?"); $ STMT-\u003e execute ($ _ POST [ "NAME"]);
    Shu bilan bir vaqtda, yuborish aniq so'rov va argumentlarni ajrata, ikki bosqichda sodir bo'ladi. Ma'lumotlar bazasi dastlab so'rovning tuzilishini tushunish qobiliyatiga ega va keyin uni qiymatlar bilan to'ldirishga qodir.

  • Haqiqiy dunyoda bularning barchasi turli xil himoya choralari uchun birgalikda ishlatiladi. Foydalanuvchi to'g'ri ma'lumotlarni kiritishga ishonch hosil qilish uchun siz doimo tasdiqlash tekshiruvini (tekshirish) ishlatishingiz kerak. Keyin kiritilgan ma'lumotlarni skanerlashingiz mumkin (lekin majbur emas). Agar foydalanuvchi siz uchun skriptni "haydashga harakat qilsa, uni o'chirib tashlashingiz mumkin. Keyin, ularni SQL so'roviga joylashtirishdan oldin har doim shaxsiy ma'lumotlarni himoya qilishingiz kerak (HTML uchun ham xuddi shunday).

Muntazam iboralar haqida Direktoriyaning yilda "deb nomlangan bunday bo'lim yo'q Metra-ramzlari (himoyalangan) ". Bu bu meta ramzlari haqida (ular ham maxsus ramzlar deb nomlanadi) va biz ushbu maqolada gaplashamiz.

Maxsus belgilar - Bu harflar yoki raqam bo'lmagan belgilar. Ya'ni, bu barcha belgilar, harflar va raqamlardan tashqari.

Maxsus belgilar nuqta, yulduzcha, shuningdek, savol belgisi, panjara va boshqalar kabi belgilar deb hisoblanadi.

Oldingi maqolalardan ma'lumki, ba'zi maxsus belgilar muntazam ravishda alohida o'rin tutadi. Ya'ni har bir maxsus ramzning qanday bir turi bor.

Masalan, bir nuqta mutlaqo har qanday belgi degan ma'noni anglatadi. Yulduz noldan tugamas takrorlanish bir quantizer hisoblanadi. Bundan tashqari, biridan cheksiz takrorlanishlar. Xayoliy belgi ^ chiziqning boshlanishini anglatadi va dollar belgisi ($) satrning oxiri. Aytgancha, dollar belgisi ham xayoliy belgi. Biz kvadrat kavs ichida uni qo'yish, agar biz ham, ramzi ^ boshqa ahamiyatga ega, deb bilamiz. Oldingi maqolalarda ushbu qadriyatlar haqida gaplashdik.

Ushbu maqolada men savolga javob beraman " Muntazam ravishda maxsus belgilardan qanday foydalanish kerak ".

Bu alohida rol, muntazam bo'yicha maxsus belgini bekor qilish maqsadida, zarur qalqon. Shunday qilib, ushbu maxsus belgi aynan shu ramzni aniqlaydi. Ya'ni, himoyalangan nuqta hech qanday belgi emas, balki nuqta emas. Qo'llangan yulduzlar, takroriylarning namunalarini emas, balki do'konni anglatadi.

Himoya qilish Teskari ahmoqlik bilan qilingan. Ya'ni, ba'zi bir maxsus ramzni himoya qilish uchun siz uning oldiga qo'yishingiz kerak.

Aytaylik, bizda bunday vazifa bor "chiziq oxirida ko'rsatilganligini tekshiring." Shunday qilib, bu nuqta muntazam ifoda etish uchun, bu boshqa hech qanday belgi bilan emas, balki uni himoya qilish kerak.

Var Str \u003d "U qahramon"; var rege \u003d /. $ /; Ogohlantirish (reg.Test (str)); // haqiqat

Ko'rinib turibdiki, muntazam ifodaga rioya qilish liniyasini tekshirish natijasi to'g'ri. Agar biz chiziqning oxirigacha punktni olib tashlasak, natijasi allaqachon noto'g'ri bo'ladi.

Shunga o'xshab, boshqa maxsus belgilar ham himoyalangan.

Var Str \u003d "x + y \u003d / /, CO \\\\ La"; . Var reg \u003d / x \\ + y \u003d \\ n \\ * m \u003d \\ / CO \\\\\\ la /; Ogohlantirish (reg.Test (str)); // haqiqat

Bu erda biz himoya ramzlar plus (\\ +), ball (\\.), Yulduzlar (\\ *), odatiy qatlam (/ /) va teskari qatlam (\\\\\\). E'tibor bering, ketma-ket teskari qatlami ikki teskari zarbalar bilan yozilgan. Va u ham ikki teskari qatlamlari yordamida, muntazam ifoda bilan himoyalanganligini bo'ladi.

Biz posbonini foydalanayotgan bo'lsangiz, STR o'zgaruvchining String chekinmoq, keyin o'rniga ikki teskari Plitalar, faqat bir ko'rasiz.

Shunga o'xshab, katalogda ko'rsatilgan barcha belgilar meta-belgisida himoyalangan.

Va bu haqida, ehtimol, hamma narsa. Ushbu kichik maqoladan siz allaqachon bilasiz qanday qilib maxsus belgilarni himoya qilish kerak Oddiy iboralar tayyorlashda ularni qanday ishlatish kerak.

Vazifalar

  1. Biz rioya tekshirish kerak deylik, masalan, bir tor "Men $ 400 qo'lga kiritdi" Satr oxirida dollar belgisi borligini tekshiradigan muntazam ifoda yozing. Muvofiqlik uchun satrni tekshiring.