CSRF — это вредоносная активность, выполняемая злоумышленником, который выполняет действия от имени аутентифицированного пользователя, наносящие ущерб веб-безопасности. К счастью, Laravel предоставляет инструменты для предотвращения уязвимостей такого типа.
CSRF-атаки перехватывают сеансы пользователей. Они делают это, обманом заставляя пользователя отправить запрос через скрытые теги формы или вредоносные URL-адреса (изображения или ссылки) без ведома пользователя.
Эта атака приводит к изменению состояния сеанса пользователя, утечке данных, а иногда хакеры могут манипулировать данными конечного пользователя в приложении.
На изображении выше показан сценарий, в котором веб-безопасность нарушена. Жертва отправляет запрос, нажав на ссылку (получена), отправляя запрос на сервер веб-сайта, что приведет к желаемому эффекту хакером, который получает информацию, полезную для доступа и манипулирования сервером веб-сайта.
Для улучшения безопасность web ваших приложений, в каждом пользовательском сеансе Laravel генерирует безопасные токены, которые он использует, чтобы гарантировать, что аутентифицированный пользователь является тем, кто запрашивает приложение.
Поскольку этот токен меняется каждый раз, когда пользовательский сеанс создается повторно, злоумышленник не может получить к нему доступ.
Всякий раз, когда есть запрос на изменение информации о пользователе на стороне сервера (бэкэнд), например POST
, PUT
, PATCH
e DELETE
, вы должны включить директиву @csrf
в форме запроса blade
HTML. @csrf
поэтому это директива Blade
используется для создания скрытого токена, проверяемого приложением.
Директива Blade
это синтаксис, используемый в механизме шаблонов Laravel, который называется Лезвие . Чтобы создать файл blade
вы должны дать ему имя — в нашем случае форму — а затем расширение лезвия. Это означает, что файл будет иметь имя form.blade.php
.
Файл используется blade
для отображения представлений пользователей на веб-странице. Есть несколько предварительных директивdefiсокращенный синтаксис nite или blade, который вы можете использовать. Например, @if
проверить, выполняется ли условие, @empty
проверьте, не пусты ли записи, @auth
проверить, аутентифицирован ли пользователь и так далее.
Но вернемся к директиве @csrf
. Вот как вы его используете:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Предыдущие версии Laravel имели другую настройку: они обе работают и делают одно и то же.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Когда токен CSRF отсутствует в отправляемом запросе формы или он кажется недействительным, Laravel выдает сообщение об ошибке «Срок действия страницы истек» с кодом состояния 419.
Промежуточное ПО VerifyCsrfToken
обрабатывает проверку CSRF в приложении Laravel. middleware
зарегистрирован в Kernel.php
и находится в каталоге app/Http/Middleware
. Это означает, что middleware
он запускается для запросов в Интернете, не связанных с API.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
Промежуточное ПО VerifyCsrfToken расширяет класс Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, т. е. проверка CSRF defiночь в классе.
Давайте копнем глубже, чтобы узнать, как Laravel обрабатывает проверку CSRF.
Внутри класса у нас есть функция tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
в коде определяет, совпадают ли сеанс и входные токены CSRF.
Функция делает две вещи:
$this->getTokenFromRequest
токен из входящего запроса, прикрепленный через скрытое поле или заголовок запроса. Токен расшифровывается, а затем возвращается в переменную токена.protected function getTokenFromRequest($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
try {
$token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
} catch (DecryptException $e) {
$token = '';
}
}
return $token;
}
В коде он получает токен из заголовка
2. Приведите токен запроса и сеанс к строке, а затем используйте hash_equals
встроенный в PHP для сравнения, равны ли обе строки. Результат этой операции всегда bool (истина) или (ложь) .
Ercole Palmeri
Развитие мелкой моторики посредством раскрашивания готовит детей к более сложным навыкам, таким как письмо. Раскрасить…
Военно-морской сектор является настоящей глобальной экономической державой, которая достигла 150-миллиардного рынка...
В прошлый понедельник Financial Times объявила о сделке с OpenAI. FT лицензирует свою журналистику мирового уровня…
Миллионы людей платят за стриминговые сервисы, выплачивая ежемесячную абонентскую плату. Распространено мнение, что вы…