CSRF - гэта зламысная дзейнасць, якая выконваецца зламыснікам, які выконвае дзеянні ад імя аўтэнтыфікаванага карыстальніка, якія наносяць шкоду вэб-бяспецы. На шчасце, Laravel забяспечвае інструменты для прадухілення такога тыпу ўразлівасці.
Атакі CSRF захопліваюць сеансы карыстальнікаў. Яны робяць гэта, прымушаючы карыстальніка адправіць запыт праз схаваныя тэгі формы або шкоднасныя URL (малюнкі або спасылкі) без ведама карыстальніка.
Гэтая атака прыводзіць да змены стану сеансу карыстальніка, уцечкі даных, і часам хакеры могуць маніпуляваць дадзенымі канчатковага карыстальніка ў дадатку.
Выява вышэй ілюструе сцэнар, калі бяспека ў Інтэрнэце парушана. Ахвяра адпраўляе запыт, націскаючы на спасылку (атрымана), адпраўляючы запыт на сервер вэб-сайта, які прывядзе да жаданага хакерам эфекту, які атрымлівае інфармацыю, карысную для доступу да сервера вэб-сайта і маніпулявання ім.
Каб палепшыць бяспеку Інтэрнэт вашых прыкладанняў, у кожным карыстальніцкім сеансе Laravel генеруе бяспечныя токены, якія ён выкарыстоўвае, каб пераканацца, што аўтэнтыфікаваны карыстальнік з'яўляецца тым, хто запытвае прыкладанне.
Паколькі гэты токен змяняецца пры кожным аднаўленні сеансу карыстальніка, зламыснік не можа атрымаць да яго доступ.
Кожны раз, калі ёсць запыт на змяненне інфармацыі карыстальніка на баку сервера (бэкэнд), як POST
, PUT
, PATCH
e DELETE
, вы павінны ўключыць дырэктыву @csrf
у форме запыту blade
HTML. The @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. 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 для параўнання, ці роўныя абодва радкі. Вынік гэтай аперацыі ёсць заўсёды Бул (праўда) або (хлусня) .
Ercole Palmeri
У мінулы панядзелак Financial Times абвясціла аб здзелцы з OpenAI. FT ліцэнзуе сваю журналістыку сусветнага ўзроўню...
Мільёны людзей плацяць за струменевыя паслугі, плацячы штомесячную абаненцкую плату. Распаўсюджана меркаванне, што вы…
Coveware ад Veeam працягне прадастаўляць паслугі рэагавання на інцыдэнты кібервымагальніцтва. Coveware будзе прапаноўваць судова-медыцынскую экспертызу і магчымасці выпраўлення…
Прагнастычнае тэхнічнае абслугоўванне рэвалюцыянізуе нафтагазавы сектар з інавацыйным і актыўным падыходам да кіравання заводам.…