Bezpečnostní zásady při vývoji v JavaScriptu: prevence útoků

Bezpečnostní zásady při práci s JavaScriptem: Prevence útoků

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.prototype nebo Array.prototype s 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 innerHTML pro 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-src s 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: DENY nebo SAMEORIGIN, případně direktivu frame-ancestors v 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=Lax nebo Strict, HttpOnly a Secure.
  • 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 localStorage pro přístupové tokeny; upřednostňujte cookies HttpOnly s 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-Methods a -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 origin v přijímajícím posluchači; nikdy nepřijímejte zprávy bez kontroly původu.
  • Sandbox pro iframe – použijte atribut sandbox s minimálním počtem oprávnění (allow-scripts povolte 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 integrity a crossorigin.
  • 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 eval a new Function – nastavte CSP script-src bez '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-Control a Vary.
  • 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, vm a dynamickému require př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__, constructor a prototype.
  • 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ěřujte kid i 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 eval a 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/eval pro 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 v localStorage.
  • 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 cookies HttpOnly.
  • 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í.