Saltar al contenido

Secuencias de escape

Casi todo error de escapado es un error de contexto en lugar de un error de sintaxis. El carácter es conocido—una comilla, una barra invertida, un ampersand—y lo que no está claro es cuál de seis reglas conflictivas se aplica donde la cadena está a punto de aterrizar.

Por eso esta tabla está organizada por contexto, no por carácter. La misma comilla se duplica en una celda CSV, se escapa con barra invertida en JSON, se convierte en " en HTML y se deja completamente sola dentro de comillas simples en shell. Cuatro filas, cuatro reglas, un carácter.

La regla que más importa es la que la gente busca último: escapar en el límite que el valor cruza, y escaparlo una vez. El texto que se escapa dos veces—un & en el código fuente de la página, un \\n en el archivo de salida—es la firma de un valor que pasó por dos codificadores que cada uno asumía que eran primeros.

Cadenas JSON

10

JSON permite exactamente estos escapes. Una nueva línea o tabulación literal dentro de una cadena es inválida.

EscapadoSignificaCuándo lo necesitasEn contexto
\""Una comilla doble dentro de una cadena"say \"hi\""
\\\Una barra invertida literalLa razón por la que las rutas de Windows rompen JSON."C:\\dir"
\//Una barra diagonal—opcionalLegal pero innecesario; un hábito de incrustar JSON en etiquetas <script>."a\/b"
\nU+000AUn salto de línea"line\nline"
\rU+000DUn retorno de carro
\tU+0009Una tabulación
\bU+0008Un espacio atrás
\fU+000CUna alimentación de formulario
\u00e9éCualquier carácter por su punto de código de cuatro dígitos"caf\u00e9"
\ud83d\ude00😀Un carácter arriba de U+FFFF, como una pareja sustitutaJSON no tiene forma \u{…}, así que los caracteres astrales toman dos escapes.

Cadenas JavaScript

10

Un superconjunto del de JSON, más los escapes de literal de plantilla.

EscapadoSignificaCuándo lo necesitasEn contexto
\''Una comilla simple dentro de una cadena entrecomillada simple
\""Una comilla doble dentro de una cadena entrecomillada doble
\``Una comilla invertida dentro de un literal de plantilla
\${${Un ${literal dentro de un literal de plantillaSin la barra invertida comienza una interpolación.
\nU+000AUn salto de línea
\xe9éUn carácter por dos dígitos hexadecimales, hasta U+00FF
\u00e9éUn carácter por cuatro dígitos hexadecimales
\u{1f600}😀Cualquier punto de código, sin importar cuánto tiempoNo necesita una pareja sustituta, a diferencia de la forma de cuatro dígitos.
\0U+0000Un carácter nulo
\u2028U+2028Separador de líneaVálido en una cadena JS pero no en JSON—un clásico quebrantamiento de JSONP.

Texto e atributos HTML

8

Solo & e < deben escaparse estrictamente en texto; las comillas importan dentro de atributos.

EscapadoSignificaCuándo lo necesitasEn contexto
&amp;&Un ampersandEscapa este primero, o cada otro escape se duplica.
&lt;<Un signo de menor que, para que no comience una etiqueta
&gt;>Un signo de mayor que
&quot;"Una comilla doble dentro de un atributo
&#39;'Una comilla simple dentro de un atributo&apos; también funciona en HTML5, pero la forma numérica es segura en todas partes.
&nbsp;U+00A0Un espacio sin ruptura
&#233;éCualquier carácter por punto de código decimal
&#xE9;éCualquier carácter por punto de código hexadecimal

URLs (codificación de porcentaje)

9

Qué caracteres necesitan escaparse depende de la parte de la URL en la que se encuentren.

EscapadoSignificaCuándo lo necesitasEn contexto
%20 Un espacio, válido en cualquier parte de una URL
+ Un espacio, pero solo en una cadena de consulta codificada en formaEn un segmento de ruta esto es un signo más literal.
%25%Un signo de porcentaje literalPierde esto e el valor decodifica dos veces.
%2F/Una barra dentro de un segmento de ruta único
%3F?Un signo de pregunta dentro de un valor
%26&Un ampersand dentro de un valor de parámetro
%3D=Un signo de igual dentro de un valor de parámetro
%23#Un hash, para que no comience el fragmento
%C3%A9éUn carácter que no es ASCII, como sus bytes UTF-8Un carácter puede convertirse en dos, tres o cuatro grupos de porcentaje.

Campos CSV

5

RFC 4180: entrecomillar el campo, luego duplicar cualquier comilla interior. Las barras invertidas no significan nada.

EscapadoSignificaCuándo lo necesitasEn contexto
"""Una comilla dentro de un campo entrecomillado—duplicala"say ""hi"""
"a,b",Un campo que contiene el delimitador—entrecomillar el campo
"a b"U+000AUn campo que contiene un salto de línea—entrecomillar el campo
" a" Conserva espacios iniciales o finalesSin entrecomillar, muchos analizadores los recortan.
'=SUM(A1)=Detener que la hoja de cálculo ejecute la celda como una fórmulaSe aplica a valores que comienzan =, +, - o @. Esto es inyección de fórmula.

Literales e identificadores SQL

6

Lee estos; no los escribas. Usa consultas parametrizadas en su lugar.

EscapadoSignificaCuándo lo necesitasEn contexto
'''Una comilla dentro de un literal de cadena—duplicala'O''Brien'
"order"orderUna palabra reservada usada como nombre de columnaLas comillas dobles son el estándar; SQL Server usa [brackets].
`order`orderLo mismo en MySQL e MariaDB
\%%Un % literal dentro de un patrón LIKE
\__Un _ literal dentro de un patrón LIKE
$tag$ … $tag$'Entrecomillado con dólar de PostgreSQL—sin escapar nada en absolutoÚtil para cuerpos de código, donde duplicar cada comilla es ilegible.

Argumentos de shell

6

Las comillas simples son literales, las comillas dobles aún expanden variables.

EscapadoSignificaCuándo lo necesitasEn contexto
'…'$ ` \Todo adentro es literalEl entrecomillado más seguro que existe—pero no puede contener una comilla simple.
"…"* ? spaceGlob e espacios son seguros, las variables aún se expandenAlways quote variables: "$var", never bare $var.
\ Un espacio en un nombre de archivo sin entrecomillar
\$$Un signo de dólar literal dentro de comillas dobles
\``Una comilla invertida literal, no una sustitución de comando
'\'''Una comilla simple dentro de comillas simplesCierra, escapa, reabre—no hay forma de anidarlo directamente.

Preguntas frecuentes

¿Por qué mi JSON se rompe en una ruta de archivo de Windows?
Porque una barra invertida inicia una secuencia de escape en una cadena JSON, así que C:\dir se lee como C, luego un escape inválido. Escrito correctamente el valor es "C:\\dir"—dos barras invertidas en el archivo, una en la cadena analizada. Las barras diagonales también funcionan en Windows y evitan el problema completamente.
¿Es %20 o + correcto para un espacio en una URL?
Ambos, en lugares diferentes. %20 es correcto en cualquier parte de una URL. El signo más significa un espacio solo dentro de una cadena de consulta codificada como application/x-www-form-urlencoded—en un segmento de ruta es un más literal. Usa %20 cuando no estés seguro, porque es correcto en todas partes.
¿Cómo pongo una comilla dentro de un campo CSV?
Envuelve el campo entre comillas y duplica la interior: "di ""hola""". Ese es RFC 4180, y es por eso que un CSV lleno de comillas duplicadas no está corrupto. Una barra invertida no significa nada para un analizador CSV conforme.
¿Cuál es el apóstrofo inicial en la fila de fórmula CSV?
Desactiva una inyección de fórmula. Una celda que comienza con =, +, - o @ se ejecuta como una fórmula cuando el archivo se abre en una hoja de cálculo, así que un valor como =SUM(A1) de una fuente no confiable se convierte en código. Prefijando un apóstrofe fuerza la celda a ser leída como texto.
¿Debo escapar SQL a mano?
No. Duplicar una comilla se documenta aquí porque necesitas leer SQL escapado, no porque debas escribirlo—usa consultas parametrizadas y deja que el controlador maneje el valor. Escapar a mano es de donde viene la inyección SQL, y no hay versión de esto que sea segura por inspección.