# Clickjacking-védelem

> A teszt azt nézi, hogy az oldal tiltja-e a keretbe ágyazást X-Frame-Options fejléccel vagy CSP frame-ancestors irányelvvel; ha nem, állíts be egyet.

Clickjackingnél egy idegen oldal láthatatlan vagy elfedett keretben (`<iframe>`) tölti be az oldaladat, és ráveszi a látogatót, hogy a saját oldalán kattintva valójában nálad kattintson (például egy gombra vagy jóváhagyásra). A védelem egy válaszfejléc, amely megmondja a böngészőnek, ki ágyazhatja be az oldalt. A riportban a teszt súlyossága közepes.

## Hogyan mérjük

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

- **Megfelelő:** a `Content-Security-Policy` fejléc tartalmazza a `frame-ancestors` szót, **vagy** van `X-Frame-Options` fejléc.
- **Hiba:** egyik sincs.

Fontos részletek:

- Csak a **válaszfejlécet** számolja. A meta tagben megadott CSP nem számít, mert a `frame-ancestors` az MDN szerint meta elemben nem támogatott, az `X-Frame-Options` pedig meta tagben szintén hatástalan.
- A teszt csak a jelenlétet nézi, az **értéket nem**. Tehát megfelel egy hibás vagy túl laza érték is, például az elavult `X-Frame-Options: ALLOW-FROM …` (amelyet a mai böngészők teljesen figyelmen kívül hagynak, így nem véd), vagy a `frame-ancestors *`.

## Hogyan javítsd

Az OWASP útmutatója szerint a fő védelem a CSP `frame-ancestors` irányelve, az `X-Frame-Options` pedig a régi böngészők tartaléka. Ha mindkettő jelen van, a `frame-ancestors`-t értő böngésző azt alkalmazza. A riport kártyája az `X-Frame-Options: SAMEORIGIN` fejlécet adja, ami azt engedi, hogy csak az oldal saját magát tegye keretbe.

Az `X-Frame-Options` két érvényes értéke: `DENY` (soha nem ágyazható be) és `SAMEORIGIN` (csak azonos eredetű oldal ágyazhatja be). Ha más oldal is beágyazhatja az oldaladat, a `frame-ancestors` irányelvvel sorolhatod fel őket, például `frame-ancestors 'self' https://partner.example.com`.

### 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 X-Frame-Options "SAMEORIGIN" always;
```

### Apache (.htaccess)

```apache title=".htaccess"
<IfModule mod_headers.c>
    Header always set X-Frame-Options "SAMEORIGIN"
</IfModule>
```

### Cloudflare

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

```text title="Cloudflare"
Set static: X-Frame-Options = SAMEORIGIN
```

### WordPress

Új fájlba: `wp-content/mu-plugins/keretbe-agyazas-tiltasa.php` (Bedrockon: `web/app/mu-plugins/keretbe-agyazas-tiltasa.php`). A WordPress `send_frame_options_header()` függvénye a dokumentáció szerint két fejlécet küld: `X-Frame-Options: SAMEORIGIN` és `Content-Security-Policy: frame-ancestors 'self';`, tehát mindkét védelmet beállítja.

```php title="keretbe-agyazas-tiltasa.php"
<?php
add_action( 'send_headers', 'send_frame_options_header' );
```

Ha az oldalad a [Content-Security-Policy](https://hub.hellowp.io/hu/report/biztonsag/content-security-policy/) alapszabályát is megkapja (abban szerepel a `frame-ancestors 'self'`), a clickjacking-teszt azzal is megfelel.

## Hogyan ellenőrizd

Futtasd újra a riportot. Parancssorból:

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

Ellenőrizd azt is, hogy az oldal nem tört el ott, ahol szándékosan be van ágyazva (például egy partneroldalon).
