Pojmenujte bezprostřední cíl
Předpokládejme, že hodnota vyhledávání je A&B „C“. V komponentě URL dotazu by ampersand normálně odděloval parametry, takže musí být zakódován jako součást hodnoty před sestavením řetězce dotazu. V textu HTML může ampersand uvádět odkaz na znak a ostrá závorka může zavádět označení. Uvozovky a zpětná lomítka uvnitř řetězcového literálu JavaScriptu mají svou vlastní syntaxi. Toto jsou tři odlišné kontexty analýzy. Výstup bezpečný pro jednoho není automaticky bezpečný pro dalšího. Produkční aplikace by měla používat kontextová rozhraní API a šablony platformy, spíše než sestavovat značky zřetězením.
Vypracujte první hranici
Pokud je klíč dotazu q, zakódujte hodnotu jako jednu komponentu URL a poté ji umístěte za q=. Ampersand se změní na %26 a uvozovky jsou reprezentovány podle pravidel kodéru URL. Kódování celé hotové adresy URL, jako by to byla hodnota, by také zakódovalo její strukturální interpunkci a vytvořilo by nesprávnou adresu. Pokud je výsledná adresa URL zobrazena jako text odkazu na stránce HTML, textový uzel pak potřebuje reprezentaci bezpečnou pro HTML. Pokud je umístěn v atributu HTML, použijte serializátor bezpečný pro atributy, který má svá vlastní pravidla pro citování.
- Původní hodnota: A&B „C“
- Komponenta URL: zakódovat vyhrazené znaky
- HTML nebo JavaScript: escapovat pro daný cíl
Nedělejte z JavaScriptu transportní formát
Skript může potřebovat uložit původní hodnotu do literálu v uvozovkách, který vyžaduje escapování řetězce JavaScriptu. Jde o problém se zdrojovým kódem, nikoli o náhradu za kódování komponent URL nebo kódování výstupu HTML. Vyvarujte se umístění nedůvěryhodného vstupu přímo do vloženého zdroje skriptu; použití atributů dat nebo elementu skriptu s pečlivě serializovaným JSON může být bezpečnější, když je implementováno udržovanými frameworky. Nástroj MultiVerto JavaScript escape ilustruje znaky typu řetězec-doslova, ale nemůže potvrdit, že celá aplikace je bezpečná proti vložení skriptu. Zabezpečení závisí na skutečném kontextu analyzátoru a okolním kódu.
Dekódujte v opačném pořadí
Na přijímací straně analyzátor URL extrahuje q a procento dekóduje komponentu jednou. Analyzátor HTML zpracovává entity při vytváření svého dokumentu; prohlížeč nedekóduje procenta běžný text jen proto, že se objeví na stránce. JavaScript interpretuje své vlastní doslovné escape, když analyzuje zdrojový kód. Použití nesprávného dekodéru může zanechat viditelné sekvence, jako je %26, nebo vytvořit data, která jsou pak interpretována jako syntaxe v jiném kontextu. Uchovávejte původní nezpracovanou hodnotu odděleně od každé serializované reprezentace, aby se zobrazení pro uživatele náhodně nestalo dalším vstupem zpracování.
Kontrolní seznam pro kontrolu skutečné aplikace
Nakreslete cestu od zdrojové hodnoty ke komponentě URL, poté k HTML textu nebo atributu a teprve potom k jakémukoli použití skriptu. U každé šipky vyberte rozhraní API pro tento přesný cíl a otestujte znaky, jako je ampersand, uvozovka, znaménko menší než a písmena jiná než ASCII. Zkontrolujte konečnou vykreslenou stránku a výslednou analyzovanou adresu URL, nikoli pouze přechodný zakódovaný řetězec. Escape neuděluje důvěryhodnost ani neověřuje cíl odkazu; mohou být stále vyžadovány samostatné kontroly zásad. Propojené převodníky pomáhají demonstrovat každou vrstvu na malém vzorku předtím, než ji implementujete do rámce.
Při ladění si pro každý krok zapište surovou hodnotu a to, který parser ji zpracuje jako další. Potom zkontrolujte výsledek v nástrojích pro vývojáře: hodnotu parametru URL, textový uzel stránky a případný řetězec JavaScriptu. Pokud už některý krok vrátil dekódovanou hodnotu, nepoužívejte na ni automaticky další dekodér. Tento postup je důležitý zejména při předávání odkazu mezi šablonou a skriptem.