CSRF е злонамерена дейност, извършвана от нападател, който извършва действия от името на удостоверен потребител, вредни за уеб сигурността. За щастие Laravel предоставя инструментите за предотвратяване на този тип уязвимост.
CSRF атаките отвличат потребителски сесии. Те правят това, като подмамват потребителя да изпрати заявка чрез скрити тагове на формуляр или злонамерени URL адреси (изображения или връзки) без знанието на потребителя.
Тази атака води до промяна в състоянието на потребителската сесия, изтичане на данни и понякога хакерите могат да манипулират данните на крайния потребител в приложение.
Изображението по-горе илюстрира сценарий, при който уеб сигурността е нарушена. Жертвата изпраща заявка, като щракне върху връзка (получена), изпраща заявка до сървър на уебсайт, който ще произведе ефекти, желани от хакера, който влиза във владение на информацията, полезна за достъп и манипулиране на сървъра на уебсайта.
За подобряване на сигурност уеб на вашите приложения, във всяка потребителска сесия Laravel генерира защитени токени, които използва, за да гарантира, че удостовереният потребител е този, който иска приложението.
Тъй като този токен се променя всеки път, когато потребителска сесия се регенерира, нападателят няма достъп до него.
Всеки път, когато има заявка за промяна на потребителската информация от страна на сървъра (backend), като POST
, PUT
, PATCH
e DELETE
, трябва да включите директивата @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.
Мидълуерът 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 токени съвпадат.
Функцията прави две неща:
$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 Vision Pro беше извършена в поликлиниката в Катания...
Развитието на фини двигателни умения чрез оцветяване подготвя децата за по-сложни умения като писане. Оцветявам…
Военноморският сектор е истинска световна икономическа сила, която се е насочила към пазар от 150 милиарда...
Миналия понеделник Financial Times обяви сделка с OpenAI. FT лицензира своята журналистика от световна класа...