Членове

Laravel Web Security: Какво е Cross-Site Request Forgery (CSRF)?

В този урок на Laravel говорим за уеб сигурността и как да защитим уеб приложение от Cross-Site Request Forgery или CSRF атаки.

CSRF е злонамерена дейност, извършвана от нападател, който извършва действия от името на удостоверен потребител, вредни за уеб сигурността. За щастие Laravel предоставя инструментите за предотвратяване на този тип уязвимост.

Какво е CSRF?

CSRF атаките отвличат потребителски сесии. Те правят това, като подмамват потребителя да изпрати заявка чрез скрити тагове на формуляр или злонамерени URL адреси (изображения или връзки) без знанието на потребителя.

Тази атака води до промяна в състоянието на потребителската сесия, изтичане на данни и понякога хакерите могат да манипулират данните на крайния потребител в приложение.

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

Как да предотвратите CSRF заявки

За подобряване на сигурност уеб на вашите приложения, във всяка потребителска сесия Laravel генерира защитени токени, които използва, за да гарантира, че удостовереният потребител е този, който иска приложението.

Тъй като този токен се променя всеки път, когато потребителска сесия се регенерира, нападателят няма достъп до него.

Всеки път, когато има заявка за промяна на потребителската информация от страна на сървъра (backend), като POSTPUTPATCHDELETE, трябва да включите директивата @csrf във формата за заявка blade HTML. The @csrf следователно е директива Blade използвани за генериране на скрит токен, валидиран от приложението.

Директивата Blade е синтаксисът, използван в шаблонния механизъм на Laravel, наречен Острие . За създаване на файл blade трябва да му дадете име – в нашия случай форма – последвано от разширението на острието. Това означава, че файлът ще има името form.blade.php.

Файлът е използван blade за изобразяване на изгледи за потребителите на уеб страницата. Има няколко предварителни указанияdefinite или 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. The middleware е регистриран в Kernel.php и се намира в указателя app/Http/Middleware. Това означава, че middleware задейства се за заявки в мрежата, които не са свързани с API.

protected $middlewareGroups = [
        'web' => [
           .
           .
           .
           .
           .
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    ];

Мидълуерът VerifyCsrfToken разширява класа Illuminate\Foundation\Http\Middleware\VerifyCsrfToken, т.е. CSRF проверката е definite в рамките на класа.

Нека се задълбочим, за да разберем как 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

Иновационен бюлетин
Не пропускайте най-важните новини за иновациите. Регистрирайте се, за да ги получавате по имейл.

Последни статии

Иновативна намеса в добавената реалност с Apple Viewer в поликлиниката в Катания

Операция по офталмопластика с помощта на търговския зрител Apple Vision Pro беше извършена в поликлиниката в Катания...

3 май 2024

Предимствата на страниците за оцветяване за деца - свят на магия за всички възрасти

Развитието на фини двигателни умения чрез оцветяване подготвя децата за по-сложни умения като писане. Оцветявам…

2 май 2024

Бъдещето е тук: Как корабната индустрия революционизира глобалната икономика

Военноморският сектор е истинска световна икономическа сила, която се е насочила към пазар от 150 милиарда...

1 май 2024

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

Миналия понеделник Financial Times обяви сделка с OpenAI. FT лицензира своята журналистика от световна класа...

30 април 2024

Прочетете Иновация на вашия език

Иновационен бюлетин
Не пропускайте най-важните новини за иновациите. Регистрирайте се, за да ги получавате по имейл.

Следвайте ни