Bezpečnost JavaScriptu

Bezpečnost JavaScriptu

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.prototype nebo Array.prototype s 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 innerHTML pro 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-src s 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 / CSPX-Frame-Options: DENY nebo SAMEORIGIN, případně frame-ancestors v 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=Lax nebo Strict, 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 localStorage pro přístupové tokeny; preferujte HttpOnly cookies 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-Methods a -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 origin v přijímajícím posluchači; nikdy neakceptujte zprávy bez kontroly původu.
  • Sandbox pro iframe – atribut sandbox s minimem povolení (allow-scripts pouze, 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 integrity a crossorigin.
  • 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 eval a new Function – CSP script-src bez '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-Control a Vary.
  • 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, vm a dynamickému require pro 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 HttpOnly cookie.
  • Podpis a algoritmy – nepovolujte alg=none, validujte kid a 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 izolacecode 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/eval pro neověřená data; auto-escaping a sanitace.
  • CSP s nonce/hash, Trusted Types, SRI pro třetí strany.
  • Cookies: HttpOnly, Secure, SameSite; žádné tokeny v localStorage.
  • 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 do HttpOnly cookies.
  • 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í.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *