Preskoči na vsebino

Zaporedje escapiranja

Skoraj vsaka napaka pri escapiranju je napaka konteksta in ne napaka sintakse. Znak je znan — navedek, povratnica, ampersand — in nejasno je le, katera od šestih nasprotujočih si pravil se uporablja, kjer se bo niz znašel.

Zato je ta tabela urejena po kontekstu in ne po znaku. Isti navedek je v celici CSV podvojen, v JSON escapiran s povratnico, spremenjen v " v HTML in popolnoma sam v enojnih navedkih v lupini. Štiri vrstice, štiri pravila, en znak.

Pravilo, ki je najpomembnejše, je tisto, ki se ga ljudje sežejo nazadnje: escapiraj na meji, ki jo preseka vrednost, in jo escapiraj enkrat. Besedilo, ki je dvakrat escapirano — & v viru strani, \\n v izhodni datoteki — je podpis vrednosti, ki je prešla skozi dva kodirunika, ki sta vsak predpostavljala, da sta prva.

JSON nizi

10

JSON dovoljuje natanko te escapiranja. Dobesedni skok ali tabelator znotraj niza je neveljaven.

EscapiranjePomeniKdaj to potrebuješV kontekstu
\""Dvojni navedek znotraj niza"say \"hi\""
\\\Dobesedna povratnicaRazlog, da se poti Windows lomijo JSON."C:\\dir"
\//Poševnica — izbirnaZakonito, vendar nepotrebno; navada iz vgrajevanja JSON-a v <script> oznake."a\/b"
\nU+000APodaja za krmiljenje"line\nline"
\rU+000DVračalka vozička
\tU+0009Tabulatorja
\bU+0008Vračalo
\fU+000CObrazec oddajanja
\u00e9éKateri koli znak po njegovi štiricifrski kodni točki"caf\u00e9"
\ud83d\ude00😀Znak nad U+FFFF, kot par nadomestkaJSON nima oblike \u{…}, zato astralski znaki potrebujejo dve escapiranja.

JavaScript nizi

10

Nadmnožica JSON-a, plus zaporedje escapiranja template-literal.

EscapiranjePomeniKdaj to potrebuješV kontekstu
\''Enojni navedek znotraj enojno navedka niza
\""Dvojni navedek znotraj dvojno navedka niza
\``Povratnica znotraj template literala
\${${Dobesedni ${ znotraj template literalaBrez povratnice se začne interpolacija.
\nU+000APodaja za krmiljenje
\xe9éZnak po dveh šestnajstičnih števkah, do U+00FF
\u00e9éZnak po štirih šestnajstičnih števkah
\u{1f600}😀Kateri koli kod, ne glede kako dolgNi potrebna par nadomestka, za razliko od štiricifrne oblike.
\0U+0000Ničeln znak
\u2028U+2028Ločilnik vrsticVeljaven v nizu JS, vendar ne v JSON-u — klasičen prelom JSONP.

HTML besedilo in atributi

8

Le & in < strogo morata biti escapirana v besedilu; navedki so pomembni znotraj atributov.

EscapiranjePomeniKdaj to potrebuješV kontekstu
&amp;&AmpersandEscapiraj tega prvega, ali vsak drugi escape podvoji.
&lt;<Manj kot znak, tako da ne začne oznake
&gt;>Večji kot znak
&quot;"Dvojni navedek znotraj atributa
&#39;'Enojni navedek znotraj atributa&apos; tudi deluje v HTML5, vendar je numerična oblika varna povsod.
&nbsp;U+00A0Razmik brez prekinjanja
&#233;éKateri koli znak po desetiški kodni točki
&#xE9;éKateri koli znak po šestnajstični kodni točki

URL-ji (procentualno kodiranje)

9

Kateri znaki potrebujejo escapiranje, je odvisno od dela URL-ja, v katerem sedijo.

EscapiranjePomeniKdaj to potrebuješV kontekstu
%20 Presledek, veljaven kjerkoli v URL-ju
+ Presledek, vendar samo v nizu poizvedbe kodiranem s formularjiV segmentu poti je to dobesedni plus znak.
%25%Dobesedni znak odstotkaIzpusti to in vrednost dekodira dvakrat.
%2F/Poševnica znotraj enega segmenta poti
%3F?Vprašalni znak znotraj vrednosti
%26&Ampersand znotraj vrednosti parametra
%3D=Znak enačaja znotraj vrednosti parametra
%23#Heš, tako da ne začne fragmenta
%C3%A9éNe-ASCII znak kot njegovi UTF-8 bajtiEnojni znak se lahko spremeni v dve, tri ali štiri skupini procentov.

Polja CSV

5

RFC 4180: zapiši polje, nato podvoji kateri koli navedek znotraj. Povratnice ne pomenijo nič.

EscapiranjePomeniKdaj to potrebuješV kontekstu
"""Navedek znotraj navedka — ga podvoji"say ""hi"""
"a,b",Polje, ki vsebuje ločilnik — zapiši polje
"a b"U+000APolje, ki vsebuje prelom vrstice — zapiši polje
" a" Ohrani začetne ali zadnje presledkeNekvotiran, mnogi parserji jih odkrijejo.
'=SUM(A1)=Zaustavite preglednico, da ne izvaja celice kot formuleVelja za vrednosti, ki se začnejo z =, +, - ali @. To je injiciranje formule.

SQL dobesedni in identifikatorji

6

Preberi te; jih ne pisi. Uporabi parameterske poizvedbe namesto tega.

EscapiranjePomeniKdaj to potrebuješV kontekstu
'''Navedek znotraj dobesednega niza — ga podvoji'O''Brien'
"order"orderRezervirana beseda, ki se uporablja kot ime stolpcaDvojni navedki so standard; SQL Server uporablja [oklepaje].
`order`orderEnako kot v MySQL in MariaDB
\%%Dobesedni % znotraj vzorca LIKE
\__Dobesedni _ znotraj vzorca LIKE
$tag$ … $tag$'Citiranje dolarja PostgreSQL — sploh ni escapiranja znotrajKoristno za telesa kode, kjer podvojitev vsakega navedka ni berljivo.

Argumenti lupine

6

Enojni navedki so dobesedni, dvojni navedki še vedno razširjajo spremenljivke.

EscapiranjePomeniKdaj to potrebuješV kontekstu
'…'$ ` \Vse znotraj je dobesednoNajvarnejše citiranje tam — vendar ne more vsebovati enojnega navedka.
"…"* ? spaceGlobus in presledki so varni, spremenljivke še vedno razširjajoAlways quote variables: "$var", never bare $var.
\ Presledek v nenavedku imenu datoteke
\$$Dobesedni znak dolarja znotraj dvojnih navedkov
\``Dobesedna povratnica, ne zamenjava ukaza
'\'''Enojni navedek znotraj enojno navedka nizaZapri, escapiraj, ponovno odpri — ni načina, da bi ga direktno ugniezdil.

FAQ

Zakaj se moj JSON zlomi na poti Windows datoteke?
Ker povratnica začne zaporedje escapiranja v JSON nizu, je C:\dir branje kot C, potem neveljavno escapiranje. Pravilno napisana vrednost je "C:\\dir" — dve povratnici v datoteki, ena v razčlenjeni vrednosti. Naprej poševnice prav tako delujejo na Windowsih in se popolnoma izognejo težavi.
Ali je %20 ali + pravilna za presledek v URL-ju?
Obe, na različnih mestih. %20 je pravilna kjerkoli v URL-ju. Znak plus pomeni presledek le v nizu poizvedbe kodiranem kot application/x-www-form-urlencoded — v segmentu poti je dobesedni plus. Uporabi %20, ko si negotov, ker je pravilna povsod.
Kako dam navedek znotraj polja CSV?
Zapiši polje v navedke in podvoji notranji: "say ""hi""". To je RFC 4180 in je razlog, zakaj CSV poln podvojenih navedkov ni pokvarjen. Povratnica ne pomeni ničesar za skladni parser CSV.
Kaj je vodilni apostrof v vrstici formule CSV?
Nevtralizira injiciranje formule. Celica, ki se začne z =, +, - ali @, se izvede kot formula, ko je datoteka odprta v preglednici, zato vrednost, kot je =SUM(A1) iz neverodostojnega vira, postane koda. Predpona apostrofa sili celico, da se prebere kot besedilo.
Ali bi moral SQL escapirati ročno?
Ne. Podvojitev navedka je dokumentirana tukaj, ker moraš prebrati escaped SQL, ne zato ker bi ga moral pisati — uporabi parameterske poizvedbe in pusti vozaču, da se ravna z vrednostjo. Ročno escapiranje je tisto, od koder izvira injiciranje SQL, in ni različice, ki bi bila varna s pregledovanjem.