Ugrás a tartalomra
Rapcsány Krisztián Rapcsány Krisztián
← Összes cikk
2 perc olvasás

Szigorú CSP Laravelben, Vite-tal

Laravel Biztonság Vite

A tartalombiztonsági irányelv (CSP) megmondja a böngészőnek, honnan futhat szkript az oldalon. Ha valaki bejuttat egy idegen szkriptet, például egy beviteli mezőn át, a böngésző nem futtatja le. A nehéz rész az, hogy a saját beágyazott szkriptjeimet is engedni kell, de úgy, hogy ne váljanak kiskapuvá.

Nonce: kérésenként egy azonosító

A middleware minden kérésnél véletlen azonosítót generál. Ezt beírom a fejlécbe, és minden saját beágyazott szkript elé is. A böngésző csak azt a szkriptet futtatja le, amelynek azonosítója egyezik. A Vite a saját címkéit is el tudja látni vele.

SecurityHeaders.php
$nonce = base64_encode(random_bytes(16));

Vite::useCspNonce($nonce);         // Vite puts the nonce on its own tags
View::share('cspNonce', $nonce);   // used as <script nonce="..."> on every inline script

$response = $next($request);

$response->headers->set('Content-Security-Policy', implode('; ', [
    "default-src 'self'",
    "script-src 'self' 'nonce-{$nonce}'",
    "style-src 'self' 'unsafe-inline'",
    "img-src 'self' data:",
    "font-src 'self'",
    "object-src 'none'",
    "base-uri 'self'",
    "form-action 'self'",
    "frame-ancestors 'self'",
]));

Kivonat valódi kódból, anonimizálva.

Amire vigyázni kell

  • A Vite fejlesztői szervere miatt a CSP-t kikapcsolom, amíg az fut, különben a fejlesztés nem működik.
  • A stíluson meghagytam az inline engedélyt, mert a stílusattribútumokat nem lehet azonosítóval védeni.
  • Külső szolgáltatást (mérés, captcha) csak akkor engedek, ha be van állítva.
  • Egy teszt ellenőrzi, hogy minden beágyazott szkriptnek van azonosítója, így egy új szkript nem csúszhat át védtelenül.

Az eredményt a böngésző konzolján ellenőrzöm: ha valami meg van tiltva, ott azonnal látszik.

Hasonló problémán dolgozol?

Ha elakadtál, vagy átnéztetnéd a megoldásodat, írj, szívesen megnézem.

Írok neked →
Ajánlatot kérek →