Delimitador - Delimiter

Uma representação estilística de um fragmento de um arquivo de texto formatado em CSV . As vírgulas (mostradas em vermelho) são usadas como delimitadores de campo.

Um delimitador é uma sequência de um ou mais caracteres para especificar o limite entre regiões separadas e independentes em texto simples , expressões matemáticas ou outros fluxos de dados . Um exemplo de delimitador é o caractere de vírgula , que atua como um delimitador de campo em uma sequência de valores separados por vírgula . Outro exemplo de delimitador é o intervalo de tempo usado para separar letras e palavras na transmissão do código Morse .

Em matemática , os delimitadores são freqüentemente usados ​​para especificar o escopo de uma operação e podem ocorrer tanto como símbolos isolados (por exemplo, dois pontos em " ") e como um par de símbolos de aparência oposta (por exemplo, colchetes angulares em ).

Delimitadores representam um dos vários meios de especificar limites em um fluxo de dados . A notação declarativa , por exemplo, é um método alternativo que usa um campo de comprimento no início de um fluxo de dados para especificar o número de caracteres que o fluxo de dados contém.

Visão geral

Os delimitadores podem ser caracterizados como delimitadores de campo e registro ou como delimitadores de colchetes.

Delimitadores de campo e registro

Os delimitadores de campo separam os campos de dados. Os delimitadores de registro separam grupos de campos.

Por exemplo, o formato de arquivo CSV usa uma vírgula como delimitador entre os campos e um indicador de fim de linha como delimitador entre os registros :

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

Isso especifica uma tabela de banco de dados de arquivo simples simples usando o formato de arquivo CSV.

Delimitadores de colchetes

Delimitadores de colchetes, também chamados de delimitadores de bloco, delimitadores de região ou delimitadores equilibrados, marcam o início e o fim de uma região de texto.

Exemplos comuns de delimitadores de colchetes incluem:

Delimitadores Descrição
( ) Parênteses . A sintaxe da linguagem de programação Lisp é citada como reconhecível principalmente pelo uso de parênteses.
{ } Chaves (também chamadas de colchetes ).
[ ] Colchetes (comumente usados ​​para denotar um subscrito)
< > Suportes angulares .
" " comumente usado para denotar literais de string .
' ' comumente usado para denotar literais de caracteres .
<? ?> usado para indicar instruções de processamento de XML .
/* */ usado para denotar comentários em algumas linguagens de programação.
<% %> usado em alguns modelos da web para especificar os limites do idioma. Eles também são chamados de delimitadores de modelo .

Convenções

Historicamente, as plataformas de computação usaram certos delimitadores por convenção. As tabelas a seguir mostram alguns exemplos para comparação.

Linguagens de Programação ( Ver também , Comparação de linguagens de programação (sintaxe) ).

String Literal Fim da declaração
Pascal citação única ponto e vírgula
Pitão aspas duplas, aspas simples fim de linha (EOL)

Campo e delimitadores de registro ( Ver também , ASCII , caracteres de controle ).

Fim do campo Fim do registro Fim do arquivo
Sistemas semelhantes a Unix , incluindo macOS , AmigaOS Aba LF Nenhum
Windows , MS-DOS , OS / 2 , CP / M Aba CRLF nenhum (exceto em CP / M), Control-Z
Mac OS clássico , Apple DOS , ProDOS , GS / OS Aba CR Nenhum
ASCII / Unicode
Posição do SEPARADOR DE UNIDADE 31 (U + 001F)

Posição 30 do SEPARADOR DE REGISTRO (U + 001E)

Posição 28 do SEPARADOR DE ARQUIVOS (U + 001C)

Delimitador de colisão

A colisão de delimitadores é um problema que ocorre quando um autor ou programador introduz delimitadores no texto sem realmente pretender que sejam interpretados como fronteiras entre regiões separadas. No caso do XML, por exemplo, isso pode ocorrer sempre que um autor tenta especificar um caractere de colchete angular .

Na maioria dos tipos de arquivo, há um delimitador de campo e um delimitador de registro, ambos sujeitos a colisão. No caso de arquivos de valores separados por vírgula , por exemplo, a colisão de campo pode ocorrer sempre que um autor tenta incluir uma vírgula como parte de um valor de campo (por exemplo, salário = "$ 30.000"), e a colisão do delimitador de registro ocorreria sempre que um campo continha várias linhas. Tanto o registro quanto a colisão do delimitador de campo ocorrem com freqüência em arquivos de texto.

Em alguns contextos, um usuário ou invasor mal-intencionado pode tentar explorar esse problema intencionalmente. Conseqüentemente, a colisão de delimitadores pode ser a fonte de vulnerabilidades e explorações de segurança . Usuários mal-intencionados podem tirar proveito da colisão de delimitadores em linguagens como SQL e HTML para implantar ataques bem conhecidos como injeção de SQL e script entre sites , respectivamente.

Soluções

Como a colisão do delimitador é um problema muito comum, vários métodos para evitá-la foram inventados. Alguns autores podem tentar evitar o problema escolhendo um caractere delimitador (ou sequência de caracteres) que provavelmente não aparecerá no próprio fluxo de dados. Essa abordagem ad hoc pode ser adequada, mas depende necessariamente de uma estimativa correta do que aparecerá no fluxo de dados e não oferece segurança contra colisões maliciosas. Outras convenções mais formais também são aplicadas.

Texto delimitado por ASCII

Os conjuntos de caracteres ASCII e Unicode foram projetados para resolver esse problema, fornecendo caracteres não imprimíveis que podem ser usados ​​como delimitadores. Eles variam de ASCII 28 a 31.

ASCII dez Símbolo Nome Unicode Nome comum Uso
28 SEPARADOR QUATRO DE INFORMAÇÕES separador de arquivo Fim do arquivo. Ou entre uma concatenação do que poderiam ser arquivos separados.
29 SEPARADOR DE INFORMAÇÕES TRÊS separador de grupo Entre seções de dados. Não é necessário em arquivos de dados simples.
30 SEPARADOR DE INFORMAÇÕES DOIS separador de registro Fim de um registro ou linha.
31 SEPARADOR UM DE INFORMAÇÕES separador de unidade Entre campos de um registro ou membros de uma linha.

O uso do separador ASCII 31 Unit como separador de campo e do separador ASCII 30 Record resolve o problema dos delimitadores de campo e de registro que aparecem em um fluxo de dados de texto.

Personagem de fuga

Um método para evitar a colisão do delimitador é usar caracteres de escape . Do ponto de vista do design de linguagem, eles são adequados, mas têm desvantagens:

  • o texto pode se tornar ilegível quando cheio de vários caracteres de escape, um problema conhecido como síndrome do palito de dente inclinado (devido ao uso de \ to escape / em expressões regulares Perl , levando a sequências como "\ / \ /");
  • o texto torna-se difícil de analisar por meio de expressão regular
  • eles requerem um mecanismo para "escapar dos escapes" quando não pretendem ser caracteres de escape; e
  • embora fáceis de digitar, eles podem ser enigmáticos para alguém não familiarizado com o idioma.
  • eles não protegem contra ataques de injeção

Sequência de fuga

As sequências de escape são semelhantes aos caracteres de escape, exceto que geralmente consistem em algum tipo de mnemônico em vez de apenas um único caractere. Um uso é em literais de string que incluem um caractere de aspas duplas ("). Por exemplo, em Perl , o código:

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

produz a mesma saída que:

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

Uma desvantagem de seqüências de escape, quando usado por pessoas, é a necessidade de memorizar os códigos que representam caracteres individuais (ver também: referência de entidade de caráter , referência de caráter numérico ).

Delimitadores de aspas duplas

Em contraste com as sequências de escape e os caracteres de escape, os delimitadores duplos fornecem outra maneira de evitar a colisão de delimitadores. Algumas linguagens, por exemplo, permitem o uso de aspas simples (') ou aspas duplas (") para especificar um literal de string. Por exemplo, em Perl :

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

produz a saída desejada sem exigir escapes. Essa abordagem, no entanto, só funciona quando a string não contém os dois tipos de aspas.

Preenchimento de delimitadores de citação

Em contraste com as sequências de escape e os caracteres de escape, os delimitadores de preenchimento fornecem outra maneira de evitar a colisão de delimitadores. Visual Basic , por exemplo, usa aspas duplas como delimitadores. Isso é semelhante a escapar do delimitador.

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

produz a saída desejada sem exigir escapes. No entanto, como o escape regular, ele pode se tornar confuso quando muitas aspas são usadas. O código para imprimir o código-fonte acima pareceria mais confuso:

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

Delimitadores de citação alternativos configuráveis

Em contraste com os delimitadores duplos, os delimitadores múltiplos são ainda mais flexíveis para evitar a colisão de delimitadores.

Por exemplo, em Perl :

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

todos produzem a saída desejada por meio do uso de operadores de aspas , que permitem que qualquer caractere conveniente atue como um delimitador. Embora esse método seja mais flexível, poucos idiomas o suportam. Perl e Ruby são dois que o fazem.

Limite de conteúdo

Um limite de conteúdo é um tipo especial de delimitador projetado especificamente para resistir à colisão de delimitadores. Funciona permitindo ao autor especificar uma sequência de caracteres que é garantida para sempre indicar um limite entre as partes em uma mensagem de várias partes, sem outra interpretação possível.

O delimitador é frequentemente gerado a partir de uma sequência aleatória de caracteres que é estatisticamente improvável de ocorrer no conteúdo. Isso pode ser seguido por uma marca de identificação, como um UUID , um carimbo de data / hora ou alguma outra marca de distinção. Como alternativa, o conteúdo pode ser digitalizado para garantir que um delimitador não apareça no texto. Isso pode permitir que o delimitador seja mais curto ou mais simples e aumentar a legibilidade humana do documento. ( Ver , por exemplo , MIME , documentos Here ).

Espaço em branco ou recuo

Algumas linguagens de programação e de computador permitem o uso de delimitadores de espaço em branco ou recuo como meio de especificar os limites entre regiões independentes no texto.

Sintaxe de expressão regular

Ao especificar uma expressão regular , delimitadores alternativos também podem ser usados ​​para simplificar a sintaxe para operações de correspondência e substituição em Perl .

Por exemplo, uma operação de correspondência simples pode ser especificada em Perl com a seguinte sintaxe:

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

A sintaxe é flexível o suficiente para especificar operações de correspondência com delimitadores alternativos, tornando mais fácil evitar a colisão de delimitadores:

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

Aqui documento

Um documento Here permite a inclusão de conteúdo arbitrário ao descrever uma sequência final especial. Muitas linguagens suportam isso, incluindo PHP , scripts bash , ruby e perl . Um documento here começa descrevendo qual será a seqüência final e continua até que a seqüência seja vista no início de uma nova linha.

Aqui está um exemplo em perl:

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

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

Este código imprimiria:

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

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

Ao usar uma sequência final especial, todos os tipos de caracteres são permitidos na string.

Armadura ASCII

Embora usado principalmente como um mecanismo para codificação de texto de dados binários, a proteção ASCII é uma técnica de programação e administração de sistemas que também ajuda a evitar a colisão de delimitadores em algumas circunstâncias. Essa técnica é diferente das outras abordagens descritas acima porque é mais complicada e, portanto, não é adequada para aplicativos pequenos e formatos de armazenamento de dados simples. A técnica emprega um esquema de codificação especial, como base64 , para garantir que o delimitador ou outros caracteres significativos não apareçam nos dados transmitidos. O objetivo é evitar o escape de várias camadas , ou seja, para aspas duplas .

Esta técnica é usada, por exemplo, no Microsoft 's ASP.NET tecnologia de desenvolvimento web, e está intimamente associado ao componente 'VIEWSTATE' desse sistema.

Exemplo

O exemplo simplificado a seguir demonstra como essa técnica funciona na prática.

O primeiro fragmento de código mostra uma tag HTML simples em que o valor VIEWSTATE contém caracteres incompatíveis com os delimitadores da própria tag HTML:

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

Este primeiro fragmento de código não está bem formado e, portanto, não funcionaria corretamente em um sistema implantado no "mundo real".

Para armazenar texto arbitrário em um atributo HTML , podem ser usadas entidades HTML . Neste caso, "& quot;" representa aspas duplas:

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

Como alternativa, pode ser usada qualquer codificação que não inclua caracteres com significado especial no contexto, como base64:

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

Ou codificação percentual :

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

Isso evita a colisão do delimitador e garante que caracteres incompatíveis não apareçam dentro do código HTML, independentemente de quais caracteres aparecem no texto original (decodificado).

Veja também

Referências

links externos