Middleware ValidateCsrfToken
Middleware ValidateCsrfToken автоматически проверяет каждый POST, PUT, PATCH или DELETE запрос на наличие CSRF-токена в заголовке или теле запроса. Если токен отсутствует или не совпадает с токеном сессии, middleware возвращает ответ с ошибкой 419 (Page Expired). Проверка выполняется для всех маршрутов, кроме тех, которые явно исключены в свойстве $except.
Расположение
Middleware находится в файле:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class ValidateCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array<int, string>
*/
protected $except = [
//
];
}
Синтаксис
<?php
class ValidateCsrfToken extends Middleware
{
protected $except = [
'api/*',
'webhook/*',
];
}
Регистрация middleware
Middleware уже зарегистрирован в ядре HTTP по умолчанию. Его можно найти в файле:
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* @var array<int, class-string|string>
*/
protected $middleware = [
// ...
\App\Http\Middleware\ValidateCsrfToken::class,
// ...
];
}
Пример исключения маршрутов
Давайте исключим все маршруты, начинающиеся с api и webhook, чтобы не проверять CSRF-токен для внешних сервисов:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class ValidateCsrfToken extends Middleware
{
protected $except = [
'api/*',
'webhook/*',
'payment/callback',
];
}
Пример использования в форме
Для отправки POST-запроса необходимо добавить CSRF-токен в HTML-форму с помощью директивы @csrf:
<form method="POST" action="/submit">
@csrf
<input type="text" name="name" placeholder="Enter name">
<button type="submit">Submit</button>
</form>
Пример проверки токена в JavaScript
При отправке AJAX-запросов токен можно передавать в заголовке X-CSRF-TOKEN:
<meta name="csrf-token" content="{{ csrf_token() }}">
<script>
const token = document.querySelector('meta[name="csrf-token"]').content;
fetch('/api/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': token
},
body: JSON.stringify({ key: 'value' })
});
</script>
Пример обработки ошибки
При неверном или отсутствующем токене middleware автоматически возвращает ответ 419:
<?php
use Illuminate\Support\Facades\Route;
Route::post('/submit', function () {
return 'Form submitted successfully';
});
Результат выполнения кода при отправке запроса без токена:
"419 Page Expired"
Пример отключения для конкретных маршрутов
Иногда требуется отключить проверку CSRF для отдельных маршрутов через свойство $except в классе middleware:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class ValidateCsrfToken extends Middleware
{
protected $except = [
'api/webhook',
'payment/success',
'payment/cancel',
];
}
Смотрите также
-
метод
handle,
который обрабатывает входящий запрос в middleware -
метод
terminate,
который выполняется после отправки ответа клиенту -
класс
EncryptCookies,
который шифрует и расшифровывает куки -
класс
TrimStrings,
который обрезает пробелы во входящих данных