Koa-helmet je Helmet wraper používaný Express.js. Zajišťuje důležité bezpečnostní http hlavičky. Vlastní koa-helmet má na GitHubu 532 hvězd a originál, který pochází z Express.js má 7 tisíc hvězd.
Helmet nabízí 14 bezpečnostních middlewaových funkcí:
Content Security Policy
Implicitně v Helmet není zahrnuto. Dokáže weby a uživatele ochránit před útoky typu Cross-site scripting (XSS) a data injection. Pomocí tohoto nastavení určíme z jakých zdrojů může stránka načítat zdroje. Seznam direktiv tohoto příkazu najdeme zde: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy Podrobný český návod najdeme zde: https://www.root.cz/clanky/bezpecnejsi-web-s-hlavickou-content-security-policy/ Ve stručnosti CSP může být velkým pomocníkem proti útokům XSS, data injection a dokáže zabránit i únikům dat o uživateli pomocí nešifrovaného spojení. Pokud je to tedy možné, doporučuji CSP implementovat. Na druhou stranu je dobré si uvědomit, že CSP je plně kontrolováno prohlížečem a odehrává se vždy na straně klienta. Ten, pokud bude používat prohlížeč, který není podporovaný, účinky CSP ho minou. Proto se vždy pokuste všem těmto bezpečnostním hrozbám zabránit na straně serveru a CSP berte pouze jako takovou zálohu, pokud by primární linie obrany nestačila.
// Příklad použití
const helmet = require('helmet')
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", 'maxcdn.bootstrapcdn.com']
}
}))
X-Permitted-Cross-Domain-Policies
Implicitně v Helmet není zahrnuto. Hlavička X-Permitted-Cross-Domain-Policies byla vytvořena pro Adobe Flash Player nebo Adobe Acrobat, ale je určena i pro jiné programy pracující se soubory flash a pdf. Pravidla pro tyto klienty jsou mezidoménově definována v souboru crossdomain.xml.
<!-- Příklad souboru crossdomain.xml -->
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*"/>
</cross-domain-policy>
// Implementace X-Permitted-Cross-Domain-Policies
const helmet = require('helmet')
app.use(helmet.permittedCrossDomainPolicies())
DNS Prefetch Control
Tato záhlaví je součástí výchozího balíčku Helmet. Umožňuje zakázat předběžné načítání DNS prohlížeče nastavením DNS Prefetch Control. Většina prohlížečů podporuje vypnutí, ale DNS stejně nenačítají i v zapnutém stavu.
const helmet = require('helmet')
// Nastavení "X-DNS-Prefetch-Control: off".
app.use(helmet.dnsPrefetchControl())
Expect-CT
Implicitně v Helmet není zahrnuto. Hlavička umožňuje kontrolovat dodržování souladu s Certificate Transparency (CT) u certifikátu webových stránek. Hlavním úkolem Expect-CT headeru je zajistit kontrolu shody s CT a umožnit prohlížečům odesílat reporty, pokud mají problémy s ověřením certifikátu webových stránek. Přesné nastavení najdeme zde: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expect-CT
const expectCt = require('expect-ct')
// Sets Expect-CT: max-age=123
app.use(expectCt({ maxAge: 123 }))
// Sets Expect-CT: enforce; max-age=123
app.use(expectCt({
enforce: true,
maxAge: 123
}))
// Sets Expect-CT: enforce; max-age=30; report-uri="http://example.com/report"
app.use(expectCt({
enforce: true,
maxAge: 30,
reportUri: 'http://example.com/report'
}))
Feature-Policy
Implicitně v Helmet není zahrnuto. Feature-Policy hlavička umožňuje vývojářům webu povolovat, zakazovat a upravovat vlastnosti a chování některých rozhraní API a webových funkcí v prohlížeči. Tato hlavička je poměrně nová a její použití není v prohlížečích prozatím široce podporováno. Webové prohlížeče mají mnoho různých funkcí, od vibrací přes zobrazení na celou obrazovku až po přístup k mikrofonu. I když některé z nich mohou být užitečné, možná nebudete chtít používat všechny a možná nebudete chtít používat žádné skripty třetích stran, které používáte. Aktuálně podporované vlastnosti u prohlížečů najdeme zde: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy#Browser_compatibility
const helmet = require('helmet')
app.use(helmet.featurePolicy({
features: {
fullscreen: ["'self'"],
vibrate: ["'none'"],
payment: ['example.com'],
syncXhr: ["'none'"]
}
}))
Hlavička ochraňuje uživatele od zneužití pomocí tzv. „clickjackingu“, kdy útočník na podvodné stránce vloží cizí stránku a nad ní umístí průhlednou vrstvu s vlastními událostmi a odkazy o kterých návštěvník netuší.
X-Frame-Options
Tato záhlaví je součástí výchozího balíčku Helmet. Použití X-Frame-Options preventivně brání zneužití vlastního obsahu na cizích www stránkách. Například nechceme stránky zobrazovat na jiných webech v rámu, kde bude nevhodný obsah, reklama atd. Konkrétní nastavení hlavičky: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
const helmet = require('helmet')
// je povoleno zobrazovat stránku v rámu na vlastním webu. Pokud by bylo uvedeno { action: 'deny' }, stránka nikdy nesmí být zobrazena v rámu. Pomocí ALLOW-FROM https://domena.cz může být pouze vloženo do rámu na uvedené doméně
app.use(helmet.frameguard({ action: 'sameorigin' }))
X-Powered-By
Tato záhlaví je součástí výchozího balíčku Helmet.. Hlavička odstraní implicitní X-Powered-By, které útočníkům odhaluje technologie, které pohání náš web.
const helmet = require('helmet')
app.use(helmet())
app.disable('x-powered-by')
// možné nastavení falešné informace pro zmatení útočníka
app.use(helmet.hidePoweredBy({ setTo: 'PHP 4.2.0' }))
Strict-Transport-Security
Tato záhlaví je součástí výchozího balíčku Helmet. Vynutí u prohlížeče použít na stanovenou dobu v sekundách pro komunikaci s webem pouze protokol HTTPS.
const helmet = require('helmet')
// Sets "Strict-Transport-Security: max-age=5184000; includeSubDomains".
const sixtyDaysInSeconds = 5184000
app.use(helmet.hsts({
maxAge: sixtyDaysInSeconds
}))
X-Download-Options
Tato záhlaví je součástí výchozího balíčku Helmet. Ve výchozím nastavení nám staré verze aplikace Internet Explorer umožňují tyto soubory HTML otevírat v kontextu vašeho webu, což znamená, že nedůvěryhodná stránka HTML by mohla v souvislosti s vašimi stránkami provádět útok.
const helmet = require('helmet')
// Sets "X-Download-Options: noopen".
app.use(helmet.ieNoOpen())
X-Content-Type-Options
Tato záhlaví je součástí výchozího balíčku Helmet. Pomáhá zabránit prohlížečům ve snaze uhodnout („čichat“) typ MIME, který může mít bezpečnostní důsledky. To se provádí nastavením X-Content-Type-Optionszáhlaví na nosniff.
const helmet = require('helmet')
// Sets "X-Content-Type-Options: nosniff".
app.use(helmet.noSniff())
Referrer-Policy
Implicitně v Helmet není zahrnuto.. Kontroluje a případně omezuje Referer hodnotu prohlížeče, která předává odkud uživatel přišel. Seznam možného omezení je zde: https://www.w3.org/TR/referrer-policy/#referrer-policies
const helmet = require('helmet')
// "Referrer-Policy: same-origin" - Záhlaví referrer bude odesláno pouze na stejnou doménu (same-origin), ale na jiné domény referrer nebude obsahovat žádné informace (no-referrer).
app.use(helmet.referrerPolicy({ policy: 'same-origin' }))
X-XSS-Protection
Skriptování napříč webem, zkráceně „XSS“, je způsob, jakým mohou útočníci převzít webové stránky. Cílem útoku XSS je získat kontrolu nad JavaScriptem v prohlížeči oběti. Jakmile to hacker udělá, je tu spousta ošklivých věcí, které mohou udělat: přihlásit své akce, vydávat se za vás, ukrást vaše ověřovací soubory cookie a mnohem více. Helmet XSS je relativně jednoduchý middleware, který nastaví X-XSS-Protection. Ve většině prohlížečů to nastaví na 1; mode=block. U starých verzí aplikace Internet Explorer ji nastaví tak, aby 0ji deaktivovala, protože u IE to může způsobit další škody.
const helmet = require('helmet')
// Nastaví "X-XSS-Protection: 1; mode=block".
app.use(helmet.xssFilter())
Zdroje
- root.cz
- koa-helmet
- helmet
- securityheaders.cz