
En informática , un delimitador es un carácter o una secuencia de caracteres que especifica el límite entre regiones separadas e independientes en datos como un archivo de texto o un flujo de datos . [ 1 ] [ 2 ] Para contextualizar, los límites de los datos pueden indicarse por otros medios. Por ejemplo, la notación declarativa indica la longitud de un campo al inicio del mismo en lugar de depender de delimitadores. [ 3 ]
En matemáticas , los delimitadores se utilizan a menudo para especificar el alcance de una operación en una expresión , y pueden aparecer tanto como símbolos aislados (por ejemplo, dos puntos en "") y como un par de símbolos de aspecto opuesto (por ejemplo, corchetes angulares en).
Ejemplos
Los delimitadores se utilizan para una amplia gama de propósitos. Los siguientes ejemplos demuestran solo una pequeña parte de su aplicabilidad.
Datos tabulares
Los datos tabulares , organizados en filas y columnas , suelen estar delimitados. Un delimitador de campo separa las columnas de una fila, correspondiendo cada columna a un campo de esa fila, y un delimitador de registro separa las filas, correspondiendo cada fila a un registro. [ 4 ] El formato de valores separados por comas (CSV), de uso común, utiliza una coma para delimitar los campos y un salto de línea para delimitar los registros. Los siguientes datos CSV representan tres registros, cada uno con cuatro campos. La primera línea contiene metadatos que nombran los campos.
nombre, apellido, edad, salario Nancy Davolio, 33 años, $30000 Erin Borakova, 28 años, $25250 Tony, Raphael, 35, $28700
Los datos CSV son un ejemplo de base de datos de archivo plano .
delimitadores de corchetes
Los delimitadores de corchetes, también llamados delimitadores de bloque, delimitadores de región o delimitadores balanceados, marcan el inicio y el final de una región de texto. [ 5 ] [ 6 ] Los delimitadores de corchetes de uso común incluyen: [ 7 ]
Colisión de delimitadores
La colisión de delimitadores describe una limitación del uso de delimitadores. Cuando la información de contenido contiene un delimitador, el procesamiento de los datos fallará, ya que el delimitador incrustado se interpretará incorrectamente como un límite de datos, a menos que se tomen medidas para evitar la colisión. [ 4 ] [ 15 ] En XML, por ejemplo, la colisión puede ocurrir cuando el contenido contiene un corchete angular (< o >).
Cada delimitador en un formato puede provocar una colisión. En CSV, por ejemplo, puede producirse una colisión de campos cuando un campo contiene una coma (p. ej., salary = "$30,000"), y una colisión de delimitadores de registros cuando un campo contiene un salto de línea. Tanto las colisiones de delimitadores de registros como las de campos ocurren con frecuencia en los datos CSV.
Un usuario malintencionado podría intentar explotar una colisión de delimitadores. Por consiguiente, la colisión de delimitadores puede ser la fuente de una vulnerabilidad de seguridad y un ataque . Ejemplos conocidos incluyen la inyección SQL y el cross-site scripting en el contexto de SQL y HTML , respectivamente.
Soluciones
Se han ideado múltiples métodos para evitar colisiones.
Ofuscación
Utilizar un delimitador que probablemente no aparezca en el contenido es un enfoque improvisado que ofrece resultados limitados. Requiere conocer el contenido previsto, adivinar qué no aparecerá en él y ofrece poca seguridad contra colisiones maliciosas.
Personajes de control
Si el contenido está restringido para que no contenga caracteres de control (lo cual es habitual), entonces usar caracteres de control como delimitadores evita la colisión de delimitadores que de otro modo podría ocurrir al usar delimitadores que no sean caracteres de control. [ 16 ] El conjunto de caracteres ASCII se diseñó teniendo esto en cuenta, proporcionando caracteres no imprimibles que pueden usarse como delimitadores en el rango de 28 a 31. Posteriormente, Unicode adoptó los mismos puntos de código.
Secuencia de escape
Un método comúnmente utilizado para evitar colisiones de delimitadores es el uso de secuencias de escape . Un carácter imprimible específico o una secuencia de caracteres antes de un carácter que de otro modo indicaría un límite, indica que el carácter delimitador no debe tratarse como tal. Si bien es eficaz, esta técnica tiene inconvenientes, entre ellos:
- El contenido puede ser difícil de leer cuando contiene numerosas secuencias de escape, un problema conocido como síndrome del palillo inclinado (debido al uso de \ para escapar / en expresiones regulares de Perl , lo que lleva a secuencias como "\/\/");
- Los datos se vuelven difíciles de analizar mediante expresiones regulares.
- Requiere una forma de escapar de la secuencia de escape (una forma de usar la secuencia de escape como contenido).
- Una secuencia de escape puede ser críptica para aquellos que no están familiarizados con la sintaxis [ 17 ].
- El método no protege contra ataques de inyección.
Codificación de nivel superior
Algunos sistemas permiten representar cualquier carácter como una secuencia de caracteres. Esto posibilita que el texto que de otro modo actuaría como delimitador se codifique indirectamente en el contenido, evitando así la colisión de delimitadores. Una desventaja de este método es que los códigos de caracteres son relativamente difíciles de leer, comprender y memorizar.
Por ejemplo, Perl permite codificar un carácter como la secuencia \x##donde ## es el valor numérico del código del carácter. A continuación se muestra cómo \x22se puede usar la secuencia de comillas dobles ( ) para evitar colisiones con el delimitador que marca el inicio y el final de un literal de cadena .
Imprimir "Nancy dijo '¡Hola Mundo!' a la multitud." ;produce el mismo resultado que:
print "Nancy dijo \"¡Hola Mundo!"\" a la multitud." ; ### usar carácter de escapeDelimitadores de comillas dobles
A diferencia de las secuencias de escape y los caracteres de escape, los delimitadores dobles proporcionan otra forma de evitar la colisión de delimitadores. Algunos lenguajes, por ejemplo, permiten el uso de una comilla simple (') o una comilla doble (")" para especificar un literal de cadena. Por ejemplo, en Perl :
' Nancy dijo "¡Hola mundo!" a la multitud. 'Produce el resultado deseado sin necesidad de caracteres de escape. Sin embargo, este método solo funciona cuando la cadena no contiene ambos tipos de comillas.
Relleno de delimitadores de citas
A diferencia de las secuencias y caracteres de escape, los delimitadores de relleno ofrecen otra forma de evitar colisiones de delimitadores. Visual Basic , por ejemplo, utiliza comillas dobles como delimitadores. Esto es similar a escapar el delimitador.
" Nancy dijo "¡Hola mundo!" a la multitud."Produce el resultado deseado sin necesidad de caracteres de escape. Sin embargo, al igual que con los caracteres de escape habituales, puede resultar confuso cuando se utilizan muchas comillas. El código para imprimir el código fuente anterior resultaría más confuso:
imprimir "imprimir ""Nancy dijo """"¡Hola mundo!"""" a la multitud."""Delimitadores de comillas alternativos configurables
A diferencia de los delimitadores duales, los delimitadores múltiples son aún más flexibles para evitar colisiones de delimitadores. [ 7 ] : 63
Por ejemplo, en Perl :
print qq^Nancy ya no quiere decir "¡Hola Mundo!".^ ; print qq@Nancy ya no quiere decir "¡Hola Mundo!".@ ; print qq(Nancy ya no quiere decir "¡Hola Mundo!".) ;Todos producen el resultado deseado mediante el uso de operadores de comillas , que permiten que cualquier carácter conveniente actúe como delimitador. Aunque este método es más flexible, pocos lenguajes lo admiten. Perl y Ruby son dos de ellos. [ 7 ] : 62 [ 18 ]
Límite de contenido
Un límite de contenido es un tipo especial de delimitador diseñado específicamente para evitar colisiones de delimitadores. Funciona permitiendo al autor especificar una secuencia de caracteres que garantiza que siempre indique un límite entre partes en un mensaje de varias partes, sin ninguna otra interpretación posible. [ 19 ]
El delimitador se genera frecuentemente a partir de una secuencia aleatoria de caracteres cuya aparición en el contenido es estadísticamente improbable. A continuación, puede ir seguido de una marca de identificación, como un UUID , una marca de tiempo u otra marca distintiva. Alternativamente, el contenido puede ser analizado para garantizar que el delimitador no aparezca en el texto. Esto permite que el delimitador sea más corto o sencillo, y mejora la legibilidad del documento. ( Véase, por ejemplo , MIME , documentos Here ).
Espacio en blanco o sangría
Algunos lenguajes de programación e informática permiten el uso de espacios en blanco o sangría como medio para especificar límites entre regiones independientes en el texto. [ 20 ]
Sintaxis de expresiones regulares
Al especificar una expresión regular , también se pueden usar delimitadores alternativos para simplificar la sintaxis de las operaciones de coincidencia y sustitución en Perl . [ 21 ]
Por ejemplo, en Perl se puede especificar una operación de coincidencia simple con la siguiente sintaxis:
$string1 = 'Nancy dijo "¡Hola mundo!" a la multitud.' ; # especificar una cadena objetivo print $string1 =~ m/[aeiou]+/ ; # coincidir con una o más vocalesLa sintaxis es lo suficientemente flexible como para especificar operaciones de coincidencia con delimitadores alternativos, lo que facilita evitar colisiones de delimitadores:
$string1 = 'Nancy dijo que "http://Hello/World.htm" no es una dirección válida.' ; # cadena objetivo print $string1 =~ m@http://@ ; # coincidencia usando un delimitador de expresión regular alternativo print $string1 =~ m{http://} ; # igual que el anterior, pero con un delimitador diferente print $string1 =~ m!http://! ; # igual que el anterior, pero con un delimitador diferente.Aquí el documento
Un documento aquí permite la inclusión de contenido arbitrario especificando una secuencia final especial. Muchos lenguajes admiten esta función, incluidos PHP , Bourne shell , Ruby y Perl . Un documento aquí comienza describiendo cuál es la secuencia final y continúa hasta que dicha secuencia aparece al inicio de una nueva línea. [ 22 ] Si se conoce el contenido, esta técnica evita la colisión de delimitadores, ya que se puede elegir una secuencia final que no exista en el contenido.
Un ejemplo en Perl:
print << ENDOFHEREDOC ; Es muy difícil codificar una cadena con "ciertos caracteres".Los saltos de línea, las comas y otros caracteres pueden provocar colisiones de delimitadores.Este código imprime:
Es muy difícil codificar una cadena con "ciertos caracteres". Los saltos de línea, las comas y otros caracteres pueden provocar colisiones de delimitadores.
armadura ASCII
Aunque se utiliza principalmente como mecanismo para la codificación de texto de datos binarios, el blindaje ASCII es una técnica de programación y administración de sistemas que también ayuda a evitar colisiones de delimitadores en algunas circunstancias. [ 23 ] [ 24 ] Esta técnica es más compleja que muchas otras técnicas de prevención de colisiones y, por lo tanto, es menos adecuada para aplicaciones pequeñas y formatos de datos simples. La técnica emplea un esquema de codificación especial, como base64 , para asegurar que los delimitadores u otros caracteres significativos no aparezcan en los datos transmitidos. Evita el escape de múltiples capas , es decir, para las comillas dobles .
Esta técnica se utiliza, por ejemplo, en ASP.NET y está estrechamente relacionada con el componente VIEWSTATE de dicho sistema. [ 25 ] Esto evita la colisión de delimitadores y garantiza que no aparezcan caracteres incompatibles dentro del código HTML, independientemente de los caracteres que aparezcan en el texto original (decodificado). [ 25 ] El siguiente ejemplo demuestra cómo funciona esta técnica.
El siguiente fragmento de código muestra una etiqueta HTML cuyo valor VIEWSTATE contiene comillas dobles , caracteres incompatibles con los delimitadores de la etiqueta HTML. El código no es válido y generaría un error.
<input type= "hidden" name= "__VIEWSTATE" value= "BookTitle:Nancy doesn't say " Hello World!" anymore." />Para almacenar texto arbitrario en un atributo HTML, se pueden usar entidades HTML" . En este caso , representa las comillas dobles.
<input type= "hidden" name= "__VIEWSTATE" value= "BookTitle:Nancy doesn't say "Hello World!" anymore." />Como alternativa, se podría utilizar cualquier codificación que no incluya caracteres que tengan un significado especial en el contexto, como por ejemplo base64:
<input type= "hidden" name= "__VIEWSTATE" value= "Qm9va1RpdGxlOk5hbmN5IGRvZXNuJ3Qgc2F5ICJIZWxsbyBXb3JsZCEiIGFueW1vcmUu" />