Preskoči na sadržaj

Niz za izlazne sekvence

Gotovo svaka greška u zaštiti je greška konteksta, a ne greška sintakse. Znak je poznat — navodnik, obrnuta kosa crta, ampersand — i ono što je nejasno je koja od šest konfliktnih pravila se primjenjuje gdje je niz spremna da sleti.

Dakle, ova tablica je organizirana po kontekstu, a ne po znaku. Isti navodnik se udvostručava u CSV ćeliji, zaštićen obrnutom kosom crtom u JSON-u, pretvara se u " u HTML-u i ostavlja potpuno sam unutar pojedinačnih navodnika u ljusci. Četiri reda, četiri pravila, jedan znak.

Pravilo koje je najvažnije je ono koje ljudi dosežu zadnje: zaštiti na granici vrijednost prelazi, i zaštiti je jednom. Tekst koji je zaštićen dvaput — & u izvoru stranice, \\n u izlaznoj datoteci — je potpis vrijednosti koja je prošla kroz dva kodera koji su svaki pretpostavili da su prvi.

JSON nizovi

10

JSON dozvoljava točno ti escapes. Doslovna nova linija ili tab unutar niza je nevaljana.

EscapeZnačiKada vam trebateU kontekstu
\""Dvostruki navodnik unutar niza"say \"hi\""
\\\Doslovna obrnuta kosa crtaRazlog zašto Windows putanja prekida JSON."C:\\dir"
\//Kosa crta unaprijed — neobaveznaZakonito ali nepotrebno; navika od ugrađivanja JSON-a u <script> oznake."a\/b"
\nU+000AHranjenje linije"line\nline"
\rU+000DPovratak kretanja
\tU+0009Kartica
\bU+0008Povratak za leđa
\fU+000COblik hranjenja
\u00e9éBilo koji znakovi po njegovoj četirovedbrojnoj kodnoj točki"caf\u00e9"
\ud83d\ude00😀Znakovi iznad U+FFFF, kao par zamjenikaJSON nema \u{…} oblika, pa astralni znakovi trebaju dva escapes.

JavaScript nizovi

10

Nadskup JSON-a, plus template-literal escapes.

EscapeZnačiKada vam trebateU kontekstu
\''Pojedinačni navodnik unutar niza u pojedinim navodnicima
\""Dvostruki navodnik unutar niza u dva navodnika
\``Obrnuta kosa crta unutar template literala
\${${Doslovna ${ unutar template literalaBez obrnute kose crte počinje interpolacija.
\nU+000AHranjenje linije
\xe9éZnakovi po dva heksadecimalna znamenka, do U+00FF
\u00e9éZnakovi po četiri heksadecimalne znamenke
\u{1f600}😀Bilo koja kodna točka, koliko god dugoNije potreban par zamjenika, za razliku od oblika s četiri znamenke.
\0U+0000Nulti znakovi
\u2028U+2028Razdelnika linijaValjano u JS nizu ali ne u JSON-u — klasična JSONP prekida.

HTML tekst i atributi

8

Samo & i < strogo se trebaju zaštititi u tekstu; navodnike je važno unutar atributa.

EscapeZnačiKada vam trebateU kontekstu
&amp;&AmpersandZaštiti ovo prvo, ili će se svaki drugi escape udvostručiti.
&lt;<Manji od znaka, pa on ne počinje oznaku
&gt;>Veći od znaka
&quot;"Dvostruki navodnik unutar atributa
&#39;'Pojedinačni navodnik unutar atributa&apos; također radi u HTML5-u, ali numerički oblik je sigurniji svugdje.
&nbsp;U+00A0Razmak bez prekida
&#233;éBilo koji znakovi po njegovoj decimalnoj kodnoj točki
&#xE9;éBilo koji znakovi po njegovoj heksadecimalnoj kodnoj točki

URL-ovi (kodiranje postotaka)

9

Koji znakovi trebaju zaštiti ovisi o dijelu URL-a gdje sjede.

EscapeZnačiKada vam trebateU kontekstu
%20 Razmak, valjano bilo gdje u URL-u
+ Razmak, ali samo u nizu kodiranom obrascem upitaU segmentu puta je to doslovno plus znak.
%25%Doslovna znamenka postotakaPropustite to i vrijednost se dekodira dva puta.
%2F/Kosa crta unutar jednog segmenta puta
%3F?Znak upitnika unutar vrijednosti
%26&Ampersand unutar vrijednosti parametra
%3D=Znak jednakosti unutar vrijednosti parametra
%23#Heš, pa on ne počinje fragment
%C3%A9éZnakovi ne-ASCII, kao njegove UTF-8 bajtoveJedan znakovi može postati dvije, tri ili četiri grupe postotaka.

CSV polja

5

RFC 4180: citirajte polje, zatim udvostručite bilo koji navodnik unutar njega. Obrnute kose crte znače ništa.

EscapeZnačiKada vam trebateU kontekstu
"""Navodnik unutar navedenog polja — udvostručite ga"say ""hi"""
"a,b",Polje koje sadrži ograničnik — citirajte polje
"a b"U+000APolje koje sadrži prijelom reda — citirajte polje
" a" Čuvaj vodeće ili zaostale razmakeNekotirani, mnogi parseri ih podreže.
'=SUM(A1)=Zaustavite proračunsku tablicu izvršavanja ćelije kao formulePrimjenjuje se na vrijednosti koje započinju =, +, - ili @. Ovo je injekcija formule.

SQL doslici i identifikatori

6

Pročitajte te; ne pišite ih. Koristite parametrizirane upite umjesto.

EscapeZnačiKada vam trebateU kontekstu
'''Navodnik unutar niza doslici — udvostručite ga'O''Brien'
"order"orderRezervirana riječ koja se koristi kao naziv stupcaDvostruki navodnnici su standard; SQL Server koristi [zagrade].
`order`orderIsta u MySQL-u i MariaDB-u
\%%Doslovna % unutar LIKE obrasca
\__Doslovna _ unutar LIKE obrasca
$tag$ … $tag$'PostgreSQL dolar navođenja — bez zaštite unutar sveKorisno za tijela koda, gdje udvostručavanje svakog navodnika nije čitljivo.

Argumenti ljuske

6

Pojedinačni navodnnici su doslovno, dvostruki navodnnici se još uvijek proširuju varijabli.

EscapeZnačiKada vam trebateU kontekstu
'…'$ ` \Sve unutar je doslovnoNajsigurnije navođenja — ali ne može sadržavati pojedinačni navodnik.
"…"* ? spaceGlobs i razmaci su sigurni, varijabli se još uvijek proširujuAlways quote variables: "$var", never bare $var.
\ Razmak u datoteki bez navodnika
\$$Doslovna znamenka dolara unutar dvostruku navodnika
\``Doslovna obrnuta kosa crta, ne zamjena naredbe
'\'''Pojedinačni navodnik unutar niza u pojedinim navodnicimaZatvori, zaštiti, ponovno otvori — nema načina da ga ugniježdiš izravno.

FAQ

Zašto se moj JSON prekida na Windows putanju datoteke?
Jer obrnuta kosa crta započinje niz za izlazne sekvence u JSON nizu, pa se C:\dir čita kao C, zatim nevaljana niz. Ispravno napisano vrijednost je "C:\\dir" — dvije obrnute kose crte u datoteci, jedna u analiziranome nizu. Kose crte unaprijed rade na Windows-u i izbjegavaju problem potpuno.
Je li %20 ili + ispravno za razmak u URL-u?
Oboje, na različitim mjestima. %20 je ispravno bilo gdje u URL-u. Znak plus znači razmak samo unutar niza upita kodiranog kao application/x-www-form-urlencoded — u segmentu puta to je doslovno plus. Koristite %20 kada niste sigurni, jer je ispravno svugdje.
Kako staviti navodnik unutar CSV polja?
Umotajte polje u navodnike i udvostručite unutarnji: "reci ""bok""". To je RFC 4180, i to je razlog zašto CSV pun udvostručenih navodnika nije korumpiran. Obrnuta kosa crta znači ništa konformnom CSV parseru.
Što je vodeći apostrof u redu CSV formule?
On razobličava injekciju formule. Ćelija koja započinje s =, +, - ili @ se izvršava kao formula kada se datoteka otvori u proračunskoj tablici, pa vrijednost kao =SUM(A1) iz nepouzdanog izvora postaje kod. Dodavanje apostrofa u prednoslov prisiljava ćeliju da se čita kao tekst.
Trebam li ručno zaštititi SQL?
Ne. Udvostručavanje navodnika je dokumentirano ovdje jer trebate čitati zaštićeni SQL, a ne zato što ga trebate pisati — koristite parametrizirane upite i pustite upravljač da obradi vrijednost. Ručna zaštita je odakle dolazi SQL injekcija, i nema verzije toga koja je sigurna prema pregledu.