Delimitador

Caracteres que especifican el límite entre regiones en un flujo de datos
Representación estilística de valores dentro de un archivo de texto llamado valores separados por comas (CSV). Las comas (mostradas en rojo) se utilizan como delimitadores de campo.

Un delimitador es una secuencia de uno o más caracteres que especifican el límite entre regiones independientes y separadas en texto simple , expresiones matemáticas u otros flujos de datos . [1] [2] Un ejemplo de un delimitador es el carácter de coma , que actúa como un delimitador de campo en una secuencia de valores separados por comas . Otro ejemplo de un delimitador es el espacio de tiempo utilizado para separar letras y palabras en la transmisión del código Morse . [ cita requerida ]

En matemáticas , los delimitadores se utilizan a menudo para especificar el alcance de una operació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 ). 1 : 4 {\estilo de visualización 1:4} a , b {\displaystyle \langle a,b\rangle }

Los delimitadores representan uno de los diversos medios para especificar límites en un flujo de datos . La notación declarativa , por ejemplo, es un método alternativo (sin el uso de delimitadores) que utiliza un campo de longitud al comienzo de un flujo de datos para especificar la cantidad de caracteres que contiene el flujo de datos. [3]

Descripción general

Los delimitadores pueden caracterizarse como delimitadores de campo y registro, o como delimitadores de corchetes.

Delimitadores de campos y registros

Los delimitadores de campo separan los campos de datos. Los delimitadores de registro separan grupos de campos. [4]

Por ejemplo, el formato CSV utiliza una coma como delimitador entre campos y un indicador de fin de línea como delimitador entre registros :

fname,apellido,edad,salarioNancy Davolio 33 años 30.000 dólaresErin Boraková, 28 años, 25.250 dólaresTony Rafael, 35 años, 28.700 dólares

Esto especifica una tabla de base de datos de archivo plano simple que utiliza el formato de archivo CSV.

Delimitadores de corchetes

Los delimitadores de corchetes, también llamados delimitadores de bloque, delimitadores de región o delimitadores equilibrados, marcan tanto el inicio como el final de una región de texto. [5] [6]

Algunos ejemplos comunes de delimitadores de corchetes incluyen: [7]

DelimitadoresDescripción
( )Paréntesis . La sintaxis del lenguaje de programación Lisp se reconoce principalmente por el uso de paréntesis. [8]
{ }Llaves (también llamadas llaves [9] ).
[ ]Corchetes (comúnmente utilizados para indicar un subíndice).
< >Corchetes angulares . [10]
" "Se utiliza comúnmente para denotar literales de cadena . [11]
' 'Se utiliza comúnmente para denotar literales de caracteres . [11]
<? ?>se utiliza para indicar instrucciones de procesamiento XML . [12]
/* */Se utiliza para denotar comentarios en algunos lenguajes de programación. [13]
<% %>Se utiliza en algunas plantillas web para especificar los límites del idioma. [14]

Convenciones

Históricamente, las plataformas informáticas han utilizado ciertos delimitadores por convención. [15] [16] Las siguientes tablas muestran algunos ejemplos a modo de comparación.

Lenguajes de programación ( Ver también , Comparación de lenguajes de programación (sintaxis) ).

Literal de cadenaFin de la declaración
Pascalcomilla simplepunto y coma
Pitóncomillas dobles, comillas simplesfin de línea (EOL)

Delimitadores de campo y registro ( véase también ASCII , Carácter de control ).

Fin del campoFin del registroFin del archivo
Sistemas similares a Unix , incluidos macOS y AmigaOSPestañaSininguno
Windows , MS-DOS , OS/2 , CP/MPestañaCRLFNinguno (excepto en CP/M), Control-Z [17]
Mac OS clásico , Apple DOS , ProDOS , GS/OSPestañaESninguno
ASCII/UnicodeSEPARADOR DE UNIDAD
Posición 31 (U+001F)
SEPARADOR DE REGISTROS
Posición 30 (U+001E)
SEPARADOR DE ARCHIVOS
Posición 28 (U+001C)

Colisión de delimitadores

La colisión de delimitadores es un problema que ocurre cuando un autor o programador introduce delimitadores en un texto sin tener la intención real de que se interpreten como límites entre regiones separadas. [4] [18] En el caso de XML, por ejemplo, esto puede ocurrir siempre que un autor intente especificar un carácter de corchete angular .

En la mayoría de los tipos de archivos hay un delimitador de campo y un delimitador de registro, ambos sujetos a colisiones. En el caso de los archivos de valores separados por comas , por ejemplo, la colisión de campos puede ocurrir siempre que un autor intente incluir una coma como parte de un valor de campo (por ejemplo, salario = "$30,000"), y la colisión de delimitadores de registro ocurriría siempre que un campo contuviera varias líneas. Tanto la colisión de delimitadores de registro como la de campo ocurren con frecuencia en los archivos de texto.

En algunos contextos, un usuario o atacante malintencionado puede intentar explotar este problema de forma intencionada. En consecuencia, la colisión de delimitadores puede ser la fuente de vulnerabilidades de seguridad y exploits . Los usuarios malintencionados pueden aprovechar la colisión de delimitadores en lenguajes como SQL y HTML para implementar ataques tan conocidos como la inyección SQL y el cross-site scripting , respectivamente.

Soluciones

Dado que la colisión de delimitadores es un problema muy común, se han inventado varios métodos para evitarlo. Algunos autores pueden intentar evitar el problema eligiendo un carácter delimitador (o una secuencia de caracteres) que no es probable que aparezca en el flujo de datos. Este enfoque ad hoc puede ser adecuado, pero depende necesariamente de una suposición correcta de lo que aparecerá en el flujo de datos y no ofrece seguridad contra colisiones maliciosas. Por lo tanto, también se aplican otras convenciones más formales.

Texto delimitado por ASCII

Los conjuntos de caracteres ASCII y Unicode se diseñaron para resolver este problema mediante la provisión de caracteres no imprimibles que se pueden utilizar como delimitadores. Se trata del rango de caracteres ASCII 28 a 31.

Dec ASCIISímboloNombre UnicodeNombre comúnUso
28SEPARADOR DE INFORMACIÓN CUATROseparador de archivosFin del archivo. O entre una concatenación de lo que de otro modo podrían ser archivos separados.
29SEPARADOR DE INFORMACIÓN TRESseparador de grupoEntre secciones de datos. No es necesario en archivos de datos simples.
30SEPARADOR DE INFORMACIÓN DOSseparador de registrosFin de un registro o fila.
31SEPARADOR DE INFORMACIÓN UNOSeparador de unidadesEntre campos de un registro o miembros de una fila.

El uso del separador de unidades ASCII 31 como separador de campos y del separador de registros ASCII 30 resuelve el problema de los delimitadores de campos y registros que aparecen en un flujo de datos de texto. [19]

Personaje de escape

Un método para evitar la colisión de delimitadores es utilizar caracteres de escape . Desde el punto de vista del diseño del lenguaje, estos son adecuados, pero tienen desventajas:

  • el texto puede volverse ilegible cuando está plagado de numerosos caracteres de escape, un problema conocido como síndrome del palillo inclinado (debido al uso de \ para escapar / en expresiones regulares de Perl , lo que genera secuencias como "\/\/");
  • El texto se vuelve difícil de analizar a través de expresiones regulares.
  • requieren un mecanismo para "escapar de los escapes" cuando no están destinados a ser caracteres de escape; y
  • Aunque son fáciles de escribir, pueden resultar crípticos para alguien que no esté familiarizado con el idioma. [20]
  • No protegen contra ataques de inyección [ cita requerida ]

Secuencia de escape

Las secuencias de escape son similares a los caracteres de escape, excepto que suelen constar de algún tipo de mnemotecnia en lugar de un solo carácter. Uno de sus usos es en literales de cadena que incluyen un carácter de comillas dobles ("). Por ejemplo, en Perl , el código:

imprimir "Nancy dijo \x22¡Hola mundo!\x22 a la multitud." ; ### use \x22  

produce el mismo resultado que:

imprimir "Nancy dijo \"¡Hola mundo!\" a la multitud." ; ### use escape char  

Una desventaja de las secuencias de escape, cuando las utilizan las personas, es la necesidad de memorizar los códigos que representan caracteres individuales (ver también: referencia de entidad de carácter , referencia de carácter numérico ).

Delimitadores de comillas dobles

A diferencia de las secuencias de escape y los caracteres de escape, los delimitadores duales 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 una cadena literal. Por ejemplo, en Perl :

Imprimir 'Nancy dijo '¡Hola mundo!' a la multitud.' ; 

produce el resultado deseado sin necesidad de utilizar comillas de escape. Sin embargo, este enfoque solo funciona cuando la cadena no contiene ambos tipos de comillas.

Relleno de delimitadores entre comillas

A diferencia de las secuencias de escape y los caracteres de escape, los delimitadores de relleno proporcionan otra forma de evitar la colisión de delimitadores. Visual Basic , por ejemplo, utiliza comillas dobles como delimitadores. Esto es similar a escapar el delimitador.

Imprimir "Nancy dijo "Hola mundo!" a la multitud." 

produce el resultado deseado sin necesidad de utilizar escapes. Sin embargo, al igual que los escapes normales, puede resultar confuso cuando se utilizan muchas comillas. El código para imprimir el código fuente anterior parecerí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 la colisión 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 los que lo hacen. [7] : 62  [21]

Límite de contenido

Un límite de contenido es un tipo especial de delimitador que está diseñado específicamente para resistir la colisión de delimitadores. Funciona permitiendo al autor especificar una secuencia de caracteres que garantiza que siempre indicará un límite entre las partes de un mensaje de varias partes, sin ninguna otra interpretación posible. [22]

El delimitador se genera frecuentemente a partir de una secuencia aleatoria de caracteres que es estadísticamente improbable que aparezca en el contenido. Esto puede ir seguido de una marca de identificación como un UUID , una marca de tiempo o alguna otra marca distintiva. Alternativamente, el contenido puede escanearse para garantizar que no aparezca un delimitador en el texto. Esto puede permitir que el delimitador sea más corto o más simple, y aumentar la legibilidad humana del documento. ( Véase, por ejemplo , MIME , documentos Here ).

Espacio en blanco o sangría

Algunos lenguajes de programación y de computación permiten el uso de delimitadores de espacios en blanco o sangrías como un medio para especificar límites entre regiones independientes en el texto. [23]

Sintaxis de expresiones regulares

Al especificar una expresión regular , también se pueden utilizar delimitadores alternativos para simplificar la sintaxis de las operaciones de coincidencia y sustitución en Perl . [24]

Por ejemplo, una operación de coincidencia simple se puede especificar en Perl con la siguiente sintaxis:

$string1 = 'Nancy dijo "¡Hola mundo!" a la multitud.' ; # especifica una cadena de destino print $string1 =~ m/[aeiou]+/ ; # coincide con una o más vocales       

La sintaxis es lo suficientemente flexible para especificar operaciones de coincidencia con delimitadores alternativos, lo que facilita evitar la colisión de delimitadores:

$string1 = 'Nancy dijo que "http://Hello/World.htm" no es una dirección válida.' ; # cadena de destino 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 Here permite la inclusión de contenido arbitrario al describir una secuencia final especial. Muchos lenguajes admiten esta función, incluidos PHP , scripts bash , Ruby y Perl . Un documento Here comienza describiendo cuál será la secuencia final y continúa hasta que esa secuencia se ve al comienzo de una nueva línea. [25]

Aquí hay un ejemplo en Perl:

imprimir << ENDOFHEREDOC ; Es muy difícil codificar una cadena con "ciertos caracteres". Las nuevas líneas, las comas y otros caracteres pueden provocar colisiones de delimitadores. ENDOFHEREDOC

Este código imprimiría:

Es muy difícil codificar una cadena con "ciertos caracteres".Las nuevas líneas, comas y otros caracteres pueden provocar colisiones de delimitadores.

Al utilizar una secuencia final especial se permiten todo tipo de caracteres en la cadena.

Armadura ASCII

Aunque se utiliza principalmente como un 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 la colisión de delimitadores en algunas circunstancias. [26] [27] Esta técnica se contrasta con los otros enfoques descritos anteriormente porque es más complicada y, por lo tanto, no es adecuada para aplicaciones pequeñas y formatos de almacenamiento de datos simples. La técnica emplea un esquema de codificación especial, como base64 , para garantizar que el delimitador u otros caracteres significativos no aparezcan en los datos transmitidos. El propósito es evitar el escape multicapa , es decir, para las comillas dobles .

Esta técnica se utiliza, por ejemplo, en la tecnología de desarrollo web ASP.NET de Microsoft , y está estrechamente asociada con el componente "VIEWSTATE" de ese sistema. [28]

Ejemplo

El siguiente ejemplo simplificado demuestra cómo funciona esta técnica en la práctica.

El primer fragmento de código muestra una etiqueta HTML simple en la que el valor VIEWSTATE contiene caracteres que son incompatibles con los delimitadores de la propia etiqueta HTML:

<input type= "hidden" name= "__VIEWSTATE" value= "BookTitle:Nancy ya no dice " ¡Hola mundo!" ." />      

Este primer fragmento de código no está bien formado y, por lo tanto, no funcionaría correctamente en un sistema implementado en el "mundo real".

Para almacenar texto arbitrario en un atributo HTML, se pueden utilizar entidades HTML . En este caso, """ sustituye a las comillas dobles:

<input type= "hidden" name= "__VIEWSTATE" value= "BookTitle:Nancy ya no dice "¡Hola mundo!"." />    

Como alternativa, se podría utilizar cualquier codificación que no incluya caracteres que tengan un significado especial en el contexto, como base64:

< tipo de entrada= "oculto" nombre= "__VIEWSTATE" valor= "Qm9va1RpdGxlOk5hbmN5IGRvZXNuJ3Qgc2F5ICJIZWxsbyBXb3JsZCEiIGFueW1vcmUu" />    

O codificación porcentual :

<input type= "hidden" name= "__VIEWSTATE" value= "TítuloLibro:Nancy%20ya%27no%20dice%20%22¡Hola%20mundo!%22%20." />    

Esto evita la colisión de delimitadores y garantiza que no aparecerán caracteres incompatibles dentro del código HTML, independientemente de qué caracteres aparezcan en el texto original (decodificado). [28]

Véase también

Referencias

  1. ^ "Definición: delimitador". Norma Federal 1037C - Telecomunicaciones: Glosario de términos de telecomunicaciones . Archivado desde el original el 2013-03-05 . Consultado el 2019-11-25 .
  2. ^ "¿Qué es un delimitador?". www.computerhope.com . Consultado el 9 de agosto de 2020 .
  3. ^ Rohl, Jeffrey S. (1973). Programación en Fortran . Oxford Oxfordshire: Oxford University Press. ISBN 978-0-7190-0555-8.describiendo el método en notación Hollerith bajo el lenguaje de programación Fortran.
  4. ^ ab de Moor, Georges J. (1993). Progreso en la estandarización de la informática sanitaria . IOS Press. ISBN 90-5199-114-2.pág. 141
  5. ^ Friedl, Jeffrey EF (2002). Dominar las expresiones regulares: técnicas eficaces para Perl y otras herramientas . O'Reilly. ISBN 0-596-00289-0.pág. 319
  6. ^ Scott, Michael Lee (1999). Pragmática del lenguaje de programación . Morgan Kaufmann. ISBN 1-55860-442-1.
  7. ^ abc Wall, Larry ; Orwant, Jon (julio de 2000). Programación Perl (tercera edición). O'Reilly. ISBN 0-596-00027-8.
  8. ^ Kaufmann, Matt (2000). Razonamiento asistido por computadora: un enfoque . Springer. ISBN 0-7923-7744-3.pág. 3
  9. ^ Meyer, Mark (2005). Exploraciones en informática . Oxford Oxfordshire: Oxford University Press. ISBN 978-0-7637-3832-7.hace referencia a lenguajes de programación de estilo C que destacan por su uso de llaves y punto y coma.
  10. ^ Dilligan, Robert (1998). Computación en la era de la Web . Oxford Oxfordshire: Oxford University Press. ISBN 978-0-306-45972-6.Describe la sintaxis y los delimitadores utilizados en HTML.
  11. ^ de Schwartz, Randal (2005). Aprendiendo Perl. Oxford Oxfordshire: Oxford University Press. ISBN 978-0-596-10105-3.Describe literales de cadena .
  12. ^ Watt, Andrew (2003). Sams: aprenda a usar XML en 10 minutos . Oxford Oxfordshire: Oxford University Press. ISBN 978-0-672-32471-0.Describe la instrucción de procesamiento XML. p. 21.
  13. ^ Cabrera, Harold (2002). C# para programadores Java . Oxford Oxfordshire: Oxford University Press. ISBN 978-1-931836-54-8.Describe comentarios de una sola línea y de varias líneas. pág. 72.
  14. ^ "Especificación de Jakarta Server Pages, versión 4.0Especificación de Jakarta Server Pages, versión 4.0". GitHub . Consultado el 10 de febrero de 2023 .
  15. ^ ISO/TC 97/SC 2 (1 de diciembre de 1975). El conjunto de caracteres de control para ISO 646 (PDF) . ITSCJ/ IPSJ . ISO-IR -1.{{citation}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  16. ^ American National Standards Institute (1 de diciembre de 1975). Conjunto de caracteres gráficos ASCII (PDF) . ITSCJ/ IPSJ . ISO-IR -6.
  17. ^ Lewine, Donald (1991). Guía del programador de Posix. Oxford Oxfordshire: Oxford University Press. ISBN 978-0-937175-73-6.Describe el uso de control-zp 156,
  18. ^ Friedl, Jeffrey (2006). Dominar las expresiones regulares . Oxford Oxfordshire: Oxford University Press. ISBN 978-0-596-52812-6.Describiendo soluciones para problemas con delimitadores incrustados p. 472.
  19. ^ Discusión sobre texto delimitado por ASCII vs. CSV y texto delimitado por tabulaciones
  20. ^ Kahrel, Peter (2006). Automatización de InDesign con expresiones regulares . O'Reilly. pág. 11. ISBN 0-596-52937-6.
  21. ^ Yukihiro, Matsumoto (2001). Rubí en pocas palabras. O'Reilly. ISBN 0-596-00214-9.En Ruby, estos se indican como cadenas delimitadas generales . p. 11
  22. ^ Manual de protocolos de red . Javvin Technologies Inc. 2005. ISBN 0-9740945-2-8.pág. 26
  23. ^ Lingüística computacional y procesamiento inteligente de textos . Oxford Oxfordshire: Oxford University Press. 2001. ISBN 978-3-540-41687-6.Describe los delimitadores de espacios en blanco. p. 258.
  24. ^ Friedl, Jeffrey (2006). Dominar las expresiones regulares . Oxford Oxfordshire: Oxford University Press. ISBN 978-0-596-52812-6.Página 472.
  25. ^ Operadores y precedencia de Perl
  26. ^ Rhee, Man (2003). Seguridad en Internet: principios criptográficos, algoritmos y protocolos . John Wiley and Sons. ISBN 0-470-85285-2.(un ejemplo de uso del blindaje ASCII en aplicaciones de cifrado)
  27. ^ Gross, Christian (2005). Código abierto para administradores de Windows . Charles River Media. ISBN 1-58450-347-5.(un ejemplo de uso del blindaje ASCII en aplicaciones de cifrado)
  28. ^ ab Kalani, Amit (2004). Desarrollo e implementación de aplicaciones web con Visual C# . NET y Visual Studio . NET . Que. ISBN 0-7897-2901-6.(describe el uso de la codificación Base64 y VIEWSTATE dentro del código fuente HTML)
Obtenido de "https://es.wikipedia.org/w/index.php?title=Delimitador&oldid=1215698820"