Ogranicznik — Delimiter

Stylistyczne przedstawienie fragmentu z pliku tekstowego w formacie CSV . Przecinki (pokazane na czerwono) są używane jako ograniczniki pól.

Ogranicznik jest sekwencją jednego lub więcej znaków do określenia granicy między oddzielnych, niezależnych regionów w zwykły tekst , wyrażeń matematycznych lub innych strumieni danych . Przykładem ogranicznika jest znak przecinka , który działa jako ogranicznik pola w sekwencji wartości oddzielonych przecinkami . Innym przykładem ogranicznika jest odstęp czasowy używany do oddzielania liter i słów w przekazywaniu kodu Morse'a .

W matematyce ograniczniki są często używane do określenia zakresu operacji i mogą występować zarówno jako pojedyncze symbole (np. dwukropek w " ") jak i jako para przeciwnie wyglądających symboli (np. nawiasy ostrokątne w ).

Ograniczniki reprezentują jeden z różnych sposobów określania granic w strumieniu danych . Na przykład notacja deklaratywna jest alternatywną metodą, która używa pola długości na początku strumienia danych w celu określenia liczby znaków, które zawiera strumień danych.

Przegląd

Ograniczniki można scharakteryzować jako ograniczniki pól i rekordów lub jako ograniczniki nawiasów.

Ograniczniki pól i rekordów

Ograniczniki pól oddzielają pola danych. Ograniczniki rekordów oddzielają grupy pól.

Na przykład format pliku CSV używa przecinka jako ogranicznika między polami oraz wskaźnika końca wiersza jako ogranicznika między rekordami :

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

Określa prostą tabelę bazy danych w postaci pliku płaskiego, używającą formatu pliku CSV.

Ograniczniki nawiasów

Ograniczniki nawiasów, zwane również ogranicznikami bloku, ogranicznikami regionu lub ogranicznikami zrównoważonymi, oznaczają zarówno początek, jak i koniec regionu tekstu.

Typowe przykłady ograniczników nawiasów obejmują:

Ograniczniki Opis
( ) Nawiasy . Lisp składnia języka programowania jest cytowany jako rozpoznawalny przede wszystkim przez jej stosowanie nawiasów.
{ } Nawiasy klamrowe (zwane również nawiasami klamrowymi .)
[ ] Nawiasy (powszechnie używane do oznaczenia indeksu dolnego)
< > Nawiasy kątowe .
" " powszechnie używane do oznaczania literałów łańcuchowych .
' ' powszechnie używane do oznaczania literałów znakowych .
<? ?> używany do wskazania instrukcji przetwarzania XML .
/* */ używany do oznaczania komentarzy w niektórych językach programowania.
<% %> używane w niektórych szablonach internetowych do określania granic języka. Są one również nazywane ogranicznikami szablonów .

Konwencje

Historycznie platformy komputerowe stosowały pewne ograniczniki zgodnie z konwencją. Poniższe tabele przedstawiają kilka przykładów dla porównania.

Języki programowania ( Zobacz także , Porównanie języków programowania (składnia) ).

Literał ciągu Koniec oświadczenia
Pascal pojedynczy cytat średnik
Pyton podwójny cudzysłów, pojedynczy cudzysłów koniec linii (EOL)

Ograniczniki pól i rekordów ( Zobacz także , ASCII , Znak kontrolny ).

Koniec pola Koniec zapisu Koniec pliku
Systemy uniksopodobne , w tym macOS , AmigaOS Patka LF Żaden
Windows , MS-DOS , OS/2 , CP/M Patka CRLF brak (z wyjątkiem CP/M), Control-Z
Klasyczny Mac OS , Apple DOS , ProDOS , GS/OS Patka CR Żaden
ASCII/Unicode SEPARATOR JEDNOSTEK
Pozycja 31 (U+001F)
SEPARATOR ZAPISU
Pozycja 30 (U+001E)
SEPARATOR PLIKÓW
Pozycja 28 (U+001C)

Kolizja ogranicznika

Kolizja ograniczników to problem, który pojawia się, gdy autor lub programista wprowadza ograniczniki do tekstu, nie zamierzając ich interpretować jako granic między oddzielnymi regionami. Na przykład w przypadku XML może się to zdarzyć, gdy autor próbuje określić znak nawiasu kątowego .

W większości typów plików występuje zarówno ogranicznik pól, jak i ogranicznik rekordów, które mogą kolidować. Na przykład w przypadku plików z wartościami oddzielonymi przecinkami kolizja pól może wystąpić za każdym razem, gdy autor próbuje dołączyć przecinek jako część wartości pola (np. pensja = "30 000 $"), a kolizja ograniczników rekordów występuje, gdy pole zawierał wiele wierszy. W plikach tekstowych często występują kolizje między rekordami i separatorami pól.

W niektórych kontekstach złośliwy użytkownik lub osoba atakująca może celowo wykorzystać ten problem. W konsekwencji kolizja ograniczników może być źródłem luk w zabezpieczeniach i exploitów . Złośliwi użytkownicy mogą wykorzystać kolizję ograniczników w językach takich jak SQL i HTML do wdrożenia tak znanych ataków, jak odpowiednio wstrzyknięcie SQL i cross-site scripting .

Rozwiązania

Ponieważ kolizja ograniczników jest bardzo częstym problemem, wynaleziono różne metody jej unikania. Niektórzy autorzy mogą próbować uniknąć tego problemu, wybierając znak ogranicznika (lub sekwencję znaków), który prawdopodobnie nie pojawi się w samym strumieniu danych. Takie podejście ad hoc może być odpowiednie, ale koniecznie zależy od prawidłowego odgadnięcia, co pojawi się w strumieniu danych, i nie zapewnia ochrony przed złośliwymi kolizjami. Stosuje się zatem również inne, bardziej formalne konwencje.

Tekst rozdzielany ASCII

Zestawy znaków ASCII i Unicode zostały zaprojektowane w celu rozwiązania tego problemu przez zapewnienie znaków niedrukowalnych, które mogą być używane jako ograniczniki. Są to zakresy od ASCII 28 do 31.

ASCII Dec Symbol Nazwa Unicode Nazwa zwyczajowa Stosowanie
28 CZTERY SEPARATOR INFORMACJI separator plików Koniec pliku. Lub między konkatenacją tego, co w innym przypadku mogłoby być osobnymi plikami.
29 SEPARATOR INFORMACJI TRZECI separator grup Pomiędzy sekcjami danych. Nie jest potrzebny w prostych plikach danych.
30 SEPARATOR INFORMACJI DRUGI separator nagrań Koniec rekordu lub wiersza.
31 SEPARATOR INFORMACJI JEDEN separator jednostek Między polami rekordu lub członkami wiersza.

Użycie separatora ASCII 31 Unit jako separatora pól oraz separatora ASCII 30 Records rozwiązuje problem zarówno separatorów pól, jak i rekordów, które pojawiają się w strumieniu danych tekstowych.

Ucieczka postać

Jedną z metod uniknięcia kolizji ograniczników jest użycie znaków ucieczki . Z punktu widzenia projektowania języka są one wystarczające, ale mają wady:

  • tekst może stać się nieczytelny, gdy jest zaśmiecony wieloma znakami ucieczki, problem określany jako syndrom pochylonej wykałaczki (z powodu użycia \ to escape / w wyrażeniach regularnych Perla , co prowadzi do sekwencji takich jak "\/\/");
  • tekst staje się trudny do przeanalizowania za pomocą wyrażenia regularnego
  • wymagają mechanizmu „uciekania przed ucieczkami”, gdy nie są przeznaczone jako znaki ucieczki; oraz
  • choć łatwe do wpisania, mogą być zagadkowe dla kogoś, kto nie zna języka.
  • nie chronią przed atakami iniekcyjnymi

Sekwencja ewakuacyjna

Sekwencje ucieczki są podobne do znaków ucieczki, z wyjątkiem tego, że zwykle składają się z pewnego rodzaju mnemoniki, a nie tylko jednego znaku. Jednym z zastosowań jest literał ciągu znaków, który zawiera znak podwójnego cudzysłowu ("). Na przykład w Perlu kod:

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

daje taki sam wynik jak:

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

Jedną wadą sekwencje, gdy są wykorzystywane przez ludzi, jest konieczność zapamiętywania kodów, które reprezentują poszczególne znaki (patrz również: odniesienie jednostka znaków , numeryczne odniesienia postaci ).

Podwójne ograniczniki cytowania

W przeciwieństwie do sekwencji ucieczki i znaków ucieczki, podwójne ograniczniki zapewniają jeszcze jeden sposób na uniknięcie kolizji ograniczników. Niektóre języki pozwalają na przykład na użycie pojedynczego cudzysłowu (') lub podwójnego cudzysłowu (") w celu określenia literału ciągu znaków. Na przykład w Perlu :

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

wytwarza żądany wynik bez konieczności ucieczki. To podejście działa jednak tylko wtedy, gdy ciąg nie zawiera obu typów cudzysłowów.

Dopełnienie ograniczników cytowania

W przeciwieństwie do sekwencji ucieczki i znaków ucieczki, ograniczniki dopełnienia zapewniają jeszcze jeden sposób na uniknięcie kolizji ograniczników. Na przykład Visual Basic używa podwójnych cudzysłowów jako ograniczników. Jest to podobne do ucieczki przed ogranicznikiem.

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

wytwarza żądany wynik bez konieczności ucieczki. Podobnie jak zwykła ucieczka, może jednak stać się myląca, gdy używa się wielu cudzysłowów. Kod do wydrukowania powyższego kodu źródłowego wyglądałby bardziej dezorientująco:

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

Konfigurowalne alternatywne ograniczniki cytowania

W przeciwieństwie do podwójnych ograniczników, wiele ograniczników jest jeszcze bardziej elastycznych, aby uniknąć kolizji ograniczników.

Na przykład w Perlu :

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.);

wszystkie dają pożądany wynik poprzez użycie operatorów cudzysłowu , które pozwalają dowolnemu dogodnemu znakowi działać jako ogranicznik. Chociaż ta metoda jest bardziej elastyczna, obsługuje ją niewiele języków. Perl i Ruby to dwa, które to robią.

Granica treści

Zawartość granica to specjalny rodzaj ogranicznika, który jest zaprojektowany specjalnie oprzeć kolizji ogranicznik. Działa poprzez umożliwienie autorowi określenia sekwencji znaków, która gwarantuje, że zawsze wskazuje granicę między częściami w wiadomości wieloczęściowej, bez innej możliwej interpretacji.

Ogranicznik jest często generowany z losowej sekwencji znaków, której występowanie w treści jest statystycznie nieprawdopodobne. Po nim może następować znak identyfikacyjny, taki jak UUID , znacznik czasu lub inny znak wyróżniający. Alternatywnie treść można zeskanować, aby zagwarantować, że ogranicznik nie pojawi się w tekście. Dzięki temu ogranicznik może być krótszy lub prostszy, a także zwiększyć czytelność dokumentu dla człowieka. ( Patrz na przykład , MIME , Oto dokumenty ).

Spacja lub wcięcie

Niektóre języki programowania i komputerowe pozwalają na użycie separatorów białych znaków lub wcięć jako sposobu określania granic między niezależnymi regionami w tekście.

Składnia wyrażeń regularnych

Przy określaniu wyrażenia regularnego można również użyć alternatywnych ograniczników w celu uproszczenia składni operacji dopasowania i podstawienia w Perlu .

Na przykład prosta operacja dopasowania może być określona w Perlu z następującą składnią:

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

Składnia jest wystarczająco elastyczna, aby określić operacje dopasowania z alternatywnymi ogranicznikami, co ułatwia uniknięcie kolizji ograniczników:

$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.

Tutaj dokument

Dokument Here pozwala na włączenie dowolnej treści poprzez opisanie specjalnej sekwencji końcowej. Obsługuje to wiele języków, w tym PHP , skrypty bash , ruby i perl . Dokument tutaj zaczyna się od opisania, jaka będzie sekwencja końcowa i jest kontynuowany, dopóki ta sekwencja nie zostanie wyświetlona na początku nowej linii.

Oto przykład w perlu:

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

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

Ten kod wydrukuje:

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

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

Używając specjalnej sekwencji końcowej, dozwolone są wszystkie rodzaje znaków w ciągu.

Zbroja ASCII

Chociaż jest używany głównie jako mechanizm kodowania tekstu danych binarnych, opancerzenie ASCII jest techniką programowania i administrowania systemami, która w pewnych okolicznościach pomaga również uniknąć kolizji ograniczników. Ta technika kontrastuje z innymi podejściami opisanymi powyżej, ponieważ jest bardziej skomplikowana i dlatego nie nadaje się do małych aplikacji i prostych formatów przechowywania danych. Technika ta wykorzystuje specjalny schemat kodowania, taki jak base64 , aby zapewnić, że separator lub inne znaczące znaki nie pojawią się w przesyłanych danych. Ma to na celu zapobieganie wielowarstwowym ucieczkom , np. w przypadku cudzysłowów .

Technika ta jest stosowana na przykład w programie Microsoft „s ASP.NET rozwoju technologii internetowych, i jest ściśle związana z«viewstate»składnik tego systemu.

Przykład

Poniższy uproszczony przykład pokazuje, jak ta technika działa w praktyce.

Pierwszy fragment kodu przedstawia prosty znacznik HTML, w którym wartość VIEWSTATE zawiera znaki niezgodne z ogranicznikami samego znacznika HTML:

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

Ten pierwszy fragment kodu nie jest poprawnie sformułowany i dlatego nie będzie działał poprawnie w systemie wdrożonym „w świecie rzeczywistym”.

Aby przechowywać dowolny tekst w atrybucie HTML, można użyć encji HTML . W tym przypadku „” zastępuje cudzysłów:

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

Alternatywnie można użyć dowolnego kodowania, które nie zawiera znaków, które mają specjalne znaczenie w kontekście, na przykład base64:

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

Lub kodowanie procentowe :

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

Zapobiega to kolizji ograniczników i zapewnia, że ​​niezgodne znaki nie pojawią się w kodzie HTML, niezależnie od tego, jakie znaki występują w oryginalnym (zdekodowanym) tekście.

Zobacz też

Bibliografia

Zewnętrzne linki