Internet Derazalar Android
Kengaytirmoq

XML xususiyatlari. XML-da ikki marotaba tirnoqlardan saqlanish kerak

Ushbu darsning maqsadi:

  1. BI Yozuv formasini bilishi kerak xML Til
  2. BI XML - kod shaklida hujjatni chizish kerak
  3. Bi ma'lumotlar turlarini bilishi kerak va ulardan foydalanish imkoniyatiga ega bo'lishi kerak

Eslatma: XML Til unchalik qisqa emas, chunki biz buni darsda ta'rifladik. Biz faqat ODA-TM tizimida ishlatiladigan XML tilining xususiyatlarini ko'rib chiqamiz.

XML. Jamg'arma

XML ma'lumotni saqlash, saqlash va tashish uchun yaratilgan.

Do'stingiz bilan do'stingiz do'stining quyidagi misoli, XML manzarasiga ega:

Nikolay Ivana Eslatish Umid qilamanki, uchrashuvimizni unutmadingiz

Siz ushbu kodni quyidagi shaklda vizual ravishda topshirishingiz mumkin (1-rasm.).

Kodekchining yuboruvchisi va oluvchining sarlavhasi va xabarlari bor.

U kimnidir hal qilish va namoyish etishni buyurish uchun mo'ljallangan.

Ammo, shunga qaramay, ushbu hujjat XML hech narsa qilmaydi. Bu shunchaki teglarga o'ralgan ma'lumotlar.

XML - daraxt

XMLda daraxt tuzilishi bor. Hujjat har doim ildiz elementiga ega (ko'rsatma) Munosabatlar munosabati yo'q). Daraxtning elementi har doim avlodlar va ajdodlar mavjud bo'lib, ularning ajdodlari bo'lmagan ildiz elementi, shuningdek, avlod bo'lmagan o'lik elementlar (daraxt barglari). Daraxtning har bir elementi ma'lum bir turdagi uyalarda (bundan keyin - »darajali"). Bir darajali elementlar avvalgi va quyidagi elementlardir.

XML-dan foydalanib, o'zingizning teglaringizni ishlating

Teglar (Dispermentlar, elementlar) yaratish standart format mavjud emas.

XML Tilni oldindan belgilangan teglar yo'q.

  • XML muallifga o'zining teglar va ularning hujjat tuzilishini belgilashga imkon beradi.
  • XML ma'lumotlarni uzatish uchun ishlatiladi
  • XML - bu ma'lumot uzatish uchun dasturiy ta'minot va apparatning mustaqil vosita.
  • XML, hozir HTML kabi tarmoq uchun ham muhimdir
  • XML turli xil dasturlar o'rtasida ma'lumotlarni uzatishning eng keng tarqalgan vositasidir.
  • XML veb-rivojlanishning ko'p jihatlarida qo'llaniladi, ko'pincha ma'lumotlar saqlash va almashishni soddalashtirish uchun

XML sintaksis

XML Qoidalar Sintakt juda sodda va mantiqiy

  • Barcha XML elementlari yopilish yorlig'iga ega bo'lishi kerak
  • XML elementlari to'g'ri o'rnatilgan bo'lishi kerak (bir-birining birida, hech qanday holatda ham kesmang)
  • XML - hujjatlar ildiz elementi bo'lishi kerak (XML hujjatlari boshqa elementlarning ota-onasi bo'lgan bitta element bo'lishi kerak. Ushbu mahsulot ildiz elementi deb ataladi.
  • XML - Atribut qiymati kotirovkalarga ilova qilinishi kerak.

Izohlar

Agar siz tahlilchi dasturi uchun "ko'rinmas", "ko'rinmas" ni "ko'rinmas" ajratish kerak bo'lsa, unda u izoh sifatida berilishi, belgilar yozilishi mumkin < !-- va undan keyin - belgilar --> Ketma-ket ikki nosozlik bilan.

Masalan:

< !-- Это комментарий -->

Tekshiruvchi dasturi ushbu dizaynni o'tkazib yuboradi, hatto unga "qarash" ham emas.

Bunday sharh sintaksis ham bunga ikkita cheklovni anglatadi:

  • sharhda ikkita belgi yozilmagan;
  • fikrni defis bilan yakunlash mumkin emas.

XML elementlar

XML element elementning boshlang'ich yorlig'idan boshlab va final bilan tugashdir.

Elementda quyidagilar bo'lishi mumkin:

  • boshqa elementlar
  • matn
  • atributlar
  • yoki yuqoridagilarning kombinatsiyasi ...

XML qoidalari nomlash

XML elementlar ushbu nomli qoidalarga amal qilishlari kerak:

  • Ismlarda harflar, raqamlar va boshqa belgilar bo'lishi mumkin.
  • Ismlar raqam yoki tinish belgisi bilan boshlanmaydi
  • Ismlarda bo'shliqlar bo'lolmaydi

Atributlar

Atributlar qo'shimcha ma'lumot Ma'lumotlarning bir qismi bo'lmagan elementlar bo'yicha.

Quyidagi misolda fayl turi ma'lumotlar bilan bog'liq emas, lekin buyumlarni manipabl qila oladigan dasturiy ta'minot uchun muhimdir:

kompyuter.gif kompyuter.

XML xususiyatlari tirnoqlarga ilova qilinishi kerak

Atribut qiymatlari har doim tirnoq ichida bo'lishi kerak. Yagona yoki ikki marta tirnoqlardan foydalanish mumkin. Masalan: Biror kishining polini aniqlash uchun elementni quyidagicha qayd etish mumkin:

Agar atribut qiymati ikki tomonlama tirnoq bo'lsa, siz ushbu misolda bo'lgani kabi, bitta tirnoqlardan foydalanishingiz mumkin:

yoki ramziy ob'ektlardan foydalanishingiz mumkin: & &

Ma'lumotlar turidan foydalanishning bir nechta misollari

Atribut sifatida sana

Totish. Yanvar. Eslatma. Bu hafta oxiri meni unutmang!

Element sifatida sana

10/01/2008 Totish. Yanvar. Eslatma. Bu hafta oxiri meni unutmang!

Element kengaytirilgan sana

10 01 2008 Totish. Yanvar. Eslatma. Bu hafta oxiri meni unutmang!

Metadata atributlari

Ushbu identifikatorlardan XML elementlarini aniqlash uchun ishlatilishi mumkin.

Misol:

Totish. Yanvar. Eslatma. Bu hafta oxiri meni unutmang! Yanvar. Totish. Re: Eslatma. Yo'q, men qilmayman.

Ma'lumotlar ma'lumotlari atribut sifatida saqlanishi kerak va ma'lumotlar o'zlari element sifatida saqlanishi kerak.

XML. Ma'lumotlar turi

O'rnatilgan oddiy turlar

Sana va vaqt

  • datifim. Formatdagi sana va vaqtni o'z ichiga oladi CCCY-MM-DIh: mm: ss
  • davomiyligi. - Vaqtinchalik davomiylikni anglatadi, u Gregori kunlari, soat, daqiqa va soniya komponentlari bilan ifodalanadi.

Masalan: Yozish P1y2m3dt10m45s. Ikki oy (1y), uch kun (3DT), o'n kun (10 soat), o'ttiz daqiqalar (30m) va 45 sekundi (45) degan ma'noni anglatadi.

Yozuvni qisqartirish mumkin p120m 120 oy, T120M - 120 daqiqa.

  • vaqt. an'anaviy formatda vaqtni o'z ichiga oladi hH: mm: ss
  • sana. Formatdagi sana o'z ichiga oladi CCINY-MM-DD
  • gyeemont. yil va oyni formatda ajratadi Cyy-Mm.
  • gyar. yilni formatda anglatadi CYYYY.
  • gorthday. formatda oy va kunni o'z ichiga oladi Mm-dd.
  • gragan. oyning formatida Dd.
  • gem. Oy formatda Mm.

Belgilar satrlari

satr - asosiy belgi turlari.

Unicode belgisining ketma-ketligi shaklida, shu jumladan makon, yorliqlar, tashish va transportning tarjimasi shaklidagi belgilar.

  • normallashtirish- Tarkib turlari - bu chiziqlar "\\ n" ni o'z ichiga olmaydi, "\\ r" vagonini va gorizontal yorlig'ini "\\ t" tasvirini qaytaring.
    • token. - Oddiylashtirilgan turdagi subtipe, qo'shimcha ravishda, boshlang'ich va oxirgi bo'shliqlar va bir nechta shartnomasiz bo'shliqlar.
      • til. - RFC 1766 tavsiyasiga muvofiq til nomini yozib olish, masalan, ru, en, de, fr.
      • Nmtoken. - ro'yxatga olingan qiymatlarini yozib olish uchun faqat atributlarda ishlatiladigan subtepe token.
      • Ism. - Subtpe token, harflar, raqamlar, defislar, nuqta, pozitsiyalar, yo'g'on ichak, yo'lakchalar, pastki qismida (harflar zaxirasi zaxirasi bundan mustasno) X, x, m, m, l, l Har qanday registrlar kombinatsiyasida) yoki pastki chiziqda. Satrdan boshlab ismlar xmlXML xususiyatlarini o'zi ishlatgan.
        • Ncname.- I yo'g'on ichadigan subtepe nomi. Uch nafar subtypes quyidagicha belgilanadi: ID, IDREF, mantiqiy

Ikkilik tur

  • yo'qoldi. - ikkilik, mantiqiy. Qiymatlarni oladi: haqiqiy yoki noto'g'ri (1 yoki 0)
  • bion64xey. - bazaviy64 kodlashda ikkilik sonlar
  • hexchlom. - Qo'shimcha belgilarsiz o'n oltilik bir xil bo'lgan ikkilik sonlar

Haqiqiy raqamlar

  • o'nlik Ruxsat etilgan nuqta bilan yozilgan haqiqiy raqamlar: 123.45, -0.4874798 va boshqalar.
  • ikki baravar. va suzmoq Ieee754-85 bilan belgilangan IEEE754-85 bilan belgilangan turlar.

Butun sonlar

  • butun son - Nol buyurtma bilan bo'lgan raqamlarni o'z ichiga olgan asosiy ichki turdagi subtie sifatida tushuniladi o'nlik
  • raqam - raqamni belgilaydi (raqamlar sonida cheklovlarsiz); Unda belgi, kasr, shuningdek, darajasi ko'rsatkichi bo'lishi mumkin. Qadriyatlar o'zgaradi

1.7976931348623157E + 308 dan 2.225507385858582014E-308 gacha

Chunki qochish belgisi bormi? ikki karra tirnoq XML-da? Men ko'rsatmalarni yozmoqchiman:

ammo agar men qo'ysam, "Keyin satr tugaganligini anglatadi. Menga shunga o'xshash narsa kerak (C ++):

Prinf ("Quote \u003d \\");

Qo'rquvdan qochish uchun ikki marta kotirovkadan oldin yozish uchun belgi bormi?

Yangi, eski savolga yaxshilangan javob, tez-tez so'raladigan savol ...

XML-da ikki marotaba tirnoqlardan saqlanish kerak

Ikki marta tirnoq (") paydo bo'lishi mumkin chiqmasdan :

    XML darsligida:

    U: "Menga ayting", dedi.

    Yagona tirnoq bilan ajratilgan XML xususiyatlarida:

    Eslatma: Yagona tirnoqlarga o'tish (") shuningdek ekranlashni talab qilmaydi:

Ikki marta dars (") himoyalangan bo'lishi kerak :

    Ikkita tirnoq bilan ajratilgan XML xususiyatlarida:

Pastki chiziq

Ikki marta mastocation ("XML-da) faqat cheklangan kontekstda saqlanishi kerak.

Agar siz tezda biron bir narsani sinab ko'rishingiz kerak bo'lsa, bu erda tez va iflos echim. Atribut qiymati uchun bitta tirnoqlardan foydalaning:

C ++ da siz Escapececl ATL API-dan foydalanishingiz mumkin. u to'g'ri yo'l Qayta ishlash maxsus belgilar...

Bu erda XML-da ishlatiladigan oddiy belgilar ikki baravar kozakkadan boshlab:

  1. ikki marta tirnoq (") qayta tiklanmoqda"
  2. amspan (&) ga tegadi va
  3. yagona tirnoq (") qayta tiklanadi"
  4. ozroq (<), экранируется до <
  5. dan ko'proq (\u003e), himoyalangan\u003e

Boshqalar bu holatda o'ziga xos tarzda himoyalanishni qanday engish kerakligini aytishdi.

Aniq javob uni o'zingiz qilishga urinmaslikdir. XML API-dan foydalaning - har bir zamonaviy dasturlash platformasi uchun juda ko'p mavjud.

XML APIS sizni avtomatik ravishda bajaring, uni amalga oshirib, buni amalga oshiradi uzoq Noto'g'ri borish qiyin. Agar siz XML APIni yozmasangiz, siz kamdan-kam hollarda bunday tafsilotlar haqida tashvishlanasiz.

Biz yana XML va ushbu maqolada ko'rib chiqish, shuningdek qo'llanmalar, sharhlar, sifatlarni qayta ishlash va boshqa XML elementlarini ko'rib chiqish kabi XML tuzilmalari bilan tanishamiz. Ushbu elementlar asosiy jihatdan mutlaqo murakkablik hujjatlarini joylashtirish uchun standartga muvofiq moslashuvchan va moslashuvchan tarzda moslashuvchan.

XML teglari kabi ba'zi lahzalar, biz allaqachon oldingi maqolada ko'rib chiqilganmiz ". Endi biz yana bir bor ushbu mavzuga aloqada bo'lamiz va biz uni batafsilroq tahlil qilamiz. Bu XML dizaynining butun rasmini taqdim etishingizni osonlashtiradi.

XML elementlar. Bo'sh va bo'sh XML elementlar

Oldingi maqolada aytib o'tilganidek, XML-dagi teglar faqat HTML-da sodir bo'lganda belgilangan, ammo ajratish alohida elementlar (Ob'ektlar). O'z navbatida, elementlar ierarxik ravishda ma'lumot beriladi, bu esa, o'z navbatida ularni XML Tilning asosiy tarkibiy bo'linmalarini qildi.

XML-da elementlar ikki xil bo'lishi mumkin - bo'sh va bo'sh joy bo'lishi mumkin. Bo'sh elementlar tarkibida matn yoki boshqa dizaynlar kabi ma'lumotlar mavjud emas. Bo'sh elementlardan farqli o'laroq, bo'sh bo'lmagan bo'shliqda matn yoki boshqa elementlar va XML dizaynlari kabi ma'lumotlar bo'lishi mumkin. Yuqoridagilarning mohiyatini tushunish uchun bo'sh va bo'sh XML elementlarining namunalarini ko'rib chiqaylik.

Bo'sh xml element

Bo'sh bo'lmagan XML elementi

Tarkib elementi ...

Yuqoridagi misoldan ko'rinib turibdiki, bo'sh elementlarning bo'shliqlarining asosiy farqi shundaki, ular faqat bitta yorliqdan iborat. Bundan tashqari, XML-da barcha ismlar harf-mustaqil ekanligi ta'kidlangan. Bu shuni anglatadiki, adilik, meelement va boshqalar. Ular o'zlari bilan farq qiladi, shuning uchun kelajakda xatolardan qochish uchun zudlik bilan esdan chiqarilishi kerak.
Shunday qilib, biz elementlar bilan shug'ullanamiz. Endi kelgusi daqiqada XML hujjatlarining mantiqiy tashkiloti kabi davom etamiz.

XML hujjatlarini mantiqiy tashkillashtirish. XML ma'lumotlari daraxtining tuzilishi

Yodingizda bo'lganingizdek, XML tilining asosiy dizayni boshqa o'rnatilgan tuzilmalarni o'z ichiga olishi va shu bilan daraxt shaklida ierarxik tuzilish hosil bo'lishi mumkin. Bunday holda, ota-ona elementi ildiz va boshqalar bo'ladi qizil elementlar XML daraxtining novdalari va barglari bor.

Yuqoridagilarning mohiyatini tushunishni osonlashtirish uchun, keling, quyidagi tasvirni misol bilan ko'rib chiqamiz.

Ko'rinib turibdiki, XML hujjatni daraxt shaklida tashkil etish - qayta ishlash uchun juda oddiy tuzilishdir. Shu bilan birga, daraxtning o'ziga xos murakkabligi juda katta. Bu XML-da ob'ektlarni tasvirlashning eng maqbul usuli bo'lgan daraxtning ifodasidir.

XML xususiyatlari. XML-dagi yozuvlarni yozib olish qoidalari

XML-da elementlar, shuningdek, bitta yoki ikki tomonlama tirnoqlarda belgilangan qiymatlar bilan atributlar bo'lishi mumkin. Element uchun atribut quyidagicha beriladi:

Bunday holda, "atribut" nomi va "qiymat" nomi bilan atribut ishlatilgan. XMM atributning bir oz qiymatini o'z ichiga olganligini darhol sezish kerakligini ta'kidlash kerak. Aks holda, kod XML nuqtai nazaridan noto'g'ri bo'ladi.

Shuningdek, narxlardan foydalanishga e'tibor berish kerak. Atribut qiymati ham bitta va ikki marotaba tirnoqlarda ilova qilinishi mumkin. Bundan tashqari, boshqa tirnoqlardan foydalanish ham mumkin. Namoyish qilish uchun quyidagi misollarni ko'rib chiqing.

Boshqa XML konstruktsiyalari bilan davom etishdan oldin, atributlarni ampermand va "yoki burchakli qavslar" deb baholashda atributlar yaratishda, qadriyatlar sifatida ishlatilishi mumkin emasligini ta'kidlaydi.<>" Ushbu belgilar menejerlar ("&" - mohiyati va "va" mohiyati sifatida saqlanadi "<» и «>»Elementlar yorlig'ini oching va yoping) va" toza shakl "da ishlatilishi mumkin emas. Ulardan foydalanish uchun maxsus ma'lumotni almashtirishga murojaat qilishingiz kerak.

XML ishlov berish bo'yicha ko'rsatmalar (ko'rsatmalar). XML Deklaratsiya

XML tilida, siz bir yoki boshqa hujjatni qayta ishlanadigan dasturlar uchun ba'zi ma'lumotlarni olib yuradigan ko'rsatmalarga berilishi mumkin. XMLni qayta ishlash bo'yicha ko'rsatmalar quyidagicha.

Yuqoridagi misoldan ko'rinib turibdiki, XML-da qayta ishlash uchun ko'rsatmalar kontur belgisi bilan burchak kotirovkalarida ilova qilinadi. Bu odatdagidek PHP-dan birinchi darslarda ko'rib chiqayotgan odatiy ma'lumotlarni eslatadi. Qayta ishlashning birinchi qismida ushbu yo'riqnomaning ikkinchi qismida yoki uning mazmuni uchun mo'ljallangan dastur yoki tizim. Bunday holda, ishlov berish bo'yicha ko'rsatmalar faqat ular hal qilingan dasturlar uchun amal qiladi. Qo'llash bo'yicha yo'riqnoma quyidagi ko'rsatma bo'lishi mumkin.

Ta'kidlash joizki, XMLda maxsus dizayn mavjud, bu qayta ishlash bo'yicha ko'rsatmalarga juda o'xshash, ammo o'zi bunga unday emas. Ishlov berishni o'tkazadigan XML deklaratsiyasi haqida gapiramiz dasturiy ta'minot Kodlash, masalan, til versiyasi yozilgan XML hujjatning xususiyatlari haqida ba'zi ma'lumotlar ushbu hujjat va hokazo.

Yuqoridagi misoldan ko'rinib turibdiki, XML deklaratsiyasi biz bir oz yuqorida aytib o'tgan odatiy xususiyatlarga juda o'xshash bo'lgan soxta atributlar mavjud. Gap shundaki, ta'rifi bilan XML deklaratsiyasi va qayta ishlash ko'rsatmalarini o'z ichiga olmaydi, shuning uchun bu e'lonlar soxta atribut deb ataladi. Turli xil xatolardan qochish uchun kelajakni eslash kerak.

Biz soxta atributtiya bilan shug'ullanganimiz sababli, ular nimani anglatishini ko'rib chiqaylik.

  • Kodlash - kodlash uchun javobgar XML hujjati. Odatda UTF8 kodlashidan foydalaniladi.
  • Versiya - bu hujjat yozadigan XML tilining versiyasi. Bu odatda XML versiyasi 1.0.

Xo'sh, endi maqolaning yakuniy qismiga boraylik va XML dizaynlarini CDATA izohlari va bo'limlari deb hisoblaymiz.

  • 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'tilganlarni quyidagicha 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 "Foydalanuvchilardan telefon_number-ni tanlang \u003d" Aleks ""; $ 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?
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 "o'chirishni" xohlaymiz va kalit so'zlar Foydalanuvchi tomonidan taqdim etilgan har qanday ma'lumotdan, 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-da matnli qiymatlarni joylashtirish, ular SQL qoidalariga amal qilishlari 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

Albatta, foydalanuvchi ixtirochilarga qarshi kurashishning boshqa usullari mavjud yoki unda maxsus belgilar bo'lishi kerak yoki bo'lmasligi kerak:
  • 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. HTML / SQL in'ektsiyalaridan qochish uchun bu juda amaliy emas, chunki 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 shundaki, siz matnning juda qonuniy qismlarini o'chirishingiz mumkin.
    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\u003e "Nom \u003d ismingiz /?"); $ Stmt-\u003e Bajarilgan ($ _ post ["Ism"]);
    Shu bilan birga, yuborish ikki bosqichda, so'rov va o'zgaruvchini aniq ajratib turadigan. 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).

Uzoq vaqt davomida standart kotirovkalarni ichkariga kiritish uchun belgilangan HTML-matn Atributlarni belgilash uchun "kotir teglar doirasida" dizaynni qo'llang.

Biroq, men hali kotirovkaning oddiy ramzi ekanligini ko'rsatadigan brauzerni boshlamaganman, shunda menga ayting, aziz hamkasblar, ehtimol hech kim uchun emasmi? Siz xavfsiz va ko'rinishingiz mumkin emasmi? "Yozishingiz mumkin emasmi?, Ayniqsa matnlarda, ko'plab tirnoq va qat'iy dizayn qoidalariga rioya qilish (milliy tirnoqlardan to'g'ri foydalanish haqida) ahamiyatsiz.

Imho, ko'plar buni qilishadi ... lekin savol aniq emas: agar siz andozalarga ko'ra, siz juda ko'p saytlar ishlashiga qaramay, siz juda ko'p saytlar ishlashiga qaramay, siz nima kutmoqdasiz va nima kutmoqdasiz? Eshitymi? Menimcha, kotirovkalarning yangi versiyalari mavjudmi yoki yo'qmi, shuning uchun siz yana 100% - standartlar bilan bog'liq muammolarni talab qilmang :) Ammo siz buni ham bilasiz Siz qilasiz yoki siz tasdiqlashni kutyapsiz. Bularning barchasi, bularning barchasi, va 10 yildan keyin hamma narsa bir xil bo'ladi va men (Microsoft, Mozilla I.T) kafolatmi?

Linn "kofeman" [dotier]
Ha, yo, men o'qishga tushdim ... endi o'qishga chiqdim, hech qaerda tirnoqni shakllantirish kerakligi haqida bahslashmaydi "
http://www2.stack.ru/~julia/html401/charset.html:

Ba'zi mualliflar ikki tomonlama tirnoqlarni kodlash uchun "" "ramziy mohiyatiga murojaat qilishadi, chunki bu belgi atribut qiymatlarini ajratish uchun ishlatilishi mumkin.

haqiqat haqida kerak Bu haqda aytganda<, > Va &:

Agar muallif ramzni matnga qo'yishni xohlasa "<", во избежание возможной путаницы с началом тега (метка начала тега) он должен использовать ссылку "<" (десятичный код ASCII 60). Точно так же во избежание проблем со старыми версиями пользовательских агентов, некорректно принимающих символы ">"Yorliqning tugashi uchun (yorliqning oxiri yorlig'i), siz"\u003e "havoladan foydalanishingiz kerak (1-o'nlik kodi).

"&" Belgisi bo'lmagan belgilar bilan bog'liq havolalar bilan chalkashliklarni oldini olish uchun "&" havoladan foydalanishingiz kerak (ASCII 38 o'nlik kodi). Bundan tashqari, "&" havolada shuningdek atributi qiymatlarida ishlatilishi kerak, chunki CDATA atributi qiymatlari qiymatidagi belgilarga havolalar ruxsat etiladi.

Ammo men shunchaki Linning javobi kabi narsani kutaman: aslida hech narsa yo'q. Men meni ham eslamadim - Ommaviy darsliklardan va "Hamma buni qilyapti" deb o'ylardim.

Yoki boshqa variant: Ammo agar siz mening amaliyotimda duch kelmagan bo'lsangiz, men kabi - bu kabi, men bunday diqqatni tekshirib ko'rmayapman. Shuning uchun, yozma HTML--kodning shaxsiyati bilan muammolarni yaratish kerak emas.

Xo'sh, yoki nihoyat: o'zingizni o'zingiz o'zingiz qilasizmi?

Aytgancha, shunga o'xshash savol tug'diradi. Yuqoridagi hujjatda hujjat "chalkashlikdan qochish uchun" deydi. Ammo bulangan kodlardan birini yoki keyinchalik men uchun chalkashlik mumkin. Agar aytaylik, aytaylik, u URL manzilini "... / skript? A \u003d 1 & b \u003d 2"? Agar xato tufayli xato qilsangiz, men biron bir xato qilsam, u URL manzilini ko'rsatdi (bu sinov paytida u to'g'ri ishlaydi)? Biror narsadan tashqari, bu 10 yil ichida (sayt eskirgan yoki o'n marta takrorlanganda), ismi ismi va b yordamida bir narsa bo'ladi; ? Boshqacha aytganda, bunday barcha bunday holatlarni tekshirish kerakmi?

Doniyor, agar siz mavjud kodlar bilan hech qanday muammo yo'qligiga amin bo'lsangiz - siz yozishingiz va oddiygina va oddiygina va oddiygina va. Agar kelajakda yangi kod paydo bo'lsa, unda u HTML 4.01 spetsifikatsiyasida aniq emas deb hisoblaydi, shuning uchun u odatda e'lon qilingan hujjatga ta'sir qilmasligi kerak. Yoki siz o'zingizni kelajakdagi standartlarni qo'llab-quvvatlash bilan ta'minlash uchun hisoblang oddiy o'zgarish Hujjat sxemalari?

Daniel Alievskiy [dosyer]
XML-da matn kabi oddiy kotirovkalar, shuningdek, muammo emas (mos ravishda XHTMLda, albatta). Imhono tirnoqlari odatda "faqat bitta sababga ko'ra" deb tarjima qilinadi - men XML / HTML / XHTML-da matn olib kelish uchun ikkita funktsiyani yozishni istamayman.