# Content-Security-Policy

> A teszt azt nézi, hogy az oldal küld-e Content-Security-Policy fejlécet vagy meta taget; ha nem, állíts be legalább egy alap szabályt, és szigorítsd fokozatosan.

A Content-Security-Policy (CSP) megmondja a böngészőnek, honnan tölthet be az oldal szkriptet, stílust, képet és egyéb tartalmat, és mire használhatja a beágyazott elemeket. Fő célja a szkriptbefecskendezéses támadások (XSS) hatásának korlátozása: ha egy támadó mégis kódot juttat az oldalba, egy jól beállított CSP nem engedi lefutni vagy kommunikálni. Az MDN szerint a CSP nem helyettesíti a bemenet szűrését, hanem kiegészíti azt (mélységi védelem). A riportban a teszt súlyossága közepes.

## Hogyan mérjük

A riport a főoldal válaszát nézi (átirányítások követése után a végső válaszét).

- **Megfelelő:** van `Content-Security-Policy` válaszfejléc nem üres értékkel, **vagy** a HTML-ben van `<meta http-equiv="Content-Security-Policy">` tag.
- **Hiba:** egyik sincs.

A teszt **csak a jelenlétet** ellenőrzi, a szabály tartalmát nem értékeli: egy nagyon laza szabály is megfelel. A `Content-Security-Policy-Report-Only` fejlécet nem számítja be (az nem kényszerít ki semmit). A meta tagnál az MDN szerint nem minden CSP-funkció működik, ezért a fejléc a teljes értékű megoldás.

## Hogyan javítsd

Fokozatosan haladj, mert egy túl szigorú szabály eltöri az oldalt (letiltja a saját szkripteket, betűtípusokat, beágyazott videókat).

1. **Indulj egy kis kockázatú alapszabállyal** (alább). Ez nem korlátozza a szkriptek és stílusok forrását, ezért az oldalt nem töri el, de így önmagában még nem védi meg az XSS-től.
2. **Szigorításhoz használd a jelentés módot.** Az MDN és a Mozilla útmutatója is azt javasolja, hogy előbb `Content-Security-Policy-Report-Only` fejlécben próbáld ki a szabályt: nem kényszeríti ki, csak jelenti a megsértéseket. A report-only szabály meta tagben nem adható meg, csak fejlécben.
3. **Az XSS ellen a `script-src` ad valódi védelmet.** Az MDN a nonce- vagy hash-alapú szigorú CSP-t javasolja, és figyelmeztet, hogy az `'unsafe-inline'` és az `'unsafe-eval'` nagyrészt elveszi a CSP értelmét. Ehhez az oldal kódját is át kell alakítani (beágyazott szkriptek nonce-szal vagy hash-sel), ezért ez a feladat oldalanként más.

Az alábbi alapszabály három irányelvet tartalmaz:

- `object-src 'none'`: letiltja a `<object>` és `<embed>` elemeket (így a beágyazott PDF-et is),
- `base-uri 'self'`: megakadályozza, hogy befecskendezett `<base>` tag átirányítsa a relatív címeket,
- `frame-ancestors 'self'`: csak az oldal saját magát engedi keretbe tenni (ez egyben a [clickjacking elleni védelmet](https://hub.hellowp.io/hu/report/biztonsag/clickjacking-vedelem/) is teljesíti).

Ha ezek bármelyikét szándékosan használod (például más oldalról keretbe teszik az oldaladat), előbb igazítsd a szabályt. Ha már van `Content-Security-Policy` fejléced, a meglévő szabályt egészítsd ki, ne küldj mellé másodikat.

### nginx

Az nginx `server` blokkjába. Ha egy `location` blokkban is van `add_header`, oda is be kell írni, mert az nginx csak akkor örökli a fejlécet, ha az adott szinten nincs `add_header`.

```nginx title="nginx"
add_header Content-Security-Policy "object-src 'none'; base-uri 'self'; frame-ancestors 'self'" always;
```

### Apache (.htaccess)

```apache title=".htaccess"
<IfModule mod_headers.c>
    Header always set Content-Security-Policy "object-src 'none'; base-uri 'self'; frame-ancestors 'self'"
</IfModule>
```

### Cloudflare

**Rules → Overview → Create rule → Response Header Transform Rule**:

```text title="Cloudflare"
Set static: Content-Security-Policy = object-src 'none'; base-uri 'self'; frame-ancestors 'self'
```

### HTML

Ha a válaszfejléchez nem férsz hozzá, a lap `<head>` részébe meta tag is tehető. Itt a `frame-ancestors` nem hat (az MDN szerint meta elemben nem támogatott), ezért nincs benne.

```html title="HTML"
<meta http-equiv="Content-Security-Policy" content="object-src 'none'; base-uri 'self'">
```

## Hogyan ellenőrizd

Futtasd újra a riportot. Parancssorból:

```bash title="Terminál"
curl -sI https://example.com/ | grep -i content-security-policy
```

Böngészőben nyisd meg a fejlesztői eszközök konzolját: a CSP megsértéseit a böngésző ott is jelzi. Éles bevezetés előtt nézd végig az oldal fontos részeit (űrlapok, beágyazások, fizetés), hogy semmi nem tört el.
