- Bevezetés
- CSRF-kérelmek megakadályozása
- URI-k kizárása
- X-CSRF-Token
- X-XSRF-Token
- X-XSRF-Token
Bevezetés
A webhelyközi kéréshamisítás a rosszindulatú kihasználások egy típusa, amelynek során egy hitelesített felhasználó nevében jogosulatlan parancsokat hajtanak végre. Szerencsére a Laravel segítségével könnyen megvédheti az alkalmazását a CSRF (cross-site request forgery) támadásoktól.
A sebezhetőség magyarázata
Ha nem ismeri a cross-site request forgery-t, beszéljünk egy példát arra, hogyan lehet kihasználni ezt a sebezhetőséget. Képzeljük el, hogy az alkalmazásunknak van egy /user/email
útvonala, amely elfogad egy POST
kérést a hitelesített felhasználó e-mail címének megváltoztatására. Valószínűleg ez az útvonal egy email
bemeneti mezőt vár, amely tartalmazza azt az e-mail címet, amelyet a felhasználó használni szeretne.
CSRF-védelem nélkül egy rosszindulatú webhely létrehozhat egy HTML-űrlapot, amely az alkalmazás /user/email
útvonalára mutat, és a rosszindulatú felhasználó saját e-mail címét küldi be:
<form action="https://your-application.com/user/email" method="POST"> <input type="email" value=""></form><script> document.forms.submit();</script>
Ha a rosszindulatú webhely automatikusan elküldi az űrlapot az oldal betöltésekor, a rosszindulatú felhasználónak csak arra kell rávennie az alkalmazás gyanútlan felhasználóját, hogy látogasson el a webhelyére, és az e-mail címe megváltozik az alkalmazásban.
A sérülékenység megelőzéséhez minden bejövő POST
, PUT
, PATCH
vagy DELETE
kérést meg kell vizsgálnunk egy olyan titkos munkamenetérték után, amelyhez a rosszindulatú alkalmazás nem férhet hozzá.
CsRF-kérések megelőzése
A Laravel automatikusan generál egy CSRF “tokent” minden egyes, az alkalmazás által kezelt aktív felhasználói munkamenethez. Ez a token annak ellenőrzésére szolgál, hogy a hitelesített felhasználó az a személy, aki ténylegesen kéréseket intéz az alkalmazáshoz. Mivel ez a token a felhasználó munkamenetében tárolódik, és minden egyes alkalommal változik, amikor a munkamenet újratermelődik, egy rosszindulatú alkalmazás nem tud hozzáférni.
Az aktuális munkamenet CSRF tokenje a kérelem munkamenetén keresztül vagy a csrf_token
segédfüggvényen keresztül érhető el:
use Illuminate\Http\Request;Route::get('/token', function (Request $request) { $token = $request->session()->token(); $token = csrf_token(); // ...});
Amikor HTML űrlapot definiál az alkalmazásban, egy rejtett CSRF _token
mezőt kell beépíteni az űrlapba, hogy a CSRF-védelmi middleware validálni tudja a kérést. Az egyszerűség kedvéért használhatja a @csrf
Blade direktívát a rejtett token bemeneti mező létrehozásához:
<form method="POST" action="/profile"> @csrf <!-- Equivalent to... --> <input type="hidden" name="_token" value="{{ csrf_token() }}" /></form>
A App\Http\Middleware\VerifyCsrfToken
middleware, amely alapértelmezés szerint a web
middleware csoportban található, automatikusan ellenőrzi, hogy a kérés bemenetében lévő token megegyezik-e a munkamenetben tárolt tokennel. Ha ez a két token egyezik, akkor tudjuk, hogy a hitelesített felhasználó az, aki a kérést kezdeményezi.
CSRF tokenek & SPA-k
Ha olyan SPA-t épít, amely a Laravel-t használja API backendként, akkor a Laravel Sanctum dokumentációjában talál információkat az API-val való hitelesítésről és a CSRF sebezhetőségek elleni védelemről.
URI-k kizárása a CSRF-védelem alól
Néha előfordulhat, hogy URI-k egy csoportját szeretné kizárni a CSRF-védelem alól. Ha például a Stripe-ot használja a fizetések feldolgozására, és az ő webhook rendszerét használja, akkor ki kell zárnia a Stripe webhook kezelő útvonalát a CSRF-védelem alól, mivel a Stripe nem fogja tudni, hogy milyen CSRF tokent küldjön az útvonalainak.
Tipikusan az ilyen típusú útvonalakat a web
middleware csoporton kívül kell elhelyeznie, amelyet a App\Providers\RouteServiceProvider
a routes/web.php
fájlban lévő összes útvonalra alkalmaz. Az útvonalakat azonban úgy is kizárhatja, hogy URI-jukat hozzáadja a VerifyCsrfToken
middleware $except
tulajdonságához:
<?phpnamespace App\Http\Middleware;use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;class VerifyCsrfToken extends Middleware{ /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = ;}
{tip} Az egyszerűség kedvéért a tesztek futtatásakor a CSRF middleware automatikusan letiltja az összes útvonalat.
X-CSRF-TOKEN
A CSRF token POST paraméterként történő ellenőrzése mellett a App\Http\Middleware\VerifyCsrfToken
middleware a X-CSRF-TOKEN
kérési fejlécet is ellenőrzi. A tokent például egy HTML meta
tagben tárolhatja:
<meta name="csrf-token" content="{{ csrf_token() }}">
Ezután utasíthat egy olyan könyvtárat, mint a jQuery, hogy automatikusan adja hozzá a tokent az összes kérés fejlécéhez. Ez egyszerű és kényelmes CSRF-védelmet biztosít az AJAX-alapú, hagyományos JavaScript technológiát használó alkalmazásai számára:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta').attr('content') }});
X-XSRF-TOKEN
A Laravel az aktuális CSRF-tokent egy titkosított XSRF-TOKEN
cookie-ban tárolja, amelyet a keretrendszer által generált minden válaszhoz mellékel. A süti értékét használhatja a X-XSRF-TOKEN
kérés fejléc beállításához.
Ez a süti elsősorban a fejlesztők kényelmét szolgálja, mivel néhány JavaScript keretrendszer és könyvtár, például az Angular és az Axios, automatikusan elhelyezi az értékét a X-XSRF-TOKEN
fejlécben az azonos eredetű kéréseknél.