Přeskočit na obsah

Sekvence úniků

Téměř každá chyba únikového sekvence je chyba kontextu spíše než chyba syntaxe. Znak je znám — uvozovka, zpětné lomítko, ampersand — a nejasné je, která ze šesti konfliktních pravidel se uplatní tam, kde se má řetězec přistát.

Tato tabulka je uspořádána podle kontextu, ne podle znaku. Stejná uvozovka je zdvojnásobena v buňce CSV, uvozena zpětným lomítkem v JSON, převedena na " v HTML a zcela ponechána samotná uvnitř jednoduchých uvozovek v shellu. Čtyři řádky, čtyři pravidla, jeden znak.

Pravidlo, které má největší význam, je to, na které se lidé snaží naposledy: utíkejte na hranici, kterou hodnota překračuje, a utečte ji jednou. Text, který je uvádě́n dvakrát — & ve zdroji stránky, \\n v souboru výstup — je podpisem hodnoty, která prošla dvěma kodéry, které každý předpokládal, že je první.

Řetězce JSON

10

JSON umožňuje přesně tyto úniky. Doslova nový řádek nebo karta uvnitř řetězce je neplatná.

EscapeZnamenáKdy jej potřebujeteV kontextu
\""Dvoje uvozovky uvnitř řetězce"say \"hi\""
\\\Doslova zpětné lomítkoDůvod, proč se cesty Windows porouchají JSON."C:\\dir"
\//Lomítko — volitelnéPrávní, ale zbytečné; zvyk z vkládání JSON do <script> značky."a\/b"
\nU+000AInformační řádek"line\nline"
\rU+000DVrácení vozíku
\tU+0009Tabulátor
\bU+0008Backspace
\fU+000CFormulář informační podavač
\u00e9éLibovolný znak jeho čtyřciferným bodem kódu"caf\u00e9"
\ud83d\ude00😀Znak nad U+FFFF, jako pár surrogátuJSON nemá \u{…} formu, takže astrální znaky trvají dva úniky.

Řetězce JavaScript

10

Nadmnožina JSON, plus úniky literálu šablony.

EscapeZnamenáKdy jej potřebujeteV kontextu
\''Jedná se o jednoduchou uvozovku v jednoduché-quoted řetězci
\""Dvoje uvozovky uvnitř řetězce v dvojitých uvozovkách
\``Zpětné akutko uvnitř literálu šablony
\${${Doslova ${} uvnitř literálu šablonyBez zpětného lomítka to spouští interpolaci.
\nU+000AInformační řádek
\xe9éZnak dva hex číslice, až do U+00FF
\u00e9éZnak čtyřcifrou hex
\u{1f600}😀Libovolný bod kódu, ať je jakákoliv dlouháNepotřebuje pár surrogátu, na rozdíl od čtyřciferné formy.
\0U+0000Nulový znak
\u2028U+2028Oddělovač řádkůPlatné v řetězci JS, ale ne v JSON — klasické porušení JSONP.

Text a atributy HTML

8

Pouze & a < přísně musí být uvozeny v textu; uvozovky mají záležitost uvnitř atributů.

EscapeZnamenáKdy jej potřebujeteV kontextu
&amp;&AmpersandUtěkněte tento nejprve, nebo se každý jiný únik zdvojnásobí.
&lt;<Znaménko menší než, takže nespouští značku
&gt;>Znamení větší než
&quot;"Dvoje uvozovky uvnitř atributu
&#39;'Jednu uvozovku v atributu&apos; funguje také v HTML5, ale číselná forma je bezpečná všude.
&nbsp;U+00A0Bez přerušení mezery
&#233;éLibovolný znak desetinným bodem kódu
&#xE9;éLibovolný znak šestnáctkovým bodem kódu

Adresy URL (procento-kódování)

9

Které znaky potřebují únik, závisí na jejich části adresy URL.

EscapeZnamenáKdy jej potřebujeteV kontextu
%20 Mezera, platná kdekoli v URL
+ Mezera, ale pouze v řetězci dotazu zakódovaném formulářem.V segmentu cesty je doslova plus znaménko.
%25%Doslova znaménko procentaPokud to vynecháte a hodnota dvakrát dekóduje.
%2F/Lomítko uvnitř jednoho segmentu cesty
%3F?Otazník uvnitř hodnoty
%26&Ampersand uvnitř hodnoty parametru
%3D=Rovnítko uvnitř hodnoty parametru
%23#Hash, takže nespouští fragment
%C3%A9éZnak bez ASCII jako jeho bajtů UTF-8Jeden znak se může stát dvěma, třemi nebo čtyřmi skupinami procent.

Pole CSV

5

RFC 4180: citujte pole, poté zdvojnásobte jakoukoli uvozovku uvnitř. Zpětná lomítka znamená nic.

EscapeZnamenáKdy jej potřebujeteV kontextu
"""Uvozovka uvnitř citovaného pole — zdvojnásobte ji"say ""hi"""
"a,b",Pole obsahující oddělovač — citujte pole
"a b"U+000APole obsahující zalomení řádku — citujte pole
" a" Zachovejte přední nebo koncové mezeryBez uvozovek mnoho parserů oříznout.
'=SUM(A1)=Zastavit tabulkový procesor provádí buňku jako vzorecPlatí pro hodnoty počínaje =, +, - nebo @. Toto je injekce vzorce.

Literály a identifikátory SQL

6

Čtěte je; ne je psát. Místo toho používejte parametrizované dotazy.

EscapeZnamenáKdy jej potřebujeteV kontextu
'''Jednu uvozovku v řetězcovém literálu — zdvojnásobte ji'O''Brien'
"order"orderVyhrazené slovo používáno jako název sloupceDvoje uvozovky jsou standard; SQL Server používá [hranaté závorky].
`order`orderStejné v MySQL a MariaDB
\%%Doslova % uvnitř vzoru LIKE
\__Doslova _ uvnitř vzoru LIKE
$tag$ … $tag$'PostgreSQL dolar citování — bez úniku v celkuUžitečné pro těla kódu, kde zdvojnásobování každé uvozovky je nečitelné.

Argumenty Shell

6

Jednoduché uvozovky jsou doslova, dvojité uvozovky se stále rozšiřují proměnné.

EscapeZnamenáKdy jej potřebujeteV kontextu
'…'$ ` \Všechno uvnitř je doslovaNejbezpečnější citování — ale nemůže obsahovat jednu uvozovku.
"…"* ? spaceGlobs a mezery jsou bezpečné, proměnné se stále rozšiřujíAlways quote variables: "$var", never bare $var.
\ Mezera v neuvozovaném názvu souboru
\$$Doslova znak dolaru uvnitř dvojitých uvozovek
\``Doslova backtick, ne substituce příkazů
'\'''Jednu uvozovku v jednoduchých uvozovkáchZavřít, utéct, znovu otevřít — neexistuje způsob, jak jej přímo vnořit.

Časté dotazy

Proč se můj JSON porouchá na cestu k souboru Windows?
Protože zpětné lomítko spouští sekvenci úniků v řetězci JSON, takže C:\dir je čteno jako C, poté neplatný únik. Správně napsaná hodnota je "C:\\dir" — dva zpětné lomítka v souboru, jeden v analyzovaném řetězci. Vpředu bez problému na Windows také a vyhnout se problému úplně.
Je %20 nebo + správné pro mezeru v URL?
Obojí, na různých místech. %20 je správné kdekoli v URL. Znaménko plus znamená mezeru pouze uvnitř dotazovacího řetězce zakódovaného jako application/x-www-form-urlencoded — v segmentu cesty je doslova plus. Když si nejste jisti, použijte %20, protože je to správné všude.
Jak vložím uvozovku do pole CSV?
Zabalte pole do uvozovek a zdvojnásobte vnitřní: "say ""hi""". To je RFC 4180 a je to důvod, proč soubor CSV plný zdvojených uvozovek není poškozen. Zpětné lomítko nic nedělá odpovídajícímu parseru CSV.
Jaký je úvodní apostrof v řádku vzorce CSV?
Rozptýlí injekci vzorce. Buňka začínající na =, +, - nebo @ je provedena jako vzorec, když je soubor otevřen v tabulkovém kalkulátoru, takže hodnota jako =SUM(A1) z nedůvěryhodného zdroje se stane kódem. Předponování apostrof vynutí čtení buňky jako textu.
Měl bych SQL utíkat ručně?
Ne. Zdvojnásobení uvozovky je zdokumentováno zde, protože musíte číst uvozený SQL, ne protože byste měli psát — používejte parametrizované dotazy a nechte ovladač zpracovat hodnotu. Ruční únik je odkud pochází injekce SQL a neexistuje verze, která by byla bezpečná inspekcí.