CSRF-védelem

  • 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.

Szólj hozzá!