CSRF защита

Содержание:


Введение

Laravel делает защиту от межсайтовой подделки запроса (от англ. Сross Site Request Forgery CSRF) простой. Подделка запроса — это такой тип атаки, когда неавторизированные команды представляются так, словно они поступают от авторизированного пользователя.

Ларавел автоматически генерирует CSRF "токен" для каждой сессии пользователя. Этот токен используется для верификации того, что именно авторизированный пользователь делает запросы в приложении.

Для любой формы в вашем приложении, вы должны включать спрятанное CSRF-токен поле в форму, чтобы на уровне посредника можно было проверить запрос. Для этого необходимо использовать команду Blade @csrf, чтобы сгенерировать такое поле:

<form method='POST' action='/profile'>
    @csrf
    ...
</form>

Посредник VerifyCsrfToken, который включён в группу посредников "web", автоматически проведёт верификацию того, что токен в запросе совпадает с токенов в сессии.

CSRF Tokens & JavaScript

При проектировании JavaScript приложений, очень удобно иметь собственную JavaScript HTTP библиотеку, которая автоматически прикрепляет CSRF токен для каждого исходящего запроса. По умолчанию, файл resources/js/bootstrap.js регистрирует значение мета-тега csrf-token с помощью HTTP библиотеки Axios. Если вы не используете эту библиотеку, вам необходимо вручную настроить такое поведение для вашего приложения.


Исключающий URIs

Иногда вы можете захотеть отключить набор URI от CSRF защиты. Например, если вы используете Stripe для проведения платежей. Понадобится отключить обработчик от CSRF защиты в силу того, что Stripe не знает какой CSRF токен отсылать на ваш маршрут.

Обычно, такие типы маршрутов необходимо выносить из группы web, которые RouteServiceProvider применяет для всех маршрутов в файле routes/web.php. Также вы можете исключить маршруты путём добавления их URI в свойство $except посредника VerifyCsrfToken:

namespace 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 = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}
CSRF защита автоматически отключается при тестировании.

X-CSRF-Token

В дополнение, чтобы проверять на наличие CSRF токена как параметр POST, посредник VerifyCsrfToken будет проверять запрос на заголовок X-CSRF-TOKEN. Вы можете, например, сохранить токен в мета теге HTML:

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

Потом, с момента как вы создали тег meta, вы можете научить библиотеку, такую как jQuery, автоматически добавлять токен для всех заголовков запросов. Это обеспечит простую и надёжную CSRF защиту для ваших приложений, основанных на AJAX:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
По умолчанию, файл resources/js/bootstrap.js регистрирует значение мета тега csrf-токена с помощью Axios HTTP библиотеки. Если вы не используете данную библиотеку, вам необходимо вручную настроить такое поведения для вашего приложения.

X-XSRF-Token

Ларавел хранит текущий CSRF-токен в XSRF-TOKEN в куки, которые включены в каждый ответ сгенерированный фреймворком. Вы можете использовать значение куки, чтобы установить X-XSRF-TOKEN заголовки запроса.

Такие куки отправляются скорее для удобства, потому что JavaScript фреймворки и библиотеки такие как Angular и Axios, автоматически размещают значение в заголовке X-XSRF-TOKEN