Proč jsou bezpečnostní zásady v JavaScriptu kritické
JavaScript je nejrozšířenější jazyk webu i backendu (Node.js). Jeho výhoda – flexibilita a bohatý ekosystém – je zároveň zdrojem rizik: útoky XSS, prototypové znečištění, supply-chain kompromitace 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 DOM-based; nejčastější příčina kompromitace účtu a dat.
- Clickjacking – vkládání stránky do cizího rámce, přinucení uživatele provést akci.
- CSRF – zneužití relace k provedení akce bez vědomí uživatele.
- Prototype Pollution – modifikace
Object.prototypeneboArray.prototypes dalekosáhlými dopady. - ReDoS – regulární výrazy s kvadratickou či exponenciální složitostí.
- Supply-chain útoky – škodlivé balíčky v npm, hijack účtů, dependency confusion.
- 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; preferujte textové API (textContent, vlastnosti atributů) a šablonovací engine s auto-escapingem. - Sanitace vstupů – při potřebě renderovat HTML použijte prověřené sanitizéry (např. whitelistování tagů a atributů). Vyhněte se domácím regex filtrům.
- Content Security Policy (CSP) – nasazujte
default-src 'self',script-srcs nonces/hashes, zákaz'unsafe-inline'a'unsafe-eval'(viz také Trusted Types níže). - Trusted Types – v prohlížečích s podporou vynucujte
require-trusted-types-for 'script'a tvořte bezpečné policy pro transformace HTML. - Šablony a UI knihovny – React, Vue, Svelte provádějí auto-escaping; neobcházejte ho (např. React
dangerouslySetInnerHTML) bez sanitace.
Clickjacking a izolace kontextu
- Frame-Options / CSP –
X-Frame-Options: DENYneboSAMEORIGIN, případněframe-ancestorsv CSP. - UI obrana – nepokládejte kritická tlačítka pod překryvné vrstvy; detekujte klíčové události a viditelnost.
- Oddělení administrace – administrativní UI servírujte z odlišné domény či subdomény s přísnou CSP.
CSRF a správa relace v prohlížeči
- SameSite cookies – relace označte
SameSite=LaxneboStrict,HttpOnly,Secure. - CSRF tokeny – generujte per-session/per-request a validujte; u fetch přidávejte hlavičku z JS pouze pro stejné původy.
- Nepoužívejte
localStoragepro přístupové tokeny; preferujteHttpOnlycookies s krátkou expirací a rotací.
CORS a přístup k API
- Restriktivní
Access-Control-Allow-Origin– nikdy nepovolujte*pro chráněné zdroje s cookies nebo autorizačními hlavičkami. - Preflight – explicitně definujte
Access-Control-Allow-Methodsa-Headers, minimalizujte povolené hodnoty. - Oddělte veřejné a privilegované API – různé domény/subdomény, různé CORS politiky.
Bezpečné používání postMessage, iframe a Workerů
- Validujte
originv přijímajícím posluchači; nikdy neakceptujte zprávy bez kontroly původu. - Sandbox pro iframe – atribut
sandboxs minimem povolení (allow-scriptspouze, co je nutné). - Web Workers – nepředávejte tajemství; používejte structured clone a validujte data.
Subresource Integrity a třetí strany
- SRI – u externích skriptů použijte
integrityacrossorigin. - Minimalizace třetích stran – měřicí a marketingové skripty spouštějte přes sandboxovaný iframe či tag manager s CSP politikami.
- Revize oprávnění – nepřidělujte třetím stranám přístup k citlivým DOM prvkům nebo API.
Trusted Types a přísnější CSP v praxi
- Trusted Types – vytvořte centrální policy, která jediná transformuje HTML/URL/Script a zajišťuje sanitaci.
- Nonce-based CSP – generujte náhodný nonce pro každý request a přidejte ho pouze k povoleným skriptům.
- Zákaz
evalanew Function– CSPscript-srcbez'unsafe-eval'a refaktor šablon na bezpečné varianty.
Kryptografie v prohlížeči: Web Crypto API
- Nepoužívejte vlastní kryptografii v čistém JS; preferujte 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 pouze méně citlivé transformace.
Service Worker a cache bezpečnost
- Scope – omezte rozsah registrace co nejužší; spravujte precache seznam explicitně.
- Ověřujte odpovědi – necacheujte odpovědi s citlivými daty bez správných
Cache-ControlaVary. - Aktualizace – implementujte bezpečný update flow a rollback.
Node.js na backendu: bezpečnostní základy
- HTTP hlavičky – použijte middleware (např. prohlížečové bezpečnostní hlavičky) pro CSP, HSTS, X-Content-Type-Options, Referrer-Policy.
- Validace vstupů – používejte validátory a sanitizéry; nikdy nepředpokládejte formát.
- Šifrování a hashování hesel – Argon2 či bcrypt s adekvátní cost; žádné vlastní algoritmy.
- Rate limiting a detekce anomálií – ochrana proti brute-force a zneužití API.
- Bezpečnost šablon – serverové šablony s auto-escapingem; vyvarujte se neověřených helperů.
Node.js: rizika modulů a operační bezpečnost
- Vyhýbejte se
child_process,vma dynamickémurequirepro neověřená data. - ReDoS – omezte délku vstupů, používejte bezpečné regexy a knihovny detekce složitosti.
- Path traversal – nikdy nespojujte cesty z uživatelských vstupů bez normalizace a whitelistu.
- Bezpečné JSON a YAML – parsujte bezpečnými režimy; nevyhodnocujte kód z konfigurací.
Prototype Pollution: prevence a detekce
- Nepoužívejte nebezpečné deep-merge na neověřená data; filtrujte klíče jako
__proto__,constructor,prototype. - Imutabilita – preferujte immutable sloučení struktur; používejte ověřené utility.
- Sandbox – nevystavujte interní objekty knihovnám s neznámou reputací.
Správa tajemství a konfigurací
- Žádná tajemství v klientském JS – vše, co je v bundlu, je veřejné.
- Serverová tajemství – čerpejte z tajných úložišť; žádné klíče v .env v repozitáři.
- Rotace a princip minimálních oprávnění – krátké TTL tokenů, scopy a izolace služeb.
JWT, OAuth/OIDC a správa relací
- Krátká expirace a rotace refresh tokenů; uložení v
HttpOnlycookie. - Podpis a algoritmy – nepovolujte
alg=none, validujtekida načítání klíče. - Audience/issuer – striktní kontrola claimů, segmentace klientů.
Supply-chain bezpečnost v npm
- Pinování verzí a lockfile – deterministické buildy; kontrola shasum.
- Audit závislostí – průběžné skeny, blokace známých CVE; sledujte postinstall skripty.
- Minimální ekosystém – instalujte jen to, co používáte; preferujte menší, udržované knihovny.
- Provenance a podpisy – ověřujte původ balíčků; interní registry pro citlivé projekty.
Bezpečnostní testování a statická analýza
- Linting – pravidla zaměřená na bezpečnost (např. zákaz
eval, detekce nebezpečných API). - SAST/DAST – integrace do CI; blokujte releasy s kritickými nálezy.
- Unit a e2e testy – testujte negativní scénáře, neplatné vstupy, hraniční hodnoty.
Provozní zásady: logování, monitoring, telemetrie
- Bez PII v logách – maskujte citlivé údaje; nastavte retenční politiku a přístupová práva.
- Detekce anomálií – sledování chování klienta (náhlé změny User-Agent, geolokace) a API (rate, chyby auth).
- Alerting – prahy pro XSS-CSP reporty, CSP violation endpointy a změny integrity zdrojů.
Výkon vs. bezpečnost: pragmatická rovnováha
- Bundling a izolace – code splitting, oddělení admin panelu; menší attack surface.
- Bez inline skriptů – lepší cache i bezpečnost díky CSP s nonce.
- Minimalizace práv – knihovnám a komponentám dávejte pouze data a capability, které potřebují.
Checklist pro bezpečný JavaScript
- Žádné
innerHTML/evalpro neověřená data; auto-escaping a sanitace. - CSP s nonce/hash, Trusted Types, SRI pro třetí strany.
- Cookies:
HttpOnly,Secure,SameSite; žádné tokeny vlocalStorage. - CORS restriktivní, oddělené domény pro citlivé části.
- Bezpečná komunikace postMessage (kontrola
origin), sandbox iframů. - Node.js: validace vstupů, rate limiting, bezpečné šablony, žádné nebezpečné exec.
- Ochrana před Prototype Pollution a ReDoS, bezpečné merge a regex praktiky.
- Supply-chain: pinování, audit, minimum závislostí, kontrola postinstall.
- Bezpečná správa tajemství a rotace klíčů.
- CI/CD s SAST/DAST a blokací releasů při kritických nálezech.
Roadmapa zlepšování (0–30–90 dní)
- 0–30 dní – aktivujte CSP (minimálně report-only), zakažte
eval, auditujte third-party skripty, přesuňte tokeny doHttpOnlycookies. - 30–60 dní – zaveďte Trusted Types, SRI, restriktivní CORS, validaci vstupů na serveru i klientu, testy XSS/CSRF.
- 60–90 dní – CI s SAST/DAST, supply-chain kontrola, rotace tajemství, monitoring CSP reportů a anomálií.
Závěr
Bezpečnost JavaScriptu nevzniká jední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, supply-chain kompromitace i backendových zranitelností. Investice do CSP, Trusted Types, kvalitní validace vstupů, bezpečné správy relace a průběžného auditu kódu se vrací v podobě spolehlivých a důvěryhodných aplikací.