Proč jsou bezpečnostní zásady v JavaScriptu kritické
JavaScript je nejrozšířenějším jazykem webu i backendu (Node.js). Jeho výhoda – flexibilita a bohatý ekosystém – je zároveň zdrojem rizik: útoky XSS, znečištění prototypu, kompromitace dodavatelského řetězce v npm, chyby CORS či zneužití postMessage. Tento článek shrnuje ucelené zásady pro bezpečnou tvorbu frontendu i backendu v JavaScriptu, včetně doporučení pro rámce, nástroje a provozní praxi.
Hrozby v JavaScriptu: rychlý přehled
- XSS (Cross-Site Scripting) – odražené, uložené a založené na DOM; nejčastější příčina kompromitace účtů a dat.
- Clickjacking – vložení stránky do cizího rámce a přinucení uživatele k provedení akce.
- CSRF – zneužití relace k provedení akce bez vědomí uživatele.
- Prototype Pollution – modifikace
Object.prototypeneboArray.prototypes dalekosáhlými důsledky. - ReDoS – regulární výrazy s kvadratickou či exponenciální složitostí.
- Útoky na dodavatelský řetězec – škodlivé balíčky v npm, převzetí účtů, záměna závislostí.
- Nesprávná správa tajemství – klíče v repozitáři, v JS bundlu či v
localStorage.
Prevence XSS na frontendu
- Nepoužívejte
innerHTMLpro neověřený obsah; upřednostňujte textová API (textContent, vlastnosti atributů) a šablonovací engine s automatickým escapováním. - Sanitace vstupů – pokud potřebujete vykreslovat HTML, použijte prověřené sanitizéry (např. seznam povolených značek a atributů). Vyhněte se vlastním filtrům založeným na regex.
- Content Security Policy (CSP) – nastavte
default-src 'self',script-srcs nonces/hashes a zakažte'unsafe-inline'a'unsafe-eval'(viz také Trusted Types níže). - Trusted Types – v prohlížečích, které tuto funkci podporují, vynucujte
require-trusted-types-for 'script'a vytvářejte bezpečné zásady (policy) pro transformaci HTML. - Šablony a knihovny uživatelského rozhraní – React, Vue a Svelte provádějí automatické escapování; neobcházejte ho (např. pomocí React
dangerouslySetInnerHTML) bez sanitace.
Clickjacking a izolace kontextu
- Frame-Options / CSP – použijte
X-Frame-Options: DENYneboSAMEORIGIN, případně direktivuframe-ancestorsv CSP. - Ochrana uživatelského rozhraní – neumisťujte kritická tlačítka pod překryvné vrstvy; detekujte klíčové události a viditelnost.
- Oddělení administrace – administrační rozhraní poskytujte z jiné domény či subdomény s přísnou CSP.
CSRF a správa relace v prohlížeči
- Cookies SameSite – označte relaci atributy
SameSite=LaxneboStrict,HttpOnlyaSecure. - CSRF tokeny – generujte je pro každou relaci nebo každý požadavek a ověřujte je; u požadavků fetch přidávejte hlavičku z JS pouze pro stejné původy.
- Nepoužívejte
localStoragepro přístupové tokeny; upřednostňujte cookiesHttpOnlys krátkou expirací a rotací.
CORS a přístup k API
- Omezený
Access-Control-Allow-Origin– u chráněných zdrojů s cookies nebo autorizačními hlavičkami nikdy nepovolujte*. - Preflight – explicitně definujte
Access-Control-Allow-Methodsa-Headers, povolené hodnoty omezte na minimum. - Oddělte veřejná a privilegovaná API – použijte různé domény či subdomény a různé zásady CORS.
Bezpečné používání postMessage, iframe a Workerů
- Ověřujte
originv přijímajícím posluchači; nikdy nepřijímejte zprávy bez kontroly původu. - Sandbox pro iframe – použijte atribut
sandboxs minimálním počtem oprávnění (allow-scriptspovolte pouze tehdy, je-li to nutné). - Web Workers – nepředávejte jim tajemství; používejte structured clone a ověřujte data.
Subresource Integrity a třetí strany
- SRI – u externích skriptů použijte atributy
integrityacrossorigin. - Omezení používání služeb třetích stran – měřicí a marketingové skripty spouštějte prostřednictvím sandboxovaného iframe či správce značek se zásadami CSP.
- Kontrola oprávnění – neposkytujte třetím stranám přístup k citlivým prvkům DOM nebo k API.
Trusted Types a přísnější CSP v praxi
- Trusted Types – vytvořte centrální zásadu (policy), která jako jediná transformuje HTML/URL/Script a zajišťuje sanitaci.
- CSP založená na nonce – pro každý požadavek generujte náhodný nonce a přidávejte ho pouze k povoleným skriptům.
- Zákaz
evalanew Function– nastavte CSPscript-srcbez'unsafe-eval'a refaktorujte šablony na bezpečné varianty.
Kryptografie v prohlížeči: Web Crypto API
- Nepoužívejte vlastní kryptografii v čistém JS; upřednostňujte Web Crypto API a ověřené režimy.
- Neuchovávejte klíče v JS – citlivé operace provádějte na serveru; v prohlížeči provádějte pouze méně citlivé transformace.
Service Worker a zabezpečení cache
- Rozsah – omezte rozsah registrace na nejnutnější minimum; seznam souborů pro přednačtení spravujte explicitně.
- Ověřujte odpovědi – odpovědi obsahující citlivá data neukládejte do cache bez správně nastavených hlaviček
Cache-ControlaVary. - Aktualizace – implementujte bezpečný proces aktualizace (update flow) a návrat k předchozí verzi.
Node.js na backendu: základy zabezpečení
- HTTP hlavičky – použijte middleware pro bezpečnostní hlavičky prohlížeče, například pro CSP, HSTS, X-Content-Type-Options a Referrer-Policy.
- Validace vstupů – používejte validátory a sanitizéry; nikdy nepředpokládejte formát vstupů.
- Šifrování a hashování hesel – používejte Argon2 či bcrypt s odpovídající hodnotou cost; nevytvářejte vlastní algoritmy.
- Omezování počtu požadavků a detekce anomálií – chraňte se proti útokům hrubou silou a zneužití API.
- Bezpečnost šablon – používejte serverové šablony s automatickým escapováním; vyhýbejte se neověřeným pomocným funkcím.
Node.js: rizika modulů a provozní bezpečnost
- Vyhýbejte se
child_process,vma dynamickémurequirepři zpracování neověřených dat. - ReDoS – omezte délku vstupů, používejte bezpečné regulární výrazy a knihovny pro detekci složitosti.
- Path traversal – nikdy nespojujte cesty odvozené z uživatelských vstupů bez normalizace a seznamu povolených hodnot.
- Bezpečné JSON a YAML – parsujte je v bezpečných režimech; nevyhodnocujte kód z konfiguračních souborů.
Prototype Pollution: prevence a detekce
- Nepoužívejte nebezpečné hluboké slučování (deep-merge) neověřených dat; filtrujte klíče jako
__proto__,constructoraprototype. - Neměnnost – upřednostňujte neměnné slučování struktur; používejte ověřené nástroje.
- Sandbox – nezpřístupňujte interní objekty knihovnám s neznámou pověstí.
Správa tajemství a konfigurací
- Žádná tajemství v klientském JS – vše, co je součástí bundlu, je veřejné.
- Tajemství na serveru – čerpejte je z úložišť tajemství; neukládejte klíče do souboru .env v repozitáři.
- Rotace a princip minimálních oprávnění – používejte tokeny s krátkou dobou platnosti, omezené rozsahy oprávnění a izolaci služeb.
JWT, OAuth/OIDC a správa relací
- Krátká doba platnosti a rotace obnovovacích tokenů; ukládejte je do cookie
HttpOnly. - Podpis a algoritmy – nepovolujte
alg=none, ověřujtekidi načítání klíče. - Audience/issuer – důsledně ověřujte claimy a segmentujte klienty.
Bezpečnost dodavatelského řetězce v npm
- Připnutí verzí a lockfile – zajistěte deterministické sestavení a kontrolujte shasum.
- Audit závislostí – provádějte průběžné skenování, blokujte známé CVE a sledujte skripty postinstall.
- Minimální ekosystém – instalujte pouze to, co používáte; upřednostňujte menší, udržované knihovny.
- Původ a podpisy – ověřujte původ balíčků; u citlivých projektů používejte interní registry.
Bezpečnostní testování a statická analýza
- Linting – používejte pravidla zaměřená na bezpečnost (např. zákaz
evala detekci nebezpečných API). - SAST/DAST – integrujte je do CI; blokujte vydání s kritickými nálezy.
- Unit a e2e testy – testujte negativní scénáře, neplatné vstupy a hraniční hodnoty.
Provozní zásady: logování, monitoring, telemetrie
- Bez osobních údajů v logách – citlivé údaje maskujte; nastavte zásady uchovávání dat a přístupová práva.
- Detekce anomálií – sledujte chování klienta (náhlé změny User-Agentu, geolokace) i API (četnost požadavků, chyby ověřování).
- Upozorňování – nastavte prahové hodnoty pro hlášení CSP-XSS, koncové body pro hlášení porušení CSP a změny integrity zdrojů.
Výkon vs. bezpečnost: pragmatická rovnováha
- Sestavování balíčků a izolace – používejte code splitting a oddělujte administrační panel; zmenšíte tím plochu útoku.
- Bez vložených skriptů – CSP s nonce přispívá k lepšímu cachování i bezpečnosti.
- Minimalizace oprávnění – knihovnám a komponentám poskytujte pouze data a možnosti, které potřebují.
Kontrolní seznam pro bezpečný JavaScript
- Žádné
innerHTML/evalpro neověřená data; automatické escapování a sanitace. - CSP s nonce/hash, Trusted Types, SRI pro třetí strany.
- Cookies:
HttpOnly,Secure,SameSite; žádné tokeny vlocalStorage. - Omezené CORS, oddělené domény pro citlivé části.
- Bezpečná komunikace pomocí postMessage (kontrola
origin), sandbox pro iframy. - Node.js: validace vstupů, omezování počtu požadavků, bezpečné šablony, žádné nebezpečné použití exec.
- Ochrana před Prototype Pollution a ReDoS, bezpečné slučování a práce s regulárními výrazy.
- Dodavatelský řetězec: připnutí verzí, audit, minimum závislostí, kontrola skriptů postinstall.
- Bezpečná správa tajemství a rotace klíčů.
- CI/CD se SAST/DAST a blokováním vydání při kritických nálezech.
Plán zlepšování (0–30–90 dní)
- 0–30 dní – aktivujte CSP (minimálně v režimu report-only), zakažte
eval, proveďte audit skriptů třetích stran a přesuňte tokeny do cookiesHttpOnly. - 30–60 dní – zaveďte Trusted Types, SRI, restriktivní CORS, validaci vstupů na serveru i klientu a testování XSS/CSRF.
- 60–90 dní – zaveďte CI se SAST/DAST, kontrolu dodavatelského řetězce, rotaci tajemství a monitoring hlášení CSP a anomálií.
Závěr
Bezpečnost JavaScriptu nevzniká jediným opatřením, ale kombinací architektonických principů, disciplinovaného programování a provozních kontrol. Dodržování uvedených zásad významně snižuje riziko XSS, CSRF, kompromitace dodavatelského řetězce i zranitelností backendu. Investice do CSP, Trusted Types, kvalitní validace vstupů, bezpečné správy relací a průběžného auditu kódu se vrací v podobě spolehlivých a důvěryhodných aplikací.
