# Hlavičky a CSP (https://docs.vitrinka.ai/cs/security/headers)



## Každá odpověď [#baseline]

Nejvnějšnější obal handlerů — pokrývá aplikaci, hostitele sdílení i zkratky licenční brány — nastavuje `X-Content-Type-Options: nosniff`, referrer policy, permissions policy, `frame-ancestors` z content security policy, `X-Robots-Tag: noindex` a `Strict-Transport-Security`, kdykoli je `BASE_URL` https. Na instalaci přes prostý http za vlastním TLS terminátorem nastavte HSTS na proxy.

Hlavička `X-Frame-Options` záměrně chybí: neumí vyjádřit allowlist a hádala by se s direktivou CSP, která to umí.

## Jeden vlastník CSP [#csp]

Aplikace vydává každou hlavičku content security policy; reverzní proxy před ní nesmí přidat žádnou. Prohlížeče více politik protínají — každá musí načtení nezávisle povolit — takže druhá politika na okraji tiše zruší záměrné povolení.

Tři vrstvy, každá hlavičku *nastavuje*, ne přidává, takže odpověď nese přesně jednu vynucenou politiku:

1. základ na každé odpovědi;
2. allowlist pro vkládání workspace na odpovědích `/w/` — `VITRINKA_FRAME_ANCESTORS`, originy oddělené mezerou, které smějí rámovat stránky workspace, prázdné znamená `'self'`;
3. sandboxy artefaktů a souborů sad, které servírují HTML od uživatelů v neprůhledném originu pod vlastní úplnou politikou.

`VITRINKA_CSP` je ve výchozím stavu `report-only`: vynucený povrch zůstává `frame-ancestors`, zatímco celý základ se doručuje jako politika jen pro hlášení a porušení se posílají na `/csp-report` na každém originu, který ji vydává, jako strukturovaná, očištěná telemetrie. `enforce` povýší základ na vynucenou hlavičku — přepněte ho, až bude proud hlášení na vaší instalaci po reprezentativní dobu tichý.

## Přístup z jiných originů [#cors]

API je same-origin. Zástupné `Access-Control-Allow-Origin: *` se odpovídá jen u statických souborů, u surových souborů uvnitř sandboxu artefaktů a u anonymních endpointů pro propojení zařízení a kontaktního formuláře, a odpověď ověřenou session cookie prohlížeč pod zástupným originem jinému originu nikdy nezpřístupní. Dvě veřejně vkládaná pověření dostávají odpověď i z jiného originu, pokaždé jen pro origin, který povolují, a jen na vlastních cestách pro příjem dat: klíče hlášení chyb a tokeny rekordérů — klíč vydaný adminem odpovídá svému seznamu originů, propojený rekordér svému rozšíření prohlížeče nebo stránce, která odpovídá některému pravidlu domén projektů workspace, produkčnímu pravidlu však jen tehdy, když povoluje rekordér v aplikaci. `VITRINKA_REFERENCE_ORIGINS` jmenuje přesné https originy, které smějí s browserovou session přistupovat k soukromým kolekcím referencí, a to jen na `/api/v1/reference-library`; session cookie nikdy nerozšíří ani neotevře další API workspace.

## Origin pro sdílení [#share]

`VITRINKA_SHARE_ORIGIN` pojmenovává vyhrazeného hostitele pro sdílecí odkazy nástěnek. Požadavky na tom hostiteli obsluhuje povrch jen pro sdílení, který nikdy nepřijme session cookie, bearer token ani řídicí rovinu, takže sdílená nástěnka se nemůže stát opěrným bodem do workspace. Prázdné nechá sdílecí odkazy na `BASE_URL`.

## Dokumenty v sandboxu [#sandbox]

HTML artefakty a soubory sad od uživatelů se servírují v sandboxovaném kontextu prohlížení s neprůhledným originem pod vlastní restriktivní politikou. Nemůžou číst cookies ani úložiště workspace a základ aplikace je pro ně vyňatý, aby sandboxovaný dokument nezaplavil proud hlášení porušeními, která má produkovat.
