Ochrana CSRF

  • Úvod
  • Zabránění požadavkům CSRF
    • Vyloučení URI
  • X-CSRF-Token
  • X-XSRF-.Token

Úvod

Cross-site request forgeries je typ škodlivého zneužití, při kterém jsou jménem ověřeného uživatele prováděny neautorizované příkazy. Laravel naštěstí umožňuje snadnou ochranu aplikace před útoky typu CSRF (cross-site request forgery).

Vysvětlení zranitelnosti

Pokud nejste obeznámeni s problematikou cross-site request forgeries, probereme si příklad, jak lze tuto zranitelnost zneužít. Představte si, že vaše aplikace má trasu /user/email, která přijímá požadavek POST na změnu e-mailové adresy ověřeného uživatele. Tato trasa s největší pravděpodobností očekává vstupní pole email obsahující e-mailovou adresu, kterou chce uživatel začít používat.

Bez ochrany CSRF může škodlivá webová stránka vytvořit formulář HTML, který odkazuje na trasu /user/email vaší aplikace a odesílá vlastní e-mailovou adresu škodlivého uživatele:

<form action="https://your-application.com/user/email" method="POST"> <input type="email" value=""></form><script> document.forms.submit();</script>

Pokud škodlivá webová stránka automaticky odešle formulář při načtení stránky, stačí, aby škodlivý uživatel nalákal nic netušícího uživatele vaší aplikace k návštěvě své webové stránky a jeho e-mailová adresa bude ve vaší aplikaci změněna.

Chceme-li této zranitelnosti zabránit, musíme každý příchozí požadavek POST, PUT, PATCH nebo DELETE zkontrolovat, zda neobsahuje tajnou hodnotu relace, ke které nemá škodlivá aplikace přístup.

Předcházení požadavkům CSRF

Laravel automaticky generuje „token“ CSRF pro každou aktivní relaci uživatele spravovanou aplikací. Tento token slouží k ověření, že ověřený uživatel je osoba, která skutečně provádí požadavky na aplikaci. Protože je tento token uložen v relaci uživatele a mění se při každém obnovení relace, škodlivá aplikace k němu nemá přístup.

K tokenu CSRF aktuální relace lze přistupovat prostřednictvím relace požadavku nebo pomocí pomocné funkce csrf_token:

use Illuminate\Http\Request;Route::get('/token', function (Request $request) { $token = $request->session()->token(); $token = csrf_token(); // ...});

Pokud v aplikaci definujete formulář HTML, měli byste do něj zahrnout skryté pole CSRF _token, aby mohl middleware ochrany CSRF ověřit požadavek. Pro usnadnění můžete pro vygenerování skrytého vstupního pole tokenu použít direktivu @csrf Blade:

<form method="POST" action="/profile"> @csrf <!-- Equivalent to... --> <input type="hidden" name="_token" value="{{ csrf_token() }}" /></form>

Mediální software App\Http\Middleware\VerifyCsrfToken, který je ve výchozím nastavení zařazen do skupiny middlewaru web, automaticky ověří, zda token ve vstupu požadavku odpovídá tokenu uloženému v relaci. Pokud se tyto dva tokeny shodují, víme, že požadavek inicioval ověřený uživatel.

Tokeny CSRF & SPA

Pokud vytváříte SPA, které využívá Laravel jako backend API, měli byste se seznámit s dokumentací Laravel Sanctum, kde najdete informace o ověřování pomocí API a ochraně před zranitelnostmi CSRF.

Vyloučení URI z ochrany CSRF

Někdy můžete chtít z ochrany CSRF vyloučit sadu URI. Pokud například používáte ke zpracování plateb společnost Stripe a využíváte její systém webhook, budete muset z ochrany CSRF vyloučit trasu obsluhy webhooků Stripe, protože Stripe nebude vědět, jaký CSRF token má vašim trasám poslat.

Typicky byste měli tyto druhy tras umístit mimo skupinu middlewaru web, která App\Providers\RouteServiceProvider platí pro všechny trasy v souboru routes/web.php. Tyto trasy však můžete také vyloučit přidáním jejich URI do vlastnosti $except middlewaru VerifyCsrfToken:

<?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} Pro pohodlí je middleware CSRF při spuštění testů automaticky zakázán pro všechny trasy.

X-CSRF-TOKEN

Kromě kontroly tokenu CSRF jako parametru POST bude middleware App\Http\Middleware\VerifyCsrfToken kontrolovat také hlavičku požadavku X-CSRF-TOKEN. Token můžete například uložit do značky HTML meta:

<meta name="csrf-token" content="{{ csrf_token() }}">

Poté můžete knihovně, jako je jQuery, nařídit, aby automaticky přidala token do všech hlaviček požadavků. To poskytuje jednoduchou a pohodlnou ochranu CSRF pro vaše aplikace založené na AJAXu a využívající starší technologii JavaScript:

$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta').attr('content') }});

X-XSRF-TOKEN

Laravel ukládá aktuální token CSRF do šifrovaného souboru cookie XSRF-TOKEN, který je součástí každé odpovědi generované frameworkem. Hodnotu souboru cookie můžete použít k nastavení hlavičky požadavku X-XSRF-TOKEN.

Tento soubor cookie se odesílá především jako usnadnění pro vývojáře, protože některé rámce a knihovny JavaScriptu, například Angular a Axios, automaticky umisťují jeho hodnotu do hlavičky X-XSRF-TOKEN při požadavcích stejného původu.

Napsat komentář