Članci

Laravel Web Security: Šta je krivotvorenje zahtjeva na više lokacija (CSRF)?

U ovom Laravel tutorijalu govorimo o Web sigurnosti i kako zaštititi web aplikaciju od krivotvorenja zahtjeva na više lokacija ili CSRF napada.

CSRF je zlonamjerna aktivnost koju izvodi napadač, koji izvodi radnje u ime autentificiranog korisnika, štetne za web sigurnost. Na sreću, Laravel pruža alate za sprečavanje ove vrste ranjivosti.

Šta je CSRF?

CSRF napadi otimaju korisničke sesije. Oni to rade tako što prevare korisnika da podnese zahtjev putem skrivenih oznaka obrasca ili zlonamjernih URL-ova (slika ili linkova) bez znanja korisnika.

Ovaj napad dovodi do promjene stanja korisničke sesije, curenja podataka, a ponekad hakeri mogu manipulirati podacima krajnjeg korisnika u aplikaciji.

Slika iznad ilustruje scenario u kojem je probijena web sigurnost. Žrtva šalje zahtjev klikom na link (primljeno), šaljući zahtjev serveru web stranice koji će proizvesti željene efekte hakera koji dolazi u posjed informacija korisnih za pristup i manipulaciju serverom web stranice.

Kako spriječiti CSRF zahtjeve

Za poboljšanje bezbjednost web vaših aplikacija, u svakoj korisničkoj sesiji, Laravel generiše sigurne tokene koje koristi kako bi osigurao da je autentificirani korisnik taj koji traži aplikaciju.

Budući da se ovaj token mijenja svaki put kada se korisnička sesija ponovo generiše, napadač mu ne može pristupiti.

Kad god postoji zahtjev za promjenom korisničkih informacija na strani servera (backend) kao POSTPUTPATCHDELETE, morate uključiti direktivu @csrf u obrascu zahtjeva blade HTML. The @csrf to je stoga direktiva Blade koristi se za generiranje skrivenog tokena potvrđenog od strane aplikacije.

Direktiva Blade je sintaksa koja se koristi unutar Laravel predložaka pod nazivom oštrica . Za kreiranje datoteke blade morate mu dati ime – u našem obliku u obliku – nakon čega slijedi produžetak oštrice. To znači da će datoteka imati ime form.blade.php.

Datoteka se koristi blade za prikazivanje prikaza za korisnike na web stranici.Postoji nekoliko preduputstavadefisintaksu stenograma nite ili blade koju možete koristiti. Na primjer, @if provjeriti da li je uvjet ispunjen, @empty provjerite da li evidencija nije prazna, @auth provjeriti da li je korisnik autentificiran i tako dalje.

No, vratimo se na direktivu @csrf. Evo kako ga koristite:

<form method="POST" action="{{route('pay')}}">

    @csrf
    
</form>

Prethodne verzije Laravela imale su drugačiju postavku: obje rade i rade istu stvar.

Inovacijski bilten
Ne propustite najvažnije vijesti o inovacijama. Prijavite se da ih primate putem e-pošte.
<form method="POST" action="{{route('pay')}}">
    
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    
</form>

Kada CSRF token nedostaje u zahtjevu obrasca koji se šalje ili ako se čini nevažećim, Laravel šalje poruku o grešci „Stranica je istekla“ sa statusnim kodom 419.

Kako i gdje se CSRF verifikacija odvija

Middleware VerifyCsrfToken rukuje CSRF verifikacijom unutar Laravel aplikacije. The middleware je registrovan u Kernel.php i nalazi se u imeniku app/Http/Middleware. To znači da je middleware pokreće se za zahtjeve unutar weba, koji nisu povezani s API-jima.

protected $middlewareGroups = [
        'web' => [
           .
           .
           .
           .
           .
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    ];

Međuoprema VerifyCsrfToken proširuje klasu Illuminate\Foundation\Http\Middleware\VerifyCsrfToken, tj. CSRF verifikacija je defikonačno unutar klase.

Hajde da kopamo dublje da saznamo kako Laravel rukuje CSRF verifikacijom.

Unutar klase imamo funkciju tokensMatch.

protected function tokensMatch($request)
{
     $token = $this->getTokenFromRequest($request);

     return is_string($request->session()->token()) &&
            is_string($token) &&
            hash_equals($request->session()->token(), $token);
}

u kodu određuje da li se sesija i ulazni CSRF tokeni poklapaju.

Funkcija radi dvije stvari:

  1. dobiti $this->getTokenFromRequest token iz dolaznog zahtjeva priložen preko skrivenog polja ili zaglavlja zahtjeva. Token se dešifruje i zatim vraća u varijablu tokena.
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;
}

U kodu dobija token iz zaglavlja

2. Prebacite i token zahtjeva i sesiju u niz i zatim koristite hash_equals ugrađen u PHP za poređenje ako su oba niza jednaka. Rezultat ove operacije je uvijek bool (tačno) ili (netačno) .

Ercole Palmeri

Inovacijski bilten
Ne propustite najvažnije vijesti o inovacijama. Prijavite se da ih primate putem e-pošte.

Nedavni članak

Veeam nudi najsveobuhvatniju podršku za ransomware, od zaštite do odgovora i oporavka

Coveware od strane Veeam-a će nastaviti da pruža usluge odgovora na incidente u slučaju sajber iznude. Coveware će ponuditi mogućnosti forenzike i sanacije…

23 april 2024

Zelena i digitalna revolucija: Kako prediktivno održavanje transformira industriju nafte i plina

Prediktivno održavanje revolucionira sektor nafte i plina, s inovativnim i proaktivnim pristupom upravljanju postrojenjima.…

22 april 2024

Britanski antimonopolski regulator podigao je BigTech uzbunu zbog GenAI

UK CMA izdao je upozorenje o ponašanju Big Tech-a na tržištu umjetne inteligencije. Tamo…

18 april 2024

Casa Green: energetska revolucija za održivu budućnost u Italiji

Uredba o „zelenim kućama“, koju je formulisala Evropska unija za poboljšanje energetske efikasnosti zgrada, završila je svoj zakonodavni proces sa…

18 april 2024