Может войдёшь?
Черновики Написать статью Профиль

CSRF-защита

перевод документация 5.х

  1. 1. Введение
  2. 2. Исключение URI из CSRF-защиты
  3. 3. X-CSRF-TOKEN
  4. 4. X-XSRF-TOKEN
Этот перевод актуален для англоязычной документации на (ветка 5.3). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

Laravel позволяет легко защитить ваше приложение от атак с подделкой межсайтовых запросов (CSRF). Подделка межсайтовых запросов — тип атаки на сайты, при котором несанкционированные команды выполняются от имени аутентифицированного пользователя.

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

При определении каждой HTML-формы вы должны включать в неё скрытое поле CSRF-токена, чтобы посредник CSRF-защиты мог проверить запрос. Вы можете использовать вспомогательную функцию PHPcsrf_field() для генерирования поля токена:

PHP
<form method="POST" action="/profile">
  {{ 
csrf_field() }}
  ...
</
form>

Посредник PHPVerifyCsrfToken, входящий в группу посредников web, автоматически проверяет совпадение токена в данных запроса с токеном, хранящимся в сессии.

Исключение URI из CSRF-защиты

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

Обычно такие маршруты помещаются вне группы посредников web, которую PHPRouteServiceProvider применяет ко всем маршрутам в файле routes/web.php. Но вы также можете исключить маршруты, добавив их URI в свойство PHP$except посредника PHPVerifyCsrfToken:

PHP
<?php

namespace App\Http\Middleware;

use 
Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class 
VerifyCsrfToken extends BaseVerifier
{
  
/**
   * URI, которые надо исключить из CSRF-проверки.
   *
   * @var array
   */
  
protected $except = [
    
'stripe/*',
  ];
}

X-CSRF-TOKEN

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

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

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

PHP
$.ajaxSetup({
  
headers: {
    
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
});

X-XSRF-TOKEN

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

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

Как вы считаете, полезен ли этот материал? Да Нет

Комментарии (7)

olko

не поняла немного. что означает : «Посредник VerifyCsrfToken, входящий в группу посредников web, автоматически проверяет совпадение токена в данных запроса с токеном, хранящимся в сессии»
понятие «токен в зданных запроса» откуда он берется?

Proger_XP

Из поля в форме, которое генерируется PHPcsrf_field().

cyberJet

csrf_field() во вьюхе рендерится как <input type="hidden" name="_token" value="значение токен">

SZV

Встроил в форму предложенную функцию. Все равно форма не отправляется
<form action="/comments" method="POST">
csrf_field()
Понятно, что в web прописано
Route::post('/comments',function() {
print_r($_POST);
});

Но форма все равно не отправляется
Ошибка
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
No message

Akkurat

так ты заверни 'comments' и 'csrf_field' в {{}}

Morry

Если версия Лары 5.7, то после тега формы попробуй добавить @method('post')

witaminabc

вид наверное был создан просто как .php без добавления .blade

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.