CSRF estas malica agado farita de atakanto, kiu faras agojn nome de aŭtentikigita uzanto, malutilaj al la retejo-sekureco. Feliĉe, Laravel provizas la ilojn por malhelpi ĉi tiun tipon de vundebleco.
CSRF atakas kaperi uzantsesiojn. Ili faras tion trompante uzanton sendi peton per kaŝitaj formularaj etikedoj aŭ malicaj URL-oj (bildoj aŭ ligiloj) sen la scio de la uzanto.
Ĉi tiu atako kondukas al ŝanĝo en uzanta seanca stato, datumfluoj, kaj foje retpiratoj povas manipuli datumojn de finuzantoj en aplikaĵo.
La supra bildo ilustras scenaron kie interreta sekureco estas rompita. La viktimo sendas peton klakante sur ligilo (ricevita), sendante peton al reteja servilo, kiu produktos efikojn deziratajn de la retpirato, kiu venas en posedon de la informoj utilaj por aliri kaj manipuli la retejan servilon.
Por plibonigi la sekureco retejo de viaj aplikoj, en ĉiu uzantsesio, Laravel generas sekurajn ĵetonojn, kiujn ĝi uzas por certigi, ke la aŭtentikigita uzanto estas tiu, kiu petas la aplikaĵon.
Ĉar ĉi tiu signo ŝanĝiĝas ĉiufoje kiam uzantsesio estas regenerita, atakanto ne povas aliri ĝin.
Kiam ajn estas peto ŝanĝi uzantajn informojn ĉe servilo (backend) kiel POST
, PUT
, PATCH
e DELETE
, vi devas inkluzivi la direktivon @csrf
en la petoformularo blade
HTML. La @csrf
ĝi estas do direktivo Blade
uzata por generi kaŝitan ĵetonon validigita de la aplikaĵo.
La direktivo Blade
estas la sintakso uzata ene de la Laravel-ŝablona motoro nomita klingo . Por krei dosieron blade
vi devas doni al ĝi nomon - en nia kazo-formo - sekvitan de la etendo de la klingo. Ĉi tio signifas, ke la dosiero havos la nomon form.blade.php
.
La dosiero estas uzata blade
por prezenti vidojn por uzantoj sur la retpaĝo. Estas kelkaj antaŭdirektilojdefinite aŭ blade stenografio sintakso vi povas uzi. Ekzemple, @if
kontroli ĉu kondiĉo estas kontentigita, @empty
kontrolu ĉu la rekordoj ne estas malplenaj, @auth
kontroli ĉu uzanto estas aŭtentikigita kaj tiel plu.
Sed ni reiru al la direktivo @csrf
. Jen kiel vi uzas ĝin:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Antaŭaj versioj de Laravel havis malsaman aranĝon: ili ambaŭ funkcias kaj faras la saman aferon.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Kiam la CSRF-ĵetono mankas el la formulara peto sendita aŭ se ĝi ŝajnas nevalida, Laravel ĵetas erarmesaĝon "Paĝo Eksvalidita" kun 419-statusa kodo.
La mezvaro VerifyCsrfToken
pritraktas CSRF-konfirmon ene de la Laravel-aplikaĵo. La middleware
estas registrita en Kernel.php
kaj troviĝas en la dosierujo app/Http/Middleware
. Ĉi tio signifas, ke la middleware
ĝi estas ekigita por petoj ene de la reto, ne rilata al la APIoj.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
La mezprogramo VerifyCsrfToken etendas la klason Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, t.e. CSRF-konfirmo estas definite ene de la klaso.
Ni fosu pli profunde por ekscii kiel Laravel pritraktas CSRF-konfirmon.
Ene de la klaso, ni havas la funkcion tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
en la kodo determinas ĉu la sesio kaj la enigo CSRF-ĵetonoj kongruas.
La funkcio faras du aferojn:
$this->getTokenFromRequest
la ĵetono de la envenanta peto alfiksita per kaŝita kampo aŭ la petokapo. La ĵetono estas deĉifrita kaj poste resendita al la ĵetono-variablo.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;
}
En la kodo ĝi ricevas ĵetonon de kaplinio
2. Ĵetu kaj la petoĵetonon kaj la seancon al ŝnuro kaj poste uzu hash_equals
konstruita en PHP por kompari se ambaŭ ĉenoj estas egalaj. La rezulto de ĉi tiu operacio estas ĉiam bool (vera) aŭ (malvera) .
Ercole Palmeri
Pasintlunde, la Financial Times anoncis interkonsenton kun OpenAI. FT licencas sian mondklasan ĵurnalismon...
Milionoj da homoj pagas por streaming-servoj, pagante monatajn abonkotizojn. Estas komuna opinio, ke vi...
Coveware de Veeam daŭre liveros servojn de respondaj incidentoj pri ciberĉantaĝo. Coveware ofertos krimmedicinajn kaj solvajn kapablojn...
Prognoza prizorgado revolucias la petrolon kaj gasan sektoron, kun noviga kaj iniciatema aliro al plantadministrado...