товары

Laravel Web Security: что такое подделка межсайтовых запросов (CSRF)?

В этом руководстве по Laravel мы поговорим о веб-безопасности и о том, как защитить веб-приложение от подделки межсайтовых запросов или атак CSRF.

CSRF — это вредоносная активность, выполняемая злоумышленником, который выполняет действия от имени аутентифицированного пользователя, наносящие ущерб веб-безопасности. К счастью, Laravel предоставляет инструменты для предотвращения уязвимостей такого типа.

Что такое CSRF?

CSRF-атаки перехватывают сеансы пользователей. Они делают это, обманом заставляя пользователя отправить запрос через скрытые теги формы или вредоносные URL-адреса (изображения или ссылки) без ведома пользователя.

Эта атака приводит к изменению состояния сеанса пользователя, утечке данных, а иногда хакеры могут манипулировать данными конечного пользователя в приложении.

На изображении выше показан сценарий, в котором веб-безопасность нарушена. Жертва отправляет запрос, нажав на ссылку (получена), отправляя запрос на сервер веб-сайта, что приведет к желаемому эффекту хакером, который получает информацию, полезную для доступа и манипулирования сервером веб-сайта.

Как предотвратить запросы CSRF

Для улучшения безопасность web ваших приложений, в каждом пользовательском сеансе Laravel генерирует безопасные токены, которые он использует, чтобы гарантировать, что аутентифицированный пользователь является тем, кто запрашивает приложение.

Поскольку этот токен меняется каждый раз, когда пользовательский сеанс создается повторно, злоумышленник не может получить к нему доступ.

Всякий раз, когда есть запрос на изменение информации о пользователе на стороне сервера (бэкэнд), например POSTPUTPATCHDELETE, вы должны включить директиву @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.

Как и где происходит проверка CSRF

Промежуточное ПО 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.

Функция делает две вещи:

  1. получать $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

Инновационный бюллетень
Не пропустите самые важные новости об инновациях. Зарегистрируйтесь, чтобы получать их по электронной почте.

АРТИКОЛИ recenti

Преимущества раскрасок для детей — мир волшебства для всех возрастов

Развитие мелкой моторики посредством раскрашивания готовит детей к более сложным навыкам, таким как письмо. Раскрасить…

2 мая 2024

Будущее уже здесь: как судоходная отрасль меняет мировую экономику

Военно-морской сектор является настоящей глобальной экономической державой, которая достигла 150-миллиардного рынка...

1 мая 2024

Издатели и OpenAI подписывают соглашения, регулирующие поток информации, обрабатываемой искусственным интеллектом.

В прошлый понедельник Financial Times объявила о сделке с OpenAI. FT лицензирует свою журналистику мирового уровня…

Апрель 30 2024

Онлайн-платежи: вот как потоковые сервисы заставляют вас платить вечно

Миллионы людей платят за стриминговые сервисы, выплачивая ежемесячную абонентскую плату. Распространено мнение, что вы…

Апрель 29 2024

Читайте «Инновации» на вашем языке

Инновационный бюллетень
Не пропустите самые важные новости об инновациях. Зарегистрируйтесь, чтобы получать их по электронной почте.

Следуйте за нами