Szigorú CSP Laravelben, Vite-tal
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.
$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 →További cikkek
Botvédelem kapcsolati űrlapra captcha nélkül
Öt láthatatlan réteg, amitől a kéretlen üzenetek nagy része elakad, és a valódi látogatónak semmit nem kell csinálnia.
Elolvasom →Egy Laravel buktató: a throttle számláló közös
A throttle:5,1 és a throttle:120,1 ugyanazt a számlálót használja IP-nként. Így fogyasztotta el a mérés az űrlap korlátját.
Elolvasom →