sınırlayıcı - Delimiter

CSV biçimli bir metin dosyasından bir parçanın stilistik bir tasviri . Virgüller (kırmızı ile gösterilmiştir) alan sınırlayıcı olarak kullanılır.

Bir ayırıcı , bir ya da daha çok bir dizisidir karakter olarak ayrı, bağımsız bölgeler arasındaki sınır belirtmek için düz metin , matematiksel ifadeler veya diğer veri akımları . Bir sınırlayıcı örneği, virgülle ayrılmış değerler dizisinde alan sınırlayıcı olarak işlev gören virgül karakteridir . Bir sınırlayıcının başka bir örneği, Mors kodunun iletiminde harfleri ve kelimeleri ayırmak için kullanılan zaman aralığıdır .

Gelen matematik , sınırlayıcı genellikle kapsamını belirlemek için kullanılan işlem ve izole edilmiş sembol olarak hem oluşabilir (örneğin, kolon "olarak ") ve karşı dönük semboller (örneğin, bir çift olarak açılı parantez içinde ).

Sınırlayıcılar, bir veri akışında sınırları belirtmenin çeşitli yollarından birini temsil eder . Örneğin bildirimsel gösterim , veri akışının içerdiği karakter sayısını belirtmek için veri akışının başlangıcında bir uzunluk alanı kullanan alternatif bir yöntemdir.

genel bakış

Sınırlayıcılar, alan ve kayıt sınırlayıcıları veya köşeli ayraç sınırlayıcıları olarak karakterize edilebilir.

Alan ve kayıt sınırlayıcılar

Alan sınırlayıcılar veri alanlarını ayırır. Kayıt sınırlayıcıları alan gruplarını ayırır.

Örneğin, CSV dosya biçimi, alanlar arasındaki sınırlayıcı olarak bir virgül ve kayıtlar arasındaki sınırlayıcı olarak bir satır sonu göstergesi kullanır :

fname,lname,age,salary
nancy,davolio,33,$30000
erin,borakova,28,$25250
tony,raphael,35,$28700

Bu , CSV dosya biçimini kullanan basit bir düz dosya veritabanı tablosunu belirtir .

Köşeli ayraç sınırlayıcılar

Blok sınırlayıcılar, bölge sınırlayıcılar veya dengeli sınırlayıcılar olarak da adlandırılan köşeli ayraç sınırlayıcılar, metin bölgesinin hem başlangıcını hem de sonunu işaretler.

Köşeli ayraç sınırlayıcıların yaygın örnekleri şunları içerir:

sınırlayıcılar Açıklama
( ) parantezler . Lisp programlama dili sözdizimi esas parantez kullanımı tarafından tanınabilen olarak kabul edilmektedir.
{ } Parantezler (ayrıca küme parantezleri olarak da adlandırılır .)
[ ] Köşeli ayraçlar (genellikle bir alt simgeyi belirtmek için kullanılır)
< > Köşeli ayraçlar .
" " yaygın olarak dize değişmezlerini belirtmek için kullanılır .
' ' karakter değişmezlerini belirtmek için yaygın olarak kullanılır .
<? ?> XML işleme talimatlarını belirtmek için kullanılır .
/* */ bazı programlama dillerinde yorumları belirtmek için kullanılır .
<% %> bazı web şablonlarında dil sınırlarını belirtmek için kullanılır . Bunlara şablon sınırlayıcılar da denir .

Sözleşmeler

Tarihsel olarak, bilgi işlem platformları geleneksel olarak belirli sınırlayıcıları kullanmıştır. Aşağıdaki tablolar, karşılaştırma için birkaç örnek göstermektedir.

Programlama dilleri ( Ayrıca bkz , dilleri (sözdizimi programlama karşılaştırılması) ).

Dize Değişmezi İfadenin sonu
paskal tek alıntı noktalı virgül
piton çift ​​alıntı, tek alıntı satır sonu (EOL)

Alan ve Kayıt sınırlayıcıları ( Ayrıca bkz. , ASCII , Kontrol karakteri ).

Alan Sonu Kayıt Sonu Dosyanın sonu
macOS , AmigaOS dahil Unix benzeri sistemler Sekme LF Yok
Windows , MS-DOS , OS/2 , CP/M Sekme CRLF hiçbiri (CP/M hariç), Control-Z
Klasik Mac OS , Apple DOS , ProDOS , GS/OS Sekme CR Yok
ASCII/Unicode BİRİM AYIRICI
Konum 31 (U+001F)
KAYIT AYIRICI
Pozisyon 30 (U+001E)
DOSYA AYIRICI
Pozisyon 28 (U+001C)

sınırlayıcı çarpışma

Sınırlayıcı çakışması , bir yazar veya programcı, sınırlayıcıları, aslında ayrı bölgeler arasında sınırlar olarak yorumlanmalarını amaçlamadan metne dahil ettiğinde ortaya çıkan bir sorundur. Örneğin XML durumunda, bir yazar bir açılı ayraç karakteri belirtmeye çalıştığında bu durum ortaya çıkabilir .

Çoğu dosya türünde, her ikisi de çarpışmaya tabi olan hem bir alan sınırlayıcı hem de bir kayıt sınırlayıcı vardır. Örneğin, virgülle ayrılmış değerler dosyaları durumunda, bir yazar bir alan değerinin parçası olarak bir virgül eklemeye çalıştığında (örneğin, maaş = "30.000 ABD Doları") alan çakışması meydana gelebilir ve bir alan birden fazla satır içeriyordu. Metin dosyalarında hem kayıt hem de alan sınırlayıcı çakışması sıklıkla meydana gelir.

Bazı bağlamlarda, kötü niyetli bir kullanıcı veya saldırgan bu sorundan kasıtlı olarak yararlanmaya çalışabilir. Sonuç olarak, sınırlayıcı çakışması güvenlik açıklarının ve açıkların kaynağı olabilir . Kötü niyetli kullanıcılar , sırasıyla SQL enjeksiyonu ve siteler arası komut dosyası çalıştırma gibi iyi bilinen saldırıları dağıtmak için SQL ve HTML gibi dillerde sınırlayıcı çarpışmasından yararlanabilir .

Çözümler

Sınırlayıcı çarpışması çok yaygın bir sorun olduğundan, bundan kaçınmak için çeşitli yöntemler icat edilmiştir. Bazı yazarlar, veri akışının kendisinde görünmesi muhtemel olmayan bir sınırlayıcı karakter (veya karakter dizisi) seçerek sorunu önlemeye çalışabilir. Bu ad hoc yaklaşım uygun olabilir, ancak veri akışında neyin görüneceğine dair doğru bir tahmine bağlıdır ve kötü niyetli çarpışmalara karşı hiçbir güvenlik sağlamaz. Bu nedenle diğer, daha resmi sözleşmeler de uygulanır.

ASCII ile sınırlandırılmış metin

ASCII ve Unicode karakter kümeleri, sınırlayıcı olarak kullanılabilecek yazdırılamayan karakterlerin sağlanmasıyla bu sorunu çözmek için tasarlanmıştır. Bunlar ASCII 28'den 31'e kadar olan aralıktır.

ASCII Aralık Sembol Unicode Adı Yaygın isim kullanım
28 BİLGİ AYIRICI DÖRT dosya ayırıcı Dosyanın sonu. Veya aksi takdirde ayrı dosyalar olabileceklerin bir birleşimi arasında.
29 BİLGİ AYIRICI ÜÇ grup ayırıcı Veri bölümleri arasında. Basit veri dosyalarında gerekli değildir.
30 BİLGİ AYIRICI İKİ kayıt ayırıcı Bir kaydın veya satırın sonu.
31 BİLGİ AYIRICI BİR birim ayırıcı Bir kaydın alanları veya bir satırın üyeleri arasında.

Alan ayırıcı olarak ASCII 31 Birim ayırıcının ve ASCII 30 Kayıt ayırıcının kullanılması, metin veri akışında görünen hem alan hem de kayıt sınırlayıcı sorununu çözer.

kaçış karakteri

Sınırlayıcı çarpışmasını önlemenin bir yöntemi kaçış karakterlerini kullanmaktır . Dil tasarımı açısından bunlar yeterlidir, ancak dezavantajları vardır:

  • metin, çok sayıda kaçış karakteriyle dolunca okunamaz hale gelebilir; bu sorun, eğimli kürdan sendromu olarak adlandırılır ( Perl düzenli ifadelerinde \ kullanımı nedeniyle , "\/\/" gibi dizilere yol açar);
  • metnin normal ifadeyle ayrıştırılması zorlaşıyor
  • kaçış karakterleri olarak tasarlanmadıklarında "kaçışlardan kaçmak" için bir mekanizma gerektirirler; ve
  • Yazması kolay olsa da, dili bilmeyen biri için şifreli olabilir.
  • enjeksiyon saldırılarına karşı koruma sağlamazlar

Kaçış dizisi

Kaçış dizileri kaçış karakterlerine benzer, ancak genellikle tek bir karakter yerine bir tür anımsatıcıdan oluşurlar. Bir kullanım, bir çift tırnak (") karakteri içeren dize değişmezlerindedir . Örneğin, Perl'de kod:

print "Nancy said \x22Hello World!\x22 to the crowd.";  ### use \x22

ile aynı çıktıyı üretir:

print "Nancy said \"Hello World!\" to the crowd.";      ### use escape char

İnsanlar tarafından kullanıldığında kaçış dizilerinin bir dezavantajı, tek tek karakterleri temsil eden kodları ezberleme ihtiyacıdır (ayrıca bakınız: karakter varlık referansı , sayısal karakter referansı ).

Çift tırnak sınırlayıcıları

Kaçış dizileri ve kaçış karakterlerinin aksine, ikili sınırlayıcılar sınırlayıcı çarpışmasını önlemenin başka bir yolunu sağlar. Örneğin bazı diller, bir dize değişmezi belirtmek için tek tırnak (') veya çift tırnak (") kullanımına izin verir. Örneğin, Perl'de :

print 'Nancy said "Hello World!" to the crowd.';

kaçış gerektirmeden istenen çıktıyı üretir. Ancak bu yaklaşım, yalnızca dize her iki tür tırnak işareti içermediğinde çalışır .

Dolgu tırnak sınırlayıcıları

Kaçış dizilerinin ve kaçış karakterlerinin aksine, dolgu sınırlayıcıları, sınırlayıcı çarpışmasını önlemenin başka bir yolunu sunar. Örneğin Visual Basic , sınırlayıcı olarak çift tırnak kullanır. Bu, sınırlayıcıdan kaçmaya benzer.

print "Nancy said ""Hello World!"" to the crowd."

kaçış gerektirmeden istenen çıktıyı üretir. Normal kaçış gibi, ancak birçok alıntı kullanıldığında kafa karıştırıcı olabilir. Yukarıdaki kaynak kodu yazdıracak kod daha kafa karıştırıcı görünebilir:

print "print ""Nancy said """"Hello World!"""" to the crowd."""

Yapılandırılabilir alternatif alıntı sınırlayıcıları

İkili sınırlayıcıların aksine, çoklu sınırlayıcılar, sınırlayıcı çakışmasını önlemek için daha da esnektir.

Örneğin, Perl'de :

print qq^Nancy doesn't want to say "Hello World!" anymore.^;
print qq@Nancy doesn't want to say "Hello World!" anymore.@;
print qq(Nancy doesn't want to say "Hello World!" anymore.);

tümü , herhangi bir uygun karakterin sınırlayıcı olarak hareket etmesine izin veren alıntı operatörleri kullanılarak istenen çıktıyı üretir . Bu yöntem daha esnek olmasına rağmen, birkaç dil bunu desteklemektedir. Perl ve Ruby bunu yapan iki kişidir .

içerik sınırı

Bir içerik sınır özellikle sınırlayıcı çarpışma direnecek şekilde tasarlanmıştır sınırlayıcı özel bir türüdür. Yazarın, çok parçalı bir mesajdaki parçalar arasında her zaman bir sınırı belirtmesi garanti edilen bir karakter dizisini belirlemesine izin vererek çalışır ve başka hiçbir olası yorum yoktur.

Sınırlayıcı, sıklıkla, içerikte istatistiksel olarak olası olmayan rastgele bir karakter dizisinden oluşturulur. Bunu bir UUID , bir zaman damgası veya başka bir ayırt edici işaret gibi bir tanımlayıcı işaret izleyebilir . Alternatif olarak, metinde bir sınırlayıcının görünmemesini garanti etmek için içerik taranabilir. Bu, sınırlayıcının daha kısa veya daha basit olmasına izin verebilir ve belgenin insan tarafından okunabilirliğini artırabilir. ( Bkz. örneğin , MIME , İşte belgeler ).

Boşluk veya girinti

Bazı programlama ve bilgisayar dilleri , metindeki bağımsız bölgeler arasındaki sınırları belirlemenin bir yolu olarak boşluk sınırlayıcıların veya girintilerin kullanılmasına izin verir .

Normal ifade sözdizimi

Bir belirterek olarak düzenli ifade , alternatif sınırlayıcı da sözdizimi basitleştirmek için kullanılabilir maç ve ikame operasyonları Perl .

Örneğin, aşağıdaki sözdizimi ile Perl'de basit bir eşleştirme işlemi belirtilebilir:

$string1 = 'Nancy said "Hello World!" to the crowd.';    # specify a target string
print $string1 =~ m/[aeiou]+/;                           # match one or more vowels

Sözdizimi, alternatif sınırlayıcılarla eşleştirme işlemlerini belirtmek için yeterince esnektir, bu da sınırlayıcı çakışmasını önlemeyi kolaylaştırır:

$string1 = 'Nancy said "http://Hello/World.htm" is not a valid address.'; # target string
   
print $string1 =~ m@http://@;       # match using alternate regular expression delimiter
print $string1 =~ m{http://};       # same as previous, but different delimiter
print $string1 =~ m!http://!;       # same as previous, but different delimiter.

İşte belge

A Here belgesi , özel bir son diziyi tanımlayarak keyfi içeriğin dahil edilmesine izin verir. PHP , bash betikleri , Ruby ve Perl dahil birçok dil bunu destekler . Burada bir belge, bitiş sırasının ne olacağını açıklayarak başlar ve bu sıra yeni bir satırın başlangıcında görülene kadar devam eder.

İşte perl'de bir örnek:

print <<ENDOFHEREDOC;
It's very hard to encode a string with "certain characters".

Newlines, commas, and other characters can cause delimiter collisions.
ENDOFHEREDOC

Bu kod yazdırılır:

It's very hard to encode a string with "certain characters".

Newlines, commas, and other characters can cause delimiter collisions.

Özel bir bitiş dizisi kullanarak, dizede her tür karaktere izin verilir.

ASCII zırhı

Temelde ikili verilerin metin kodlaması için bir mekanizma olarak kullanılmasına rağmen, ASCII zırhlama , bazı durumlarda sınırlayıcı çarpışmasını önlemeye de yardımcı olan bir programlama ve sistem yönetimi tekniğidir. Bu teknik, daha karmaşık olduğu ve bu nedenle küçük uygulamalar ve basit veri depolama formatları için uygun olmadığı için yukarıda açıklanan diğer yaklaşımlardan farklıdır. Teknik , sınırlayıcı veya diğer önemli karakterlerin iletilen verilerde görünmemesini sağlamak için base64 gibi özel bir kodlama şeması kullanır . Amaç, çok katmanlı kaçmayı , yani çift ​​tırnak için önlemektir .

Bu teknik, örneğin, kullanılan Microsoft 'ın ASP.NET web geliştirme teknolojisi ve yakından bu sistemin 'görünüm durumu' bileşeni ile ilişkilidir.

Örnek

Aşağıdaki basitleştirilmiş örnek, bu tekniğin pratikte nasıl çalıştığını göstermektedir.

İlk kod parçası, VIEWSTATE değerinin, HTML etiketinin sınırlayıcılarıyla uyumlu olmayan karakterler içerdiği basit bir HTML etiketini gösterir :

<input type="hidden" name="__VIEWSTATE" value="BookTitle:Nancy doesn't say "Hello World!" anymore." />

Bu ilk kod parçası iyi biçimlendirilmemiştir ve bu nedenle "gerçek dünya" konuşlandırılmış bir sistemde düzgün çalışmayacaktır.

Bir HTML özelliğinde rastgele metin depolamak için HTML varlıkları kullanılabilir. Bu durumda """ çift ​​alıntı için duruyor:

<input type="hidden" name="__VIEWSTATE" value="BookTitle:Nancy doesn't say &quot;Hello World!&quot; anymore." />

Alternatif olarak, base64 gibi bağlamda özel anlamı olan karakterleri içermeyen herhangi bir kodlama kullanılabilir:

<input type="hidden" name="__VIEWSTATE" value="Qm9va1RpdGxlOk5hbmN5IGRvZXNuJ3Qgc2F5ICJIZWxsbyBXb3JsZCEiIGFueW1vcmUu" />

Veya yüzde kodlaması :

<input type="hidden" name="__VIEWSTATE" value="BookTitle:Nancy%20doesn%27t%20say%20%22Hello%20World!%22%20anymore." />

Bu, sınırlayıcı çakışmasını önler ve orijinal (kodu çözülmüş) metinde hangi karakterlerin göründüğünden bağımsız olarak HTML kodunda uyumsuz karakterlerin görünmemesini sağlar.

Ayrıca bakınız

Referanslar

Dış bağlantılar