Artikoloj

Laravel Web Security: Kio estas Cross-Site Request Forgery (CSRF)?

En ĉi tiu Laravel-lernilo ni parolas pri Reta Sekureco kaj kiel protekti TTT-aplikaĵon de Cross-Site Request Forgery aŭ CSRF-atakoj.

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.

Kio estas CSRF?

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.

Kiel malhelpi CSRF-petojn

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 POSTPUTPATCHDELETE, 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.

Informilo pri novigo
Ne maltrafu la plej gravajn novaĵojn pri novigado. Registriĝi por ricevi ilin retpoŝte.
<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.

Kiel kaj kie la CSRF-konfirmo okazas

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:

  1. akiri $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

Informilo pri novigo
Ne maltrafu la plej gravajn novaĵojn pri novigado. Registriĝi por ricevi ilin retpoŝte.

Lastaj artikoloj

Eldonistoj kaj OpenAI subskribas interkonsentojn por reguligi la fluon de informoj prilaboritaj de Artefarita Inteligenteco

Pasintlunde, la Financial Times anoncis interkonsenton kun OpenAI. FT licencas sian mondklasan ĵurnalismon...

30 aprilo 2024

Interretaj Pagoj: Jen Kiel Fluaj Servoj Faras Vin Pagi Eterne

Milionoj da homoj pagas por streaming-servoj, pagante monatajn abonkotizojn. Estas komuna opinio, ke vi...

29 aprilo 2024

Veeam havas la plej ampleksan subtenon por ransomware, de protekto ĝis respondo kaj reakiro

Coveware de Veeam daŭre liveros servojn de respondaj incidentoj pri ciberĉantaĝo. Coveware ofertos krimmedicinajn kaj solvajn kapablojn...

23 aprilo 2024

Verda kaj Cifereca Revolucio: Kiel Prognoza Prizorgado Transformas la Petrolo kaj Gasa Industrio

Prognoza prizorgado revolucias la petrolon kaj gasan sektoron, kun noviga kaj iniciatema aliro al plantadministrado...

22 aprilo 2024