- CSRF-защита
- Введение
- Исключение URI из CSRF-защиты
- X-CSRF-TOKEN
- X-XSRF-TOKEN
- Комментарии (7)
- Laravel Framework Russian Community
- Пролог
- Начало работы
- Архитектурные концепции
- Основное
- Погружение
- Безопасность
- База данных
- Eloquent ORM
- Тестирование
- Пакеты
- Предотвращение атак CSRF
- Введение
- Объяснение уязвимости
- Предотвращение запросов от CSRF
- CSRF-токены и SPA-приложения
- Исключение URI из защиты от CSRF
- Токен X-CSRF
- Токен X-XSRF
- Laravel 5.2: токен csrf не работает
- Решение
- Другие решения
- Laravel 8 · Предотвращение атак CSRF
- Введение
- Объяснение уязвимости
- Предотвращение запросов от CSRF
- CSRF-токены и SPA-приложения
- Исключение URI из защиты от CSRF
- Токен X-CSRF
- Токен X-XSRF
CSRF-защита
CSRF Protection →
Введение
Laravel автоматически генерирует CSRF-«токен» для каждой активной пользовательской сессии в приложении. Этот токен используется для проверки того, что именно авторизованный пользователь делает запрос в приложение.
При определении каждой HTML-формы вы должны включать в неё скрытое поле CSRF-токена, чтобы посредник CSRF-защиты мог проверить запрос. Вы можете использовать вспомогательную функцию PHP csrf_field () для генерирования поля токена:
Посредник PHP VerifyCsrfToken , входящий в группу посредников web , автоматически проверяет совпадение токена в данных запроса с токеном, хранящимся в сессии.
Исключение URI из CSRF-защиты
Иногда бывает необходимо исключить набор URI из-под CSRF-защиты. Например, если вы используете Stripe для обработки платежей и применяете их систему веб-хуков (hook), то вам надо исключить маршрут вашего обработчика веб-хуков Stripe из-под CSRF-защиты, так как Stripe не будет знать, какой CSRF-токен надо послать в ваш маршрут.
Обычно такие маршруты помещаются вне группы посредников web , которую PHP RouteServiceProvider применяет ко всем маршрутам в файле routes/web.php . Но вы также можете исключить маршруты, добавив их URI в свойство PHP $except посредника PHP VerifyCsrfToken :
X-CSRF-TOKEN
Помимо проверки CSRF-токена как POST-параметра, посредник PHP VerifyCsrfToken будет также проверять заголовок запроса X-CSRF-TOKEN . Например, вы можете хранить токен в HTML-теге meta :
После создания тега meta вы можете указать библиотеке, такой как jQuery, автоматически добавлять токен в заголовки всех запросов. Это обеспечивает простую, удобную CSRF-защиту для ваших приложений на базе AJAX:
X-XSRF-TOKEN
Laravel хранит текущий CSRF-токен в cookie XSRF-TOKEN , которую включается в каждый отклик, генерируемый фреймворком. Вы можете использовать значение cookie, чтобы задать заголовок запроса X-XSRF-TOKEN .
Этот cookie в основном посылается для удобства, потому что некоторые JavaScript-фреймворки, такие как Angular, автоматически помещают его значение в заголовок X-XSRF-TOKEN .
Комментарии (7)
не поняла немного. что означает : «Посредник VerifyCsrfToken, входящий в группу посредников web, автоматически проверяет совпадение токена в данных запроса с токеном, хранящимся в сессии»
понятие «токен в зданных запроса» откуда он берется?
Из поля в форме, которое генерируется PHP csrf_field () .
csrf_field() во вьюхе рендерится как
Встроил в форму предложенную функцию. Все равно форма не отправляется
Источник
Laravel Framework Russian Community
Пролог
Начало работы
Архитектурные концепции
Основное
Погружение
Безопасность
База данных
Eloquent ORM
Тестирование
Пакеты
Предотвращение атак CSRF
Введение
Межсайтовая подделка запроса – это разновидность вредоносного эксплойта, при котором неавторизованные команды выполняются от имени аутентифицированного пользователя. К счастью, Laravel позволяет легко защитить ваше приложение от Межсайтовой подделки запроса (Сross Site Request Forgery – CSRF).
Объяснение уязвимости
Если вы не знакомы с Межсайтовой подделкой запросов, то давайте обсудим пример того, как можно использовать эту уязвимость. Представьте, что ваше приложение имеет маршрут /user/email , который принимает POST -запрос для изменения адреса электронной почты аутентифицированного пользователя. Скорее всего, этот маршрут ожидает, что поле ввода email будет содержать адрес электронной почты, который пользователь хотел бы начать использовать.
Без защиты от CSRF вредоносный веб-сайт может создать HTML-форму, которая указывает на маршрут вашего приложения /user/email и отправляет собственный адрес электронной почты злоумышленника:
Если вредоносный веб-сайт автоматически отправляет форму при загрузке страницы, злоумышленнику нужно только подтолкнуть ничего не подозревающего пользователя вашего приложения посетить свой веб-сайт, и его адрес электронной почты будет изменен в вашем приложении.
Чтобы предотвратить эту уязвимость, нам необходимо проверять каждый входящий запрос POST , PUT , PATCH , или DELETE на секретное значение сессии, к которому вредоносное приложение не может получить доступ.
Предотвращение запросов от CSRF
Laravel автоматически генерирует «токен» CSRF для каждой активной пользовательской сессии, управляемой приложением. Этот токен используется для проверки того, что аутентифицированный пользователь действительно является лицом, выполняющим запросы к приложению. Поскольку этот токен хранится в сессии пользователя и изменяется каждый раз при повторном создании сессии, вредоносное приложение не может получить к нему доступ.
К CSRF-токену текущей сессии можно получить доступ через сессию запроса или с помощью глобального помощника csrf_token :
Каждый раз, когда вы создаете HTML-форму в своем приложении, вы должны включать в форму скрытое поле _token CSRF, чтобы посредник CSRF мог проверить запрос. Для удобства вы можете использовать директиву Blade @csrf для создания скрытого поля ввода, содержащего токен:
Посредник App\Http\Middleware\VerifyCsrfToken , который по умолчанию стоит в группе посредников web , автоматически проверяет соответствие токена во входном запросе и токен, хранящийся в сессии. Когда эти два токена совпадают, мы знаем, что запрос инициирует аутентифицированный пользователь.
CSRF-токены и SPA-приложения
Если вы создаете SPA, который использует Laravel в качестве серверной части API, вам следует обратиться к документации Laravel Sanctum для получения информации об аутентификации с помощью вашего API и защите от уязвимостей CSRF.
Исключение URI из защиты от CSRF
По желанию можно исключить набор URI из защиты от CSRF. Например, если вы используете Stripe для обработки платежей и используете их систему веб-хуков, вам нужно будет исключить маршрут обработчика веб-хуков Stripe из защиты от CSRF, поскольку Stripe не будет знать, какой токен CSRF отправить вашим маршрутам.
Как правило, вы должны размещать эти виды маршрутов вне группы посредников web , которую App\Providers\RouteServiceProvider применяет ко всем маршрутам в файле routes/web.php . Однако, вы также можете исключить маршруты, добавив их URI в свойство $except посредника VerifyCsrfToken :
Для удобства посредник CSRF автоматически отключается для всех маршрутов при выполнение тестов.
Токен X-CSRF
В дополнение к проверке токена CSRF в качестве параметра POST-запроса посредник App\Http\Middleware\VerifyCsrfToken также проверяет заголовок запроса X-CSRF-TOKEN . Вы можете, например, сохранить токен в HTML-теге meta :
Затем, вы можете указать библиотеке, такой как jQuery, автоматически добавлять токен во все заголовки запросов. Это обеспечивает простую и удобную защиту от CSRF для ваших приложений с использованием устаревшей технологии JavaScript на основе AJAX:
Токен X-XSRF
Laravel хранит текущий токен CSRF в зашифрованном файле Cookies XSRF-TOKEN , который содержится в каждом ответе, генерируемым фреймворком. Вы можете использовать значение Cookies для установки заголовка запроса X-XSRF-TOKEN .
Этот файл Cookies, в первую очередь, отправляется для удобства разработчика, поскольку некоторые фреймворки и библиотеки JavaScript, такие как Angular и Axios, автоматически помещают его значение в заголовок X-XSRF-TOKEN в запросах с одним и тем же источником.
Источник
Laravel 5.2: токен csrf не работает
Привет. Почему значение моего токена csrf равно нулю? И когда я не использую токен, у меня нет TokenMismatchException . как я могу это исправить?
Я копнул глубже и обнаружил, что сеанс не регистрируется в SessionServiceProvider. Есть ли что-то, что нужно включить, чтобы это работало по умолчанию? Так как я новичок в Laravel, я не уверен, как последовать совету выше. Как мне убедиться, что мои маршруты добавлены в группу «Интернет»?
Решение
Убедитесь, что ваш маршрут имеет Web к нему применено мягкое программное обеспечение.
Практически на любом маршруте, где вам понадобятся сеансы, защита csrf, зашифрованные файлы cookie, ошибки сеансов и т. Д., Вам понадобится группа промежуточного программного обеспечения «web».
Проверьте ваш файл rout.php для группы маршрутов следующим образом:
Обновить: С 5.2.27 г. RouteServiceProvider теперь помещает все ваши маршруты в routes.php в группе маршрутов, которая имеет web промежуточное программное обеспечение применяется для вас.
Другие решения
В версии 5.2: вы перемещаете маршрут в:
Удостоверься что путь сеанса доступен для записи. Если нет, laravel сравнивает значение null (без маркера сеанса) со значением $ _POST [‘_ token’] и выдает ошибку несоответствия, несмотря на реальную причину.
Просто если кто-нибудь все еще решает эту проблему,
внутри конфиг / session.php мои сеансы практически не работали (хотя некоторое время они казались нормальными)
Убедитесь, чтодоменпеременная установлена в ноль!
Исправил все для меня, как ни одна из других вещей, где на самом деле моя проблема.
Надеюсь, это поможет кому-то.
Отредактируйте ваш VerifyCsrfToken.php из папки Middleware в эту
У меня та же проблема, что и у вас, я нахожусь на Laravel 5.2, у меня также есть поле токена в моей форме, но я все еще выдаю ошибку «TokenMismatch», очень раздражает, верно?
Я думаю, что это довольно глубокая проблема, так как может быть много причин.
Для меня я обновлялся с Laravel 5.1 до 5.2. Я также использую базу данных для хранения моих сессий.
Он выдавал мне эту ошибку, но когда я проверил журналы ошибок laravel (/ storage / logs), я обнаружил, что Laravel 5.2 ожидает, что в таблице сеансов есть поля user_id, ip_address и user_agent. Мой не сделал. Когда я добавил эти поля, все работало так же, как и до обновления.
Итак, мой совет, чтобы проверить журнал ошибок!
Этот ответ для всех людей, которые уже использовали << csrf_field() >>
после тег в их view.blade.php файл, а также запустить php artisan key:generate команда, но все еще получаю ошибку несоответствия токена. Это шаги, которые я предпринял, чтобы устранить ошибку TokenMismatchException для одного из моих проектов, который все еще находился в разработке.
Удалите файлы кэша из следующих двух папок в вашем проекте laravel:
- хранение / рамки / сессия /
- хранение / рамки / просмотров /
После удаления файлов кеша очистите кеш браузера.
Источник
Laravel 8 · Предотвращение атак CSRF
Введение
Межсайтовая подделка запроса – это разновидность вредоносного эксплойта, при котором неавторизованные команды выполняются от имени аутентифицированного пользователя. К счастью, Laravel позволяет легко защитить ваше приложение от Межсайтовой подделки запроса (Сross Site Request Forgery – CSRF).
Объяснение уязвимости
Если вы не знакомы с Межсайтовой подделкой запросов, то давайте обсудим пример того, как можно использовать эту уязвимость. Представьте, что ваше приложение имеет маршрут /user/email , который принимает POST -запрос для изменения адреса электронной почты аутентифицированного пользователя. Скорее всего, этот маршрут ожидает, что поле ввода email будет содержать адрес электронной почты, который пользователь хотел бы начать использовать.
Без защиты от CSRF вредоносный веб-сайт может создать HTML-форму, которая указывает на маршрут вашего приложения /user/email и отправляет собственный адрес электронной почты злоумышленника:
Если вредоносный веб-сайт автоматически отправляет форму при загрузке страницы, злоумышленнику нужно только подтолкнуть ничего не подозревающего пользователя вашего приложения посетить свой веб-сайт, и его адрес электронной почты будет изменен в вашем приложении.
Чтобы предотвратить эту уязвимость, нам необходимо проверять каждый входящий запрос POST , PUT , PATCH , или DELETE на секретное значение сессии, к которому вредоносное приложение не может получить доступ.
Предотвращение запросов от CSRF
Laravel автоматически генерирует «токен» CSRF для каждой активной пользовательской сессии, управляемой приложением. Этот токен используется для проверки того, что аутентифицированный пользователь действительно является лицом, выполняющим запросы к приложению. Поскольку этот токен хранится в сессии пользователя и изменяется каждый раз при повторном создании сессии, вредоносное приложение не может получить к нему доступ.
К CSRF-токену текущей сессии можно получить доступ через сессию запроса или с помощью глобального помощника csrf_token :
Каждый раз, когда вы создаете HTML-форму в своем приложении, вы должны включать в форму скрытое поле _token CSRF, чтобы посредник CSRF мог проверить запрос. Для удобства вы можете использовать директиву Blade @csrf для создания скрытого поля ввода, содержащего токен:
Посредник App\Http\Middleware\VerifyCsrfToken , который по умолчанию стоит в группе посредников web , автоматически проверяет соответствие токена во входном запросе и токен, хранящийся в сессии. Когда эти два токена совпадают, мы знаем, что запрос инициирует аутентифицированный пользователь.
CSRF-токены и SPA-приложения
Если вы создаете SPA, который использует Laravel в качестве серверной части API, вам следует обратиться к документации Laravel Sanctum для получения информации об аутентификации с помощью вашего API и защите от уязвимостей CSRF.
Исключение URI из защиты от CSRF
По желанию можно исключить набор URI из защиты от CSRF. Например, если вы используете Stripe для обработки платежей и используете их систему веб-хуков, вам нужно будет исключить маршрут обработчика веб-хуков Stripe из защиты от CSRF, поскольку Stripe не будет знать, какой токен CSRF отправить вашим маршрутам.
Как правило, вы должны размещать эти виды маршрутов вне группы посредников web , которую App\Providers\RouteServiceProvider применяет ко всем маршрутам в файле routes/web.php . Однако, вы также можете исключить маршруты, добавив их URI в свойство $except посредника VerifyCsrfToken :
Для удобства посредник CSRF автоматически отключается для всех маршрутов при выполнение тестов.
Токен X-CSRF
В дополнение к проверке токена CSRF в качестве параметра POST-запроса посредник App\Http\Middleware\VerifyCsrfToken также проверяет заголовок запроса X-CSRF-TOKEN . Вы можете, например, сохранить токен в HTML-теге meta :
Затем, вы можете указать библиотеке, такой как jQuery, автоматически добавлять токен во все заголовки запросов. Это обеспечивает простую и удобную защиту от CSRF для ваших приложений с использованием устаревшей технологии JavaScript на основе AJAX:
Токен X-XSRF
Laravel хранит текущий токен CSRF в зашифрованном файле Cookies XSRF-TOKEN , который содержится в каждом ответе, генерируемым фреймворком. Вы можете использовать значение Cookies для установки заголовка запроса X-XSRF-TOKEN .
Этот файл Cookies, в первую очередь, отправляется для удобства разработчика, поскольку некоторые фреймворки и библиотеки JavaScript, такие как Angular и Axios, автоматически помещают его значение в заголовок X-XSRF-TOKEN в запросах с одним и тем же источником.
Источник