internet pencereler Android
Genişletmek

XML nitelikleri. XML'de çift tırnakdan kaçınırken

Bu dersin amacı:

  1. Bi kayıt formatını bilmeli xml dili
  2. Bi, bir XML - kodu biçiminde bir belge çizebilmelidir.
  3. Bi veri türlerini bilmeli ve bunları kullanabilmelidir.

Not: XML dili bu derste tanımladığımız kadar kısa değil. Sadece ODA-TM sisteminde kullanılacak olan XML dilinin özelliklerini göz önünde bulundururuz.

Xml. Kuruluş

Bilgileri mücadele etmek, saklamak ve taşımak için XML oluşturuldu.

Bir arkadaşın bir arkadaşının bir arkadaşının aşağıdaki örneği, XML görünümüne sahiptir:

Nikolai İvana Hatırlatma Umarım toplantılarımızı unutmadınız

Bu kodu görsel olarak aşağıdaki formda gönderebilirsiniz (Şek.1.).

Kodun bir göndereni ve bilginin alıcısı var, ayrıca bir başlığı ve bir mesaj gövdesi var.

Onu idare edecek, gönderilen ve sergileyen birinin olması amaçlanmıştır.

Ancak, yine de, bu belge XML hiçbir şey yapmaz. Bu sadece etiketleri sarılmış bilgidir.

XML - Ağaç

XML bir ağaç yapısı var. Belgenin her zaman bir kök öğesi vardır (talimat İlişkinin bir ilişkisi yoktur). Ağacın elemanı her zaman soyundan ve atalar dışında, ataları olmayan, çıkmaz elemanları (ağaç yaprakları) olmayan, tazı olmayan kök elemanları hariç. Ağacın her bir elemanı belirli bir yuvalama düzeyindedir (bundan sonra "" Seviye "). Bir seviyede elemanlar önceki ve aşağıdaki unsurlardır.

XML kullanarak kendi etiketlerinizi icat edin

Etiketler oluşturmak için (tanımlayıcılar, öğeler) standart boyut mevcut değil.

XML dilinin önceden tanımlanmış etiketleri yoktur.

  • XML, yazarın kendi etiketlerini ve kendi belge yapısını belirlemesini sağlar.
  • XML veri aktarmak için kullanılır
  • XML, bilgiyi aktarmak için bir yazılım ve donanımdan bağımsız bir araçtır.
  • XML, şimdi şebeke için HTML olarak da önemlidir.
  • XML, farklı uygulamalar arasında veri iletmek için en yaygın araçtır.
  • XML, Web Geliştirme'nin birçok yönünde, genellikle veri depolama ve değişimini kolaylaştırmak için kullanılır.

XML Sözdizimi

XML Kuralları Sözdizimi çok basit ve mantıklı

  • Tüm XML öğelerinin bir kapanış etiketine sahip olması gerekir
  • XML elemanları uygun şekilde gömülmelidir (bir diğerinde ve hiçbir durumda, kesişmez)
  • XML - Belgelerin kök elemanına sahip olması gerekir (XML belgeleri, diğer tüm öğelerin ebeveyni olan bir element içermelidir. Bu öğenin kök öğesi olarak adlandırılır.
  • XML - öznitelik değeri tırnak içine alınmalıdır.

Yorumlar

Genel olarak XML belgesinin bir parçası yapmanız gerekiyorsa, Analyzer programı için "görünmez", o zaman bir yorum olarak yayınlanabilir, sembolleri yazabilir. < !-- ve sonra - semboller --> Üst üste iki bölüm ile.

Örneğin:

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

Analizör programı, "bakmamak" bile değil, tüm bu tasarımları kaçırır.

Böyle bir yorum sözdizimi, üzerine iki kısıtlama getirir:

  • yorumda iki hata kaydedilmedi;
  • yorum bir tire ile tamamlanamaz.

XML Elemanları

Bir XML elemanı, elemanın ilk etiketinden başlayarak ve finalle bitmektedir.

Öğe şunları içerebilir:

  • diğer elementler
  • metin
  • Öznitellikler
  • veya yukarıdakilerin bir kombinasyonu ...

XML Kuralları adlandırma

XML elemanları bu adlandırma kurallarına uymalıdır:

  • İsimler harfler, sayı ve diğer karakterler içerebilir.
  • İsimler bir sayı veya noktalama işareti ile başlayamaz
  • İsimler boşluk içeremez

Öznitellikler

Nitelikler sağlar ek Bilgiler Verilerin bir parçası olmayan elemanlarda.

Aşağıdaki örnekte, dosya türü verilerle ilgili değildir, ancak öğeleri manipüle edebilen yazılımlar için önemlidir:

computer.gif.

XML nitelikleri tırnak içine alınmalıdır

Öznitelik değerleri her zaman alıntılarda olmalıdır. Ya tek veya çift tırnak kullanılabilir. Örnek: Bir kişinin tabanını belirlemek için, eleman aşağıdaki gibi kaydedilebilir:

Öznitelik değerinin kendisi çift tırnak içeriyorsa, bu örnekte olduğu gibi tek tırnakları kullanabilirsiniz:

veya sembolik nesneleri kullanabilirsiniz: & &

Veri türü tarihini kullanmanın birkaç örneği

Öznitelik olarak tarih

TOVE. Jani. HATIRLATMA. Beni bu hafta sonu unutma!

Element olarak tarih

10/01/2008 TOVE. Jani. HATIRLATMA. Beni bu hafta sonu unutma!

Uzatılmış bir öğe olarak tarih

10 01 2008 TOVE. Jani. HATIRLATMA. Beni bu hafta sonu unutma!

Meta veri nitelikleri

Bu tanımlayıcılar, XML öğelerini tanımlamak için kullanılabilir.

Misal:

TOVE. Jani. HATIRLATMA. Beni bu hafta sonu unutma! Jani. TOVE. RE: Hatırlatma. Yapmayacağım.

Veri verileri öznitelik olarak kaydedilmelidir ve verilerin kendileri eleman olarak kaydedilmelidir.

Xml. Veri tipi

Dahili basit tipler

tarih ve saat

  • datetime. Formatta tarih ve saat içerir CCYY-MM-DTHH: MM: SS
  • süre. - Gregory Günleri, Saatler, Dakikalar ve Saniye'nin bileşenleri tarafından ifade edilen geçici bir süreyi temsil eder.

Örneğin: Kayıt P1y2m3dt10h30m45s. Bir yıl (1y), iki ay (2m), üç gün (3DT), saat on saat (10 saat), otuz dakika (30m) ve 45 saniye (45s) anlamına gelir.

Kayıt, P120M, 120 ay ve T120M - 120 dakika kısaltılabilir.

  • zaman. Geleneksel formatta zaman içerir hH: MM: SS
  • tarihi. Biçiminde tarih içerir Ccyy-mm-dd
  • gYEARMONTH. Yıl ve ay aylarında ayırır Ccyy mm.
  • gyear. biçiminde yıl anlamına gelir Ccyy.
  • gmonthday. ay ve gün biçiminde içerir Mm-dd.
  • İyi günler. ayın günü Dd
  • gmonh. Ayda ay Mm.

Sembol dizeleri

dize - Temel karakter türü.

Alan, sekme, satır başı ve bir satır çeviri de dahil olmak üzere Unicode sembolü dizisi biçiminde bir karakter dizisi.

  • normalize özgü- Tür alt tipi - bunlar "\\ n" karakter çeviri karakterlerini içermeyen dizelerdir, "\\ R" ve "\\ t" yatay sekmesini döndürün.
    • jeton. - Normalize gönderme tipinin alt tipi, ek olarak, ilk ve son boşluklar ve birkaç müteahhitlik boşluğudur.
      • dil. - Örneğin, RFC 1766 önerisine göre bir dil adı kaydetmek için tanımlanmış alt tip belirteci, örneğin, ru, en, de, fr.
      • Nmtoken. - SubTip belirteci, yalnızca listelenen değerlerini kaydetmek için özniteliklerde kullanılır.
      • İsim. - alt tip belirteci, XML adlarını oluşturun - harften başlayarak, harften başlayarak harf, sayı, tire, nokta, kolon, alt çizgi, alt çizgi (harflerin ayrılmış dizisi hariç) X, x, m, m, l, l Herhangi bir kayıt kombinasyonunda) veya alt çizgi. Dize ile başlayan isimler xmlXML spesifikasyonunu kullandı.
        • Ncname.- Kolon içermeyen alt tip adı. Üç alt tip tanımlanmıştır: İd, idref, varlık

İkili Çeşitler

  • boolen. - İkili, mantıksal. Değerleri alır: Doğru veya Yanlış (1 veya 0)
  • base64Binary. - Base64 kodlamasında ikili tamsayılar
  • hekpinary. - Herhangi bir ek karakter olmadan onaltılık üniformalı ikili tamsayılar

Gerçek sayılar

  • ondalık Sabit bir nokta ile kaydedilen gerçek numaralar: 123.45, -0.48747798, vb.
  • Çift. ve şamandıra. Türler, sabit veya kayan bir nokta ile kaydedilen IEEE754-85'e uygundur.

Tüm sayılar

  • tamsayı - Sıfır sipariş içeren sayıları içeren ana tüm tip, bir alt tip olarak anlaşılmaktadır. ondalık
  • numara - sayıyı belirler (sayılar sayısındaki kısıtlamalar olmadan); Bir işaret, kesir ve derecenin bir göstergesi içerebilir. Değerler değişikliği

1.7976931348623157E + 308 - 2.2250738585072014e-308

İçin bir kaçış sembolü var mı İkili alıntı XML'de? Bir etiket yazmak istiyorum:

ama eğer koyarsam, "o zaman dizenin bittiği anlamına gelir. Böyle bir şeye ihtiyacım var (C ++):

Printf ("quote \u003d \\" ");

Kaçınmak için çift alıntıdan önce yazmak için bir sembol var mı?

Eski, sık sorulan soruya yeni, gelişmiş cevap ...

XML'de çift tırnakdan kaçınırken

Çift tırnak (") görünebilir çıkış olmadan :

    XML ders kitabında:

    "Beni bırakma" dedi.

    Tek tırnak (") ile ayrılan XML niteliklerinde:

    Not: Tek tırnaklara (") geçişi de koruma gerektirmez:

Çift tuhaf (") korumalı olmalı :

    Çifte alıntılarla ayrılmış XML niteliklerinde:

Alt çizgi

Çift tuhaf (") sadece çok sınırlı bir bağlamda" XML'de "olarak korunmalıdır.

Sadece bir şeyler denemeniz gerekirse, burada hızlı ve kirli bir çözüm. Öznitelik değeri için tek tırnak kullanın:

C ++ 'da, Escapexml ATL API'sini kullanabilirsiniz. o doğru yol İşleme Özel karakterler...

İşte, XML'de korunacak ortak semboller, çift tırnak ile başlayarak:

  1. Çift tırnak (") sıfırlanır"
  2. ampsand (&) ve
  3. tek tırnak (") sıfırlanır"
  4. daha az (<), экранируется до <
  5. (\u003e) 'dan fazla,\u003e için korumalı

Diğerleri bu durumda belirli bir koruma ile nasıl başa çıkılacağına cevap verdi.

Daha geniş bir cevap, kendiniz yapmaya çalışmak değildir. XML API'sini kullanın - her modern programlama platformu için pratikte çok fazla mevcuttur.

XML API'leri sizin için otomatik olarak böyle şeyler halletir, irak Yanlış gitmek zor. XML API'sini kendiniz yazmazsanız, nadiren bu detaylar için endişelenmeniz gerekir.

Yine XML'yi keşfetmeye devam ediyoruz ve bu makalede işleme talimatları, yorumlar, öznitelikler ve diğer XML elemanları gibi XML yapılarıyla tanışacak. Bu unsurlar, kesinlikle herhangi bir karmaşıklığın belgelerini yerleştirmek için standartlara uygun olarak, temeldir ve esnektir.

XML etiketleri gibi bazı anlar, zaten önceki makalede kısmen düşündük ". Şimdi bir kez daha bu konuya dokunacağız ve daha ayrıntılı olarak analiz edeceğiz. Bu, özellikle XML tasarımlarının tüm resmini sunmanızı kolaylaştırmak için yapılır.

XML öğeleri. Boş ve boş olmayan XML elemanları

Önceki makalede belirtildiği gibi, XML'deki etiketler sadece HTML'de olduğu gibi işaretlenmemiş, ancak tahsis edilmesi ayrı elemanlar (Nesneler). Buna karşılık, elemanlar belgedeki bilgileri hiyerarşik olarak düzenler, bu da bunları XML dilinin ana yapısal birimlerini yapmıştır.

XML'de, elemanlar iki tip olabilir - boş ve boş olmayan. Boş elemanlar, metin veya diğer tasarımlar gibi herhangi bir veri içermez. Boş elemanların aksine, boş olmayan, metin veya diğer öğeler ve XML tasarımları gibi herhangi bir veri içerebilir. Yukarıdakilerin özünü anlamak için boş ve boş olmayan XML elemanlarının örneklerini dikkate alalım.

Boş XML öğesi

Boş olmayan XML öğesi

İçerik elemanı ...

Yukarıdaki örnekten gördüğümüz gibi, boş olmayan elemanların boşluğun ana farkı sadece bir etiketten oluşmalarıdır. Ayrıca, XML'de tüm isimlerin vaka bağımsız olduğu söylemeye değer. Bu, MyEeLement, MyElement, MyElement, vb. Onlar kendi aralarında farklılık gösterir, bu yüzden şu an gelecekte hataları önlemek için hemen hatırlanmalıdır.
Yani, elemanlarla uğraştık. Şimdi, XML belgelerinin mantıksal organizasyonu gibi bir sonraki an için geçelim.

XML belgelerinin mantık organizasyonu. Ağaç yapısı XML verileri

Hatırladığınız gibi, XML dilinin ana tasarımı, diğer gömülü yapılar içerebilen ve böylece bir ağaç şeklinde hiyerarşik bir yapı oluşturabilecek unsurlardır. Bu durumda, ebeveyn elemanı kök ve diğerleri olacaktır. kızı elemanları XML ağacının dalları ve yaprakları var.

Yukarıdakilerin özünü anlamayı kolaylaştırmak için, aşağıdaki görüntüyü bir örnekle düşünelim.

Gördüğümüz gibi, XML belgesinin bir ağaç formundaki organizasyonu, işleme için oldukça basit bir yapıdır. Aynı zamanda, ağacın kendisinin etkileyici karmaşıklığı oldukça büyüktür. XML'deki nesneleri tanımlamanın en iyi yolu olan bir ağaç gösterimidir.

XML nitelikleri. XML'de Öznitelik Kayıt Kuralları

XML'de, elemanlar ayrıca tek veya çift tırnak içine yerleştirilmiş atanmış değerlerle de öznitelikler içerebilir. Öğenin özniteliği aşağıdaki gibi verilmiştir:

Bu durumda, "öznitelik" adlı bir özellik ve "değer" değeri kullanıldı. XML özniteliğinin mutlaka bir değer içermesi gerektiğini ve boş olamayacağına dikkat etmek gerekir. Aksi takdirde, kod XML'nin bakış açısından yanlış olacaktır.

Ayrıca, alıntıların kullanımına dikkat etmeye değer. Özellik değeri hem tek hem de çift tırnak içine alınabilir. Ek olarak, diğerlerinin içindeki bazı alıntılar kullanmak da mümkündür. Göstermek için aşağıdaki örnekleri göz önünde bulundurun.

Diğer XML yapılarına devam etmeden önce, aynı zamanda değerler gibi özel karakterler olarak nitelikler oluştururken "ve" veya açısal braketler "olarak nitelikler oluşturulduğunu da belirtmek ister.<>" Bu karakterler yöneticiler olarak ayrılmıştır ("&" - özü ve "<» и «>»Eleman etiketini açın ve kapatın) ve" saf formda "kullanılamaz. Onları kullanmak için özellerin değiştirilmesine başvurmanız gerekir.

XML İşleme Talimatları (İşleme Talimatları). XML bildirimi

XML dilinde, bir veya başka bir belgeyi işleme koyacak uygulamalar için belirli bilgileri taşıdığınız belgedeki talimatlarda etkinleştirmek mümkündür. XML işleme talimatları aşağıdaki gibidir.

Yukarıdaki örnekten görülebileceği gibi, XML'de, işleme talimatları bir soru işareti olan açısal alıntılara eklenir. Bu, PHP'deki ilk derslerde düşündüğümüz, her zamanki gibi hatırlatır. İşleme talimatının ilk bölümünde, bu talimatın ikinci kısmı veya içeriğinin ikinci kısmı için tasarlanmış olan uygulama veya sistem. Bu durumda, işleme talimatları yalnızca ele alındıkları uygulamalar için geçerlidir. İşleme talimatına bir örnek aşağıdaki talimat olabilir.

XML'de, işleme yönergelerine çok benzer olan özel bir tasarım olduğuna dikkat etmeye değer, ancak kendisi değil. İşlemi ileten XML bildirimi hakkında konuşuyoruz yazılım Kodlama gibi XML belgesinin özellikleri hakkında bazı bilgiler, tam olarak yazıldığında dil sürümü bu belge vb.

Yukarıdaki örnekten görülebileceği gibi, XML bildirimi, bir miktar yukarıda konuştuğumuz normal niteliklere çok benzeyen sözde sözde öznitelikleri içerir. Gerçek şu ki, tanım gereği, XML bildirimi ve işleme talimatları özellikleri içeremez, bu nedenle bu reklamlar psödo-attilif olarak adlandırılır. Geleceğin çeşitli hataları önlemesini hatırlamaya değer.

Pseudo-Attributigium ile uğraştığımızdan beri, ne demek istediğine bakalım.

  • Kodlama - kodlamadan sorumlu XML belgesi. Genellikle UTF8 kodlaması kullanın.
  • Sürüm, bu belgenin yazıldığı XML dilinin sürümüdür. Bu genellikle XML sürüm 1.0.

Şimdi, makalenin sonuçlandırılmasına gidelim ve CDATA'nın yorumları ve bölümleri olarak böyle bir XML tasarımlarını düşünelim.

  • Aktar
  • Öğretici

SQL Enjeksiyonu, Çapraz Hatlı Taleplerin Sahte, Hasarlı XML ... Korkunç, korkunç şeyler, hepimizin kendinizi korumaktan hoşlanacağımız, ama hepsinin neden olduğunu biliyoruz. Bu makalede, tüm bunların arkasındaki temel konsepti açıklar: satırların içinde satırlar ve satır işleme.

Asıl sorun

Bu sadece metin. Evet, sadece metin - işte asıl sorun. Bilgisayar sistemindeki hemen hemen her şey metin tarafından temsil edilir (sırayla baytlar tarafından temsil edilir). Bazı metinlerin bir bilgisayar için ve diğerleri için tasarlanmıştır. Ancak bunlar ve bunlar hala metin kalıyor. Ne hakkında konuştuğumu anlamak için küçük bir örnek vereceğim:
Homo sapiens. Sanırım Rusça'ya çevirmek istemiyorum İngilizce metin var.

İnanmıyorum: Bu metin. Bazı insanlar buna XML diyor, ancak bu sadece metin. Belki de İngilizce öğretmeni göstermek için uygun değildir, ancak hala sadece metin. Bir poster üzerine yazdırabilir ve onunla yürütebilirsiniz, annenizi harfe yazabilirsiniz ... bu metin.

Bununla birlikte, bu metnin belirli bölümlerinin bilgisayarımız için bir değere sahip olmasını istiyoruz. Bilgisayarın metnin yazarını ve metnin kendisini ayrı ayrı ayıklayabilmesini istiyoruz, böylece bir şey yapabilirsiniz. Örneğin, yukarıda belirtilenleri şunlara dönüştürün:
Diyelim ki, Homo Sapiens tarafından Rusça'ya çevirmek istemiyorum İngilizce metin var.
Bilgisayar nasıl yapacağını nereden biliyor? Peki, çünkü metnin belirli kısımlarını, örneğin, ve örneğin, ve gibi eğlenceli parantez içinde özel kelimelerle sarıldık. Bunu yaptığımızdan beri, bu belirli parçaları arayacak bir program yazabiliriz, metni kaldırdı ve kendi buluşumuz için kullanırlardı.

Başka bir deyişle, birisinin aynı kuralları gözlemleyebileceği bazı özel önemi tanımlamak için metnimizde belirli kuralları kullandık.
Tamam, anlaması çok zor değil. Ve ne yazık ki bu komik parantezleri metnimizde özel bir anlamı kullanmak istiyorsak, ama bu çok anlamı kullanmadan? .. Böyle bir şey:

Homo sapiens. < n and y >

Semboller "<" и ">"Özel değiller. Yasal olarak herhangi bir yerde, yukarıdaki örnekte olduğu gibi herhangi bir yerde kullanılabilirler. Ama özel kelimelerle ilgili fikrimiz nasıl? Bu demek ki, bir tür anahtar kelime nedir? XML'de? Evet. Ve belki de değil. Bu belirsizdir. Bilgisayarlar belirsizliklerle başa çıkmadığından, bunun sonucunda bir şeyin öngörülemeyen bir sonucu verebilir, eğer yukarıdaki tüm noktalara müdahale etmem ve belirsizliği ortadan kaldırmazsak, öngörülemeyen bir sonuç verebilir.
Bu ikilemi çözerek belirsiz bir şeyin belirsiz sembollerini değiştirebilirsiniz.
Homo sapiens. Temel Matematik bize x'i söyler.< n and y > N, x Y'dan büyük olamaz.

Şimdi, metin tamamen açık olmalıdır. "<" равносильно "<", а ">" - ">".
Bunun teknik tanımı - koruyucu Özel sembollerden kaçındığımızda özel sembollerden kaçınırız.
Kaçış | iskāp | [Obj yok. ] [Obj ile serbest bırak. ] Farketme / hatırlamayın [...] [Obj ile. ] Bu: farklı şekilde yorumlanmanın nedeni [...]
Metin içindeki karakterlerin belirli karakterleri veya dizileri özel bir önemliyse, bu karakterlerin özel önemini çekmeden kullanılması gerektiği durumların nasıl çözüleceğini belirleyen kurallar olmalıdır. Ya da başka bir deyişle, koruma soruyu cevaplar: "Bu karakterler çok özelse, sonra onları metninizde nasıl kullanmalıyım?".
Yukarıdaki örnekte farkın olabileceği için, Amper ve (&) aynı zamanda özel bir semboldür. Ama yazmak istiyorsak ne yapmalı "<", но без интерпретации этого как "<"? В XML, escape-последовательность для &, это - " & ", т.е. мы должны написать: " &< "

Diğer örnekler

XML, özel karakterlerden gelen "acı çeken" vakası değildir. Herhangi bir programlama dilinde herhangi bir kaynak kodu gösterebilir:
Var ad \u003d "homo sapiens"; Var içerikleri \u003d "varsayalım, Rusça'ya çevirmek istemiyorum İngilizce metin var";
Her şey basittir - normal metin açıkça "metin değil" çift alıntılardan ayrılmıştır. Aynı şekilde, matematiksel analiz kursundan metnim kullanılabilir:
Var ad \u003d "homo sapiens"; Var içerikleri \u003d "Temel Math bize x ise< n and y > N, x Y'dan büyük olamaz. ";
Güzel! Ve korumaya başvurmaya bile ihtiyacınız yok! Ama bekle ve ne birinden alıntı yapmak istersem?
Var ad \u003d "homo sapiens"; Var içerikleri \u003d "Plato'nun bir zamanlar" Lorem Ipsum Dolor'un Amet oturun "dedi.";
Hmm ... üzüntü, özlem. Bir kişi olarak, metnin nerede başladığını ve neyin bittiğini ve alıntının nerede olduğunu belirleyebilirsiniz. Ancak, herhangi bir bilgisayar için tekrar belirsiz hale geldi. Metinin sonu anlamına gelen, değişmez "ve" ile ayırt etmemize yardımcı olacak bir tür koruyucu kurallar bulmalıyız. Çoğu dil programlama kullanın eğik özellikler:
Var ad \u003d "homo sapiens"; Var içerikleri \u003d "Plato, bir zamanlar" Lorem Ipsum Dolor Sit Amet \\ "olduğunu söyledi.";
"\\" Özel olmadıktan sonra bir sembol yapar. Ama bu, yine, "\\" özel bir sembol olduğu anlamına geliyor. Bu sembolün metinde kesin olarak yazılması için, yazarak aynı sembolü eklemeniz gerekir: "\\\\". Komik, değil mi?

İfal!

Koruyucu için başvurmak zorunda kalırlarsa her şey o kadar kötü olurdu. Elbette suşları, ama bu kadar korkunç değil. Bazı programlar, diğer programlar için "okumak" için metin yazdığında sorunlar başlar. Ve hayır, bilim kurgu değil, sürekli olur. Örneğin, bu sitede, bir mesaj yayınlayın, bir mesaj yayınlayın, HTML biçiminde manuel olarak çevirmeyin ve yalnızca bunun sonucunda bu site tarafından HTML'de dönüştürüldüğü metni yazın, ardından tarayıcı zaten dönüştürülür. Oluşturulan "HTML tekrar okunabilir metinde.

Bir başka yaygın örnek ve birçok güvenlik probleminin kaynağı - SQL istekleri. SQL - Veritabanlarıyla iletişimi kolaylaştırmak için tasarlanmış dil:
Bu metinde, pratik olarak hiçbir özel karakter, çoğunlukla İngilizce kelime yoktur. Yine de, aslında, SQL'deki her kelime özel bir anlamı vardır. Örneğin, dünyadaki birçok programlama dilinde, örneğin:
$ query \u003d "Ad \u003d" Alex "" adlı kullanıcılardan telefon_number'i seçin; $ Sonuç \u003d mysql_query ($ sorgu);
Bu iki basit çizgi, ABD'den, gereksinimlerimizi karşılayan bir veritabanı programı için bir istek için çok karmaşık bir görevi özetleyecektir. "Elekler", muhtemelen bir istek yapmış programın güzel biçimlendirilmiş bir sonucunu geri döndürmek için muhtemelen bit ve bayt terabaytları. Cidden, tüm bu saçmalık basit bir anglo benzeri teklifle kapsüllenmektedir.

Yararlı hale getirmek için, bu tür talepler zorunlu değildir, ancak kullanıcı girişi temelinde inşa edilmiştir. Bu, farklı kullanıcılar kullanmayı amaçlayan teklif:
$ İsim \u003d $ _POST ["İsim"]; $ query \u003d "Ad \u003d" $ adı "" adlı kullanıcılardan telefon_number'i seçin; $ Sonuç \u003d mysql_query ($ sorgu);
Bu makaleyi izlerseniz: Bu bir anti-örnektir! Yapabileceğin en kötüsü bu! Bu bir güvenlik kabusu! Böyle bir şey yazdığınızda, bir masum yavru kedi ölecek! Ktulhu, ruhunu buna davet edecek!

Ve şimdi burada ne olacağını görelim. $ _POST ["İsim"] - Rastgele bir kullanıcının rastgele web sitenizde rastgele bir forma girdiği bir değer. Programınız, bu değeri, veritabanında bulmak istediğiniz kullanıcı adı olarak kullanan bir SQL sorgusu oluşturacaktır. Sonra bu SQL "teklif" doğrudan veritabanına gönderilir.

Görünüşe göre her şey çok korkunç değil, evet? Rastgele web sitenize girilebilecek birkaç rasgele değer girmeye çalışalım ve bunun için hangi istekleri ortaya çıkacak:

Alex.
Adı \u003d "Alex" adlı kullanıcılardan Phone_Number'i seçin.
MC "Donalds.
Adı \u003d "MC" Donalds "adlı kullanıcılardan Phone_Number'i seçin.
Joe "; damla tablo kullanıcıları; -
Adı \u003d "Joe" adlı kullanıcılardan Phone_Number'i seçin; Damla tablo kullanıcıları; - "
İlk istek korkutucu görünmüyor, ama oldukça güzel, değil mi? 2 numara, "biraz" belirgin olarak sözdizimimize zarar veriyor gibi görünüyor. "Lanet Almanca! 4 numara biraz aptal. Bunu kim yazacak? Bu mantıklı değil ...
Ancak veritabanı işleme talebi için değil ... Veritabanının bu talebin geldiği herhangi bir şey yok ve ne anlama gelmesi gerektiği. Gördüğü tek şey iki istek: Joe adlı bir kullanıcı numarasını bulun ve ardından Kullanıcılar tablosunu (bir yorumla birlikte eşlik eden ") silindir ve başarıyla yapılır.

Sizin için bu haber olmamalıdır. Öyleyse, o zaman, lütfen bu makaleyi tekrar okuyun, çünkü programlamada yeni gelenlersiniz ya da son 10 yıl bir mağarada yaşadınız. Bu örnek, tüm dünyada kullanılan SQL enjeksiyonlarının temellerini göstermektedir. Verileri silmek için veya basitçe elde edilmemesi veya hakları olmadıkça, giriş yapmaması için veri alın. Ve hepsi, çünkü veritabanı anglo benzeri "cümleyi" kelimenin tam anlamıyla algıladığı için.

Oooeeeee!

Bir sonraki adım: XSS saldırıları. Aynı şekilde hareket ederler, yalnızca HTML için geçerlidir.
Veritabanıyla ilgili sorunlara karar verdiniz, kullanıcıdan veri almanızı, veritabanına yazın ve kullanıcılara erişmek için web sitesine geri gönderin. Tipik bir forum, yorum sistemi vb. Yapan budur. Sitenizde bir yerde böyle bir şey var:

Tarafından gönderildi. Açık.


Kullanıcılarınız iyi ve nazikse, eski filozofların alıntılarını yerleştirirler ve mesajlar aşağıdaki türde olacaktır:

Posted by Plato 2 Ocak, 15:31

"Lorem Ipsum Dolor Sit Amet, ConserTaTur Adipising Elit, SED, Eiusmod Tapa Incididunt UT Labore et Dolore Magna Aliqua.


Kullanıcılar akıllıysa, muhtemelen matematik hakkında konuşacaklar ve bu tür mesajlar olacaktır:

Posted by Pascal 23 Kasım, 04:12

Temel Matematik bize x'i söyler.< n and y > N, x Y'dan büyük olamaz.


Hmm ... yine bu varsayılan parantezlerimiz. Teknik bir bakış açısıyla, belirsiz olabilirler, ancak tarayıcı bizi affedecek, değil mi?


Peki, dur, ne cehennem? Joker'in JavaScript etiketlerini forumunuza soktu? Bu mesajı sitenizde görünen herkes artık yükleniyor ve sitelendirme yapabilmesindeki site bağlamında komut dosyalarını yükler. Ve bu iyi değil.

Kelimenin tam anlamıyla anlamıyorum

Yukarıdaki durumlarda, bir şekilde veritabanımızı veya tarayıcımızı bilgilendirmek istiyoruz, bu sadece bir metin olduğunu, onunla hiçbir şey yapmazsın! Başka bir deyişle, tüm özel karakterlerin özel değerlerini "silmek" ve anahtar kelimeler Kullanıcı tarafından sağlanan herhangi bir bilgiden, çünkü ona güvenmiyoruz. Ne yapalım?

Ne? Ne diyorsun oğlum? Oh, "Koruyucu" diyorsun? Ve kesinlikle haklısın, çerezi al!
İsteğe göre birleştirmeden önce kullanıcı verilerine korumayı kullanırsak, sorun çözülür. Veritabanı taleplerimiz için şöyle bir şey olacak:
$ İsim \u003d $ _POST ["İsim"]; $ İsim \u003d mysql_real_escape_string ($ isim); $ query \u003d "Ad \u003d" $ adı "" adlı kullanıcılardan telefon_number'i seçin; $ Sonuç \u003d mysql_query ($ sorgu);
Sadece bir kod satırı, ama şimdi başka hiç kimse veritabanımızı "hack" yapamaz. Kullanıcı girişine bağlı olarak, SQL isteğinin nasıl görüneceğini tekrar görelim:
Alex.
Adı \u003d "Alex" adlı kullanıcılardan Phone_Number'i seçin.
MC "Donalds.
Ad \u003d "MC \\" Donalds "adlı kullanıcılardan Phone_Number'i seçin.
Joe "; damla tablo kullanıcıları; -
Adı \u003d "Joe \\" adlı kullanıcılardan Phone_Number'i seçin; Damla tablo kullanıcıları; - "
Mysql_real_escape_string ayrıştırma olmadan, her şeyin önünde eğik çizgi eğik çizgi, bir tür özel anlam olabilir.


Onları geri getirmeden önce HTMLSpecialchars özelliğini tüm kullanıcı verilerine kullanıyoruz. Şimdi haşere mesajı şöyle görünüyor:

Gönderen Jacktr, 18 Temmuz 12:56


Lütfen kullanıcılardan alınan değerlerin gerçekten "zarar görmediğini" unutmayın. Herhangi bir tarayıcı ayrıştırıcı bu HTML gibidir ve her şeyi doğru biçimde görüntüler.

Bizi geri getiren şey ...

Yukarıdakilerin tümü birçok sistemin özelliklerini gösterir: Özel karakterleri olmaması gerektiğinin varsayıldığı takdirde metindeki metnin korunması gerekir. Metinsel değerleri SQL'ye yerleştirme, SQL kuralları ile korunmalıdır. Metinsel değerleri HTML'ye yerleştirme, HTML kuralları ile korunmalıdır. Metin değerlerini (teknoloji adı) yerleştirerek, kurallar tarafından korunmaları gerekir (teknoloji adı). Bu kadar.

Tam resim için

Elbette, kullanıcı mucitleri ile mücadele etmenin diğer yolları, özel karakterler içermesi veya içermemelidir:
  • Doğrulama.
    Kullanıcı girişinin belirli şartnamelere uygun olup olmadığını kontrol edebilirsiniz. Numaranın girişine ihtiyacınız varsa ve kullanıcı başka bir şeye girerse, program onu \u200b\u200bbilgilendirmeli ve girişi iptal etmelidir. Bütün bunlar doğru bir şekilde örgütleniyorsa, "tablo kullanıcılarını" bırakma riski yoktur, nerede, varsayılır, kullanıcı "42" tanıtacaktır. HTML / SQL enjeksiyonlarından kaçınmak için bu çok pratik değildir, çünkü Genellikle "zam" içerebilen ücretsiz bir format metnini benimsemek gerekir. Diğer önlemlerin yanı sıra genellikle doğrulama kullanılır.
  • Temizlik
    Tehlikeli olarak düşündüğünüz karakterleri kaldırmak için "nemli" de olabilirsiniz. Örneğin, forumunuza eklenmesini önleyen HTML etiketine benzer bir şeyi kaldırmanız yeterlidir. Sorun, metnin oldukça meşru bölümlerini silebileceğinizdir.
    Hazırlanan SQL ifadeleri
    Yaptığımız bir şeyi yapan özel işlevler var: Veritabanını, SQL istek ve kullanıcılar tarafından sağlanan bilgiler arasındaki farkları anlamak için zorlamak. RNR'de şöyle görünüyorlar:
    $ STMT \u003d $ PDO-\u003e Hazırlayın ("Name \u003d?")); $ STMT-\u003e Execute ($ _ Post ["İsim"]);
    Aynı zamanda, gönderim iki aşamada gerçekleşir, istek ve değişkenleri açıkça ayırt eder. Veritabanı, önce sorgu yapısını anlama yeteneğine sahiptir ve ardından değerleriyle doldurun.

  • Gerçek dünyada, tüm bunlar farklı koruma adımları için birlikte kullanılır. Kullanıcının doğru verileri girdiğinden emin olmak için her zaman doğrulama kontrolü (doğrulama) kullanmanız gerekir. Sonra girilen verileri tarayabilir (ancak zorunlu değil). Kullanıcı açıkça bir komut dosyasını "sürdürmeye" çalışıyorsa, basitçe silebilirsiniz. Ardından, her zaman özel verileri her zaman bir SQL sorgusuna yerleştirmeden önce koruymanız gerekir (aynı HTML için geçerlidir).

Uzun zamandır, standart olarak adi teklifler eklemek için standart reçete Html -text Öznitelikleri belirlemek için "teklif etiketlerinin dahilinde" tasarımını uygulayın.

Bununla birlikte, henüz bir tarayıcıya rastlamadım, bu teklifin herhangi bir etiketin dışında nasıl basit bir sembol olduğunu göstermeyen bir tarayıcı ile karşılaşmadım. Öyleyse bana, sevgili meslektaşları, belki "dış etiketlerin kullanımı sadece kimseye kimseye sahip değil mi? Güvenle ve görünüşte yazılamazsın "? Özellikle, özellikle birçok alıntı yapıldığı metinlerde ve katı tasarım kurallarının gözlenmesi (ulusal tırnakların doğru kullanımı hakkında) alakasız.

İmho, birçoğu ... ama soru oldukça net değil: eğer bir çok sitenin işe yaramasına rağmen, ", ama tembel,", ama tembel olarak, bu yüzden ne bekliyorsunuz? Duyurum? Tırnakların tarayıcıların yeni sürümlerinde tutulup tutulmadığını düşünüyorum, kimse bilmiyor, böylece tekrar açık bir öneride bulunabilirsin: Aşağıdaki% 100 - HOLD Standartları :) Yaparsın. Ya da onaylamayı bekliyorsunuz: Evet. Hepsi, Chas ve 10 yıl sonra her şey aynı olacak, ben (Microsoft, Mozilla i.t.d) Garantisi?

Lynn "Coffeeman" [Dosya]
Evet, bu arada ... şimdi okumaya tırmandım, hiçbir yerde, alıntıların formunda temsil edilmesi gerektiğine dair bir yerde tartışılmadı "
http://www2.stack.ru/~julia/html401/carset.html:

Bazı yazarlar, "" "" "" "" "" "" "" "" ") öznitelik değerlerini ayırmak için kullanılabilir.

bunun hakkında gerekmek Varlığı kullanmak sadece<, > Ve &:

Yazar metnine sembolü koymak istiyorsa "<", во избежание возможной путаницы с началом тега (метка начала тега) он должен использовать ссылку "<" (десятичный код ASCII 60). Точно так же во избежание проблем со старыми версиями пользовательских агентов, некорректно принимающих символы ">"Etiketin sonu için (etiketin sonunun etiketi),"\u003e "bağlantısını kullanmalısınız (Ondalık kodu ASCII 62).

Karakterlere (bağlantının etiketi etiketi), "ve" sembolü yerine, "ve" bağlantısını kullanmalısınız, "&" bağlantısını (Ondalık kodu ASCII 38) kullanmalısınız. Ek olarak, "&" bağlantısı, öznitelik değerlerinde de kullanılmalıdır, çünkü CDATA özniteliğinin değerleri içindeki karakterlere referanslara izin verilir.

Ama sadece bir lynn cevabı gibi bir şey bekliyorum: Aslında hiçbir şey yok. Bana uymadım - popüler ders kitaplarından gelen bilgilerim ve "Herkes bunu yapıyor."

Ya da başka bir seçenek: Fakat yeni standartları takip ederseniz, uygulamamda yüzleşmedim - XHTML gibi (Gibi, XHTML'yi kontrol ettim), o zaman böyle bir odak geçmez. Bu nedenle, yazılı HTML'nin taşınabilirliği ile ilgili sorunlar oluşturmak gerekli değildir.

Peki ya da nihayet: Sen kendin kendin yaptın mı?

Ve bu arada, benzer bir soruya yol açar. Yukarıdaki belgede, belge "karışıklığı önlemek için" diyor. Ancak karışıklık, yalnızca sağlanan kodlardan birini izlerse ve takip ederse mümkündür. Ve eğer, diyelim ki, URL türü ".... / Script? A \u003d 1 & B \u003d 2"? HREF'in böyle bir URL'yi belirttiği gibi yanlışlıkla bir şey riske atarsınız (tabii ki, test sırasında doğru bir şekilde çalışıyor mu?)? Son derece olası bir durum dışında, 10 yılda (saha eski veya on kez yeniden yazıldığında), finalsiz abartılı isim ve B ile bir öz var; ? Başka bir deyişle, bu tür tüm durumları nasıl kontrol etmeliyiz?

Daniel, mevcut kodlarla herhangi bir probleminiz olmadığından eminseniz - yazabilir ve basitçe &. Gelecekte yeni bir kod belirirse, HTML 4.01 şartnamesinde açıkça bildirileceğini düşünür, bu nedenle normal olarak bildirilen belgeyi etkilememelidir. Veya kendinize gelecekteki standartların desteğini sağlamak için hesaplarsınız. basit değişiklik Belge şemaları?

Daniel Alievsky [Dosya]
XML'de, metin olarak sıradan alıntılar da sorun değil (sırasıyla, XHTML'de elbette). IMHO alıntılar genellikle "yalnızca bir nedenden ötürü - XML \u200b\u200b/ HTML / XHTML'de ikame ederken metin getirmek için iki işlev yazmak istemiyorum.