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>
Ларавелдің алдыңғы нұсқаларында басқа орнату болды: екеуі де жұмыс істейді және бірдей нәрсені жасайды.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Жіберіліп жатқан пішін сұрауында CSRF таңбалауышы болмаған кезде немесе ол жарамсыз болып көрінсе, Laravel 419 күй коды бар «Бет мерзімі бітті» қате хабарын шығарады.
Орташа бағдарламалық құрал VerifyCsrfToken
Laravel қолданбасында CSRF тексеруін өңдейді. The 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 өзінің әлемдік деңгейдегі журналистикасына лицензия береді…
Миллиондаған адамдар ай сайынғы абоненттік төлемді төлей отырып, ағынды қызметтерге ақы төлейді. Жалпы пікір, сіз…