Ir para o conteúdo

Sequências de escape

Quase todo bug de escape é um erro de contexto em vez de um erro de sintaxe. O caractere é conhecido — uma aspa, uma barra invertida, um e-comercial — e o que é pouco claro é qual das seis regras conflitantes se aplica onde a string está prestes a pousar.

Então, esta tabela é organizada por contexto, não por caractere. A mesma aspa é duplicada em uma célula CSV, escapada com barra invertida em JSON, transformada em " em HTML e deixada completamente intacta entre aspas simples em um shell. Quatro linhas, quatro regras, um caractere.

A regra que mais importa é aquela que as pessoas buscam por último: escape no limite que o valor está cruzando, e escape-o uma vez. Texto que é escapado duas vezes — um & na origem da página, um \\n no arquivo de saída — é a assinatura de um valor que passou por dois codificadores que cada um assumiu que eram os primeiros.

Strings JSON

10

JSON permite exatamente esses escapes. Uma nova linha ou abas literal dentro de uma string é inválida.

EscapeSignificaQuando você precisa dissoEm contexto
\""Uma aspa dupla dentro de uma string"say \"hi\""
\\\Uma barra invertida literalA razão pelos quais os caminhos do Windows quebram JSON."C:\\dir"
\//Uma barra invertida — opcionalLegal mas desnecessário; um hábito de incorporar JSON em tags <script>."a\/b"
\nU+000AUm avanço de linha"line\nline"
\rU+000DUm retorno de carro
\tU+0009Uma guia
\bU+0008Um backspace
\fU+000CUm avanço de página
\u00e9éQualquer caractere por seu ponto de código de quatro dígitos"caf\u00e9"
\ud83d\ude00😀Um caractere acima de U+FFFF, como um par substituoJSON não tem forma \u{…}, então caracteres astrais levam dois escapes.

Strings JavaScript

10

Um superconjunto do JSON, além dos escapes de literais de modelo.

EscapeSignificaQuando você precisa dissoEm contexto
\''Uma aspa simples dentro de uma string entre aspas simples
\""Uma aspa dupla dentro de uma string entre aspas duplas
\``Um backtick dentro de um literal de modelo
\${${Um literal ${ dentro de um literal de modeloSem a barra invertida, inicia uma interpolação.
\nU+000AUm avanço de linha
\xe9éUm caractere por dois dígitos hexadecimais, até U+00FF
\u00e9éUm caractere por quatro dígitos hexadecimais
\u{1f600}😀Qualquer ponto de código, no matter how longNão precisa de par substituo, ao contrário da forma de quatro dígitos.
\0U+0000Um caractere nulo
\u2028U+2028Separador de linhaVálido em uma string JS mas não em JSON — uma falha JSONP clássica.

Texto e atributos HTML

8

Apenas & e < estritamente devem ser escapados no texto; aspas importam dentro de atributos.

EscapeSignificaQuando você precisa dissoEm contexto
&amp;&Um e-comercialEscape este primeiro, ou qualquer outro escape dobra.
&lt;<Um sinal de menos-que, para que não comece uma tag
&gt;>Um sinal maior que
&quot;"Uma aspa dupla dentro de um atributo
&#39;'Uma aspa simples dentro de um atributo&apos; também funciona em HTML5, mas a forma numérica é segura em todos os lugares.
&nbsp;U+00A0Um espaço não-quebrável
&#233;éQualquer caractere por ponto de código decimal
&#xE9;éQualquer caractere por ponto de código hexadecimal

URLs (codificação de porcentagem)

9

Quais caracteres precisam de escape dependem da parte da URL em que estão.

EscapeSignificaQuando você precisa dissoEm contexto
%20 Um espaço, válido em qualquer lugar em uma URL
+ Um espaço, mas apenas em uma string de consulta codificada por formulárioEm um segmento de caminho, é um sinal de mais literal.
%25%Um sinal de porcentagem literalPerca isto e o valor decodifica duas vezes.
%2F/Uma barra invertida dentro de um segmento de caminho único
%3F?Um ponto de interrogação dentro de um valor
%26&Um e-comercial dentro de um valor de parâmetro
%3D=Um sinal de igual dentro de um valor de parâmetro
%23#Um hash, para que não comece o fragmento
%C3%A9éUm caractere não-ASCII, como seus bytes UTF-8Um caractere pode se tornar dois, três ou quatro grupos de porcentagem.

Campos CSV

5

RFC 4180: cite o campo, depois duplique qualquer aspa dentro dele. Barras invertidas não significam nada.

EscapeSignificaQuando você precisa dissoEm contexto
"""Uma aspa dentro de um campo entre aspas — duplique-a"say ""hi"""
"a,b",Um campo contendo o delimitador — cite o campo
"a b"U+000AUm campo contendo uma quebra de linha — cite o campo
" a" Preserve espaços iniciais ou finaisSem aspas, muitos analisadores os aparaçam.
'=SUM(A1)=Pare uma planilha de executar a célula como uma fórmulaAplica-se a valores começando =, +, - ou @. Esta é injeção de fórmula.

Literais e identificadores SQL

6

Leia esses; não os escreva. Use consultas parametrizadas.

EscapeSignificaQuando você precisa dissoEm contexto
'''Uma aspa dentro de um literal de string — duplique-a'O''Brien'
"order"orderUma palavra reservada usada como nome de colunaAspas duplas são o padrão; SQL Server usa [brackets].
`order`orderO mesmo no MySQL e MariaDB
\%%Um% literal dentro de um padrão LIKE
\__Um _ literal dentro de um padrão LIKE
$tag$ … $tag$'Citação em dólar PostgreSQL — sem escape algum dentroÚtil para corpos de código, onde duplicar cada aspa não é legível.

Argumentos de shell

6

Aspas simples são literais, aspas duplas ainda expandem variáveis.

EscapeSignificaQuando você precisa dissoEm contexto
'…'$ ` \Tudo dentro é literalA cotação mais segura que existe — mas não pode conter uma aspa simples.
"…"* ? spaceGlobs e espaços são seguros, as variáveis ainda se expandemAlways quote variables: "$var", never bare $var.
\ Um espaço em um nome de arquivo sem aspas
\$$Um sinal de dólar literal dentro de aspas duplas
\``Um backtick literal, não uma substituição de comando
'\'''Uma aspa simples dentro de aspas simplesFechar, escapar, reabrir — não há forma de aninhar direto.

FAQ

Por que meu JSON quebra em um caminho de arquivo do Windows?
Porque uma barra invertida inicia uma sequência de escape em uma string JSON, então C:\dir é lida como C, então um escape inválido. Escrito corretamente o valor é "C:\\dir" — duas barras invertidas no arquivo, uma na string analisada. Barras diagonais funcionam no Windows também e evitam o problema completamente.
É %20 ou + correto para um espaço em uma URL?
Ambos, em lugares diferentes. %20 é correto em qualquer lugar em uma URL. O sinal de mais significa um espaço apenas dentro de uma string de consulta codificada como application/x-www-form-urlencoded — em um segmento de caminho é um plus literal. Use %20 quando tiver dúvidas, porque está correto em todos os lugares.
Como faço para colocar uma aspa dentro de um campo CSV?
Coloque o campo entre aspas e duplique a interna: "say ""hi""". Esse é RFC 4180, e é por isso que um CSV cheio de aspas duplicadas não está corrompido. Uma barra invertida não significa nada para um analisador CSV em conformidade.
Qual é o apóstrofo inicial na linha de fórmula CSV?
Ele desativa uma injeção de fórmula. Uma célula começando com =, +, - ou @ é executada como uma fórmula quando o arquivo é aberto em uma planilha, então um valor como =SUM(A1) de uma fonte não confiável se torna código. Prefixar um apóstrofo força a célula a ser lida como texto.
Devo escapar SQL manualmente?
Não. Duplicar uma aspa é documentado aqui porque você precisa ler SQL escapado, não porque deveria escrevê-lo — use consultas parametrizadas e deixe o driver lidar com o valor. Escapar manualmente é de onde vem a injeção SQL, e não há versão disso que seja segura por inspeção.