Defaults.Exposed

Defaults.ExposedOpravy › Content-Security-Policy (CSP)

Jak opravit Content-Security-Policy (CSP)

Content Security Policy je bezpečnostní pravidlo, které váš web předá prohlížeči každého návštěvníka a říká mu přesně, jaký kód smí spouštět. Bez něj, pokud se někdy dostane na stránku cokoli škodlivého — prostřednictvím komentářového pole, hacknutého pluginu nebo skriptu třetí strany — prohlížeč ho spustí volně, včetně kódu, který tiše sbírá čísla karet a hesla zákazníků při psaní, přičemž zámek stále svítí.

Výsledek pro vaše podnikání: Pokud je váš web někdy neoprávněně pozměněn, škodlivý kód může číst platební karty a přihlašovací údaje vašich zákazníků přímo z vašeho pokladního okna, zatímco vše vypadá zcela normálně — zanechávajíce vás s chargeback, podvodnými nároky, reportabilním narušením dat a selháním kontroly, které bezpečnostní týmy větších klientů používají k zastavení nebo zrušení obchodu.

Co vás to může stát

Proč na tom záleží. Zámek dokazuje, že připojení k vašemu webu je soukromé, ale nedělá nic pro kontrolu toho, jaký kód se spustí, jakmile je návštěvník na stránce. Content Security Policy je bezpečnostní opatření, které to dělá — říká prohlížečům ignorovat jakýkoliv skript, který nepochází ze zdroje, jemuž důvěřujete, takže jedno neoprávněně pozměněné pole, reklama nebo plugin nemůže být přeměněna na nástroj pro kradení peněz a dat vašich zákazníků. Je to hodnocená kontrola na vašem hodnotícím listu, stojící skutečné body, a jedna z prvních věcí, které profesionální bezpečnostní revize hledá.

Co to je, prostými slovy

Když někdo navštíví váš web, jejich prohlížeč stáhne vaši stránku a spustí jakýkoliv kód na ní — skripty, které způsobují, že menu se rozbaluje, tlačítka fungují, platební formuláře odesílají a tak dále. Ve výchozím nastavení mu prohlížeč důvěřuje vše. Nemá způsob, jak vědět, jaký kód je skutečně váš a jaký byl vsunut někým jiným.

Content Security Policy (často zkracována na CSP) je krátký seznam pravidel, který váš web připojí ke každé stránce a říká prohlížeči: “spouštěj pouze kód z těchto zdrojů, které jsem schválil, a odmítni vše ostatní.” Je to rozdíl mezi nočním klubem, který pustí kohokoliv, a tím, který má seznam hostů u dveří.

Důvod, proč na tom tak záleží, je ten, že webové stránky jsou neustále neoprávněně pozměňovány — ne vždy hackováním vašeho serveru, ale prostřednictvím zadních dveří, které většina webů ponechává otevřené: komentářové pole, vyhledávací pole, zastaralý plugin, skript třetí strany pro reklamy nebo analytiku nebo widget chatu. Pokud útočník dostane i jeden řádek svého vlastního kódu na jednu z vašich stránek, prohlížeč ho spustí, jako by byl váš. Odtud může číst vše, co vaši zákazníci zadají — čísla karet, hesla, adresy — a tiše to odesílat jinam. Content Security Policy zavírá tyto dveře tím, že odmítne spustit cokoliv ze zdroje, který jste neschválili.

Co vás to může stát

Toto není abstraktní. Útok, kterému Content Security Policy brání — kód vstřikovaný do stránky, který krade data od vašich zákazníků — je za některými z největších narušení skimmingu karet v záznamu. Zde je to, jak to obvykle vypadá pro normální firmu:

Co to vlastně je (detail)

Content Security Policy je doručena jako jediná hlavička HTTP odpovědi — řádek, který váš webový server pošle s každou stránkou. Jeho hodnota je sada direktiv, každá pojmenovávající typ obsahu a zdroje povolené pro něj. Například:

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'

Prostými slovy to říká: ve výchozím nastavení načítejte věci pouze z mého vlastního webu; spouštějte pouze skripty z mého vlastního webu; nepovolujte žádné staré pluginy; a nedovolte jiným webům vložit mě do rámce.

Jak vypadá ‘dobré’ nastavení. Naše kontrola nehledá pouze přítomnost hlavičky — čte politiku direktivu po direktivě a hodnotí, jak silná skutečně je, tak jak by to udělal bezpečnostní recenzent. Silná politika:

Politika, která existuje, ale spoléhá na 'unsafe-inline', 'unsafe-eval' nebo zástupné znaky, bude stále skórovat špatně — protože v praxi poskytuje malou skutečnou ochranu. Cílem je přísná politika, nikoli jen jakákoliv politika.

Jak to opravit (zdarma, ~1–2 hodiny)

Předejte tuto část vašemu IT pracovníkovi nebo tomu, kdo provozuje váš web — oprava sama o sobě je zcela zdarma. Účtujeme pouze monitoring, zda zůstane na místě a bude správná v čase; zapnutí nestojí nic. Důvod, proč to trvá hodinu nebo dvě místo minut, je pečlivý zkušební krok, který zabrání omylovému zablokování části vašeho vlastního webu.

  1. Začněte v režimu pouze hlásit — zatím nevynucujte. Přidejte hlavičku HTTP odpovědi Content-Security-Policy-Report-Only. Toto sleduje a zaznamenává, co by bylo zablokováno, aniž by cokoliv skutečně blokovalo, takže živý web bude fungovat, zatímco se učíte, na čem každá stránka skutečně závisí. (Důležité: pouze hlásit sám o sobě nedává návštěvníkům žádnou ochranu — je to pouze bezpečný první krok.)

  2. Sestavte politiku z toho, co váš web skutečně používá. Zkontrolujte přehledy, abyste našli každý legitimní zdroj skriptů, stylů, písem a obrázků — vaše vlastní doménu, vaši analytiku, vašeho platebního poskytovatele, hostitele písem, widget chatu — a uveďte je jako povolené zdroje. Solidní výchozí bod je default-src 'self' plus explicitní záznamy pro důvěryhodné třetí strany, které skutečně používáte.

  3. Vyhýbejte se mezerám, které porazí celý smysl. Vyhýbejte se 'unsafe-inline' a 'unsafe-eval' pro skripty a vyhýbejte se zástupným znakům jako * a holým schématům jako https: pro skripty — tyto znovu otevírají přesně tu mezeru, kterou politika má uzavřít. Kde jsou inline skripty nevyhnutelné, použijte nonce nebo hash, takže spouštět se může pouze váš konkrétní schválený kód.

  4. Uzamkněte rámování a pluginy. Přidejte frame-ancestors 'self' (toto také zastaví jiné weby v vložení vašeho webu k oklamání zákazníků a splňuje to související kontrolu clickjackingu) a object-src 'none' pro blokování útoků na starší pluginy.

  5. Přepněte z pouze hlásit na vynucování. Jakmile jsou přehledy čisté a web funguje, změňte název hlavičky z Content-Security-Policy-Report-Only na Content-Security-Policy. Toto je krok, který skutečně přináší ochranu — politika pouze hlásit to nedělá a neprojde kontrolou.

    Kde nastavit hlavičku závisí na vaší platformě:

    • Cloudflare: Pravidla → Transformační pravidla → Upravit hlavičku odpovědi → nastavte Content-Security-Policy.
    • Nginx: add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';" always;
    • Apache: Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';"
    • IIS (web.config): přidejte vlastní hlavičku HTTP odpovědi s názvem Content-Security-Policy a politikou jako hodnotou.
    • Google Workspace / Microsoft 365: tyto spouštějí váš e-mail, nikoli váš veřejný web, takže politika se nastavuje kdekoliv je váš web skutečně hostován (Cloudflare nebo váš webhosting výše), nikoli v konzoli správce e-mailu.
  6. Znovu zkontrolujte svou doménu a potvrďte, že politika nyní ukazuje jako zapnutá a vynucovací, bez oslabovacích mezer.

Běžné chyby

Časté dotazy

Nejsem technik — mohu to vyřešit sám?

Nemusíte rozumět detailům. Toto je nastavení přidané tím, kdo provozuje váš web nebo hosting, a na službách jako Cloudflare je z velké části vedeno. Předejte jim sekci 'Jak to opravit' níže. Je to zdarma; jedna výstraha je, že by měla být nejprve pečlivě nasazena v pouze sledovacím režimu, aby omylem nezablokovala části vašeho vlastního webu — přesně co kroky pokrývají.

Již mám zámek a SSL certifikát — není můj web bezpečný?

Zámek zabezpečuje doručení vaší stránky; nepoliciuje, co běží uvnitř. Pokud na stránce někdy skončí škodlivý kód — prostřednictvím hacknutého pluginu, kompromitované reklamy nebo vloženého pole — zámek ho nezastaví od kradení dat. Content Security Policy je vrstva, která omezuje to, co je povoleno spouštět. Chrání různé věci a chcete obojí.

Mohlo by zapnutí tohoto poškodit můj web?

Může, pokud je zapnuto agresivně najednou, protože to může blokovat legitimní skripty, které skutečně používáte. Proto standardní přístup je začít v 'pouze hlásit' zkušebním režimu, který sleduje bez blokování, opravit cokoliv označí a teprve pak ho vynucovat. Provedeno tímto způsobem je bezpečné — a zkušební krok je zabudován do opravy níže.

Dali jsme ho do 'pouze hlásit' režimu — jsme pokryti?

Ne a toto je nejčastější falešný pocit bezpečnosti. Režim pouze hlásit sleduje a zaznamenává, co by bylo zablokováno, ale nic neblokuje — návštěvníci dostávají nulovou skutečnou ochranu. Je to pouze bezpečný první krok. Naše kontrola dá pouze hlásit zlomek kreditu skutečné politiky a nezaznamená ho jako průchod. Jste chráněni teprve po přepnutí do vynucovacího režimu.

Ovlivňuje to naše skóre nebo je to pouze poradenské?

Ovlivňuje vaše skóre. Kontrola Content Security Policy je hodnocena a stojí až 25 bodů v kategorii Webová bezpečnost. Chybějící nebo slabá politika je označena jako vysoká závažnost a táhne vaše hodnocení dolů — a je to přesně druh mezery, na který se dotazník klienta ptá.

Náš vývojář přidal politiku, ale skóre je stále nízké — proč?

Politika může existovat a přesto být slabá. Nejčastějšími viníky jsou mezery jako 'unsafe-inline' a 'unsafe-eval' pro skripty nebo zástupné znaky (holý *), které znovu otevírají přesně tu mezeru, kterou politika má uzavřít. Naše kontrola čte politiku direktivu po direktivě a hodnotí dolů tyto slabiny — politika, která cokoliv povoluje, skóruje sotva lépe než žádná. Oprava je zpřísnění pravidel skriptů pomocí nonces nebo hashů místo těchto mezer.