CSRF, kimliği doğrulanmış bir kullanıcı adına eylemler gerçekleştiren ve web güvenliğine zarar veren bir saldırgan tarafından gerçekleştirilen kötü amaçlı bir etkinliktir. Neyse ki, Laravel bu tür bir güvenlik açığını önleyecek araçları sağlar.
CSRF saldırıları, kullanıcı oturumlarını ele geçirir. Bunu, kullanıcının bilgisi olmadan gizli form etiketleri veya kötü amaçlı URL'ler (resimler veya bağlantılar) aracılığıyla bir istek göndermesi için kullanıcıyı kandırarak yaparlar.
Bu saldırı, kullanıcı oturum durumunda değişikliğe, veri sızıntılarına yol açar ve bazen bilgisayar korsanları bir uygulamadaki son kullanıcı verilerini manipüle edebilir.
Yukarıdaki görüntü, web güvenliğinin ihlal edildiği bir senaryoyu göstermektedir. Kurban, bir bağlantıya (alınan) tıklayarak bir istek gönderir, bir web sitesi sunucusuna, web sitesi sunucusuna erişmek ve onu manipüle etmek için yararlı bilgilere sahip olan hacker tarafından istenen etkileri üretecek bir istek gönderir.
Geliştirmek için güvenlik uygulamalarınızın web'inde, her kullanıcı oturumunda Laravel, kimliği doğrulanmış kullanıcının uygulamayı talep eden kişi olduğundan emin olmak için kullandığı güvenli belirteçler oluşturur.
Bu belirteç, bir kullanıcı oturumu her yeniden oluşturulduğunda değiştiğinden, bir saldırgan buna erişemez.
Gibi sunucu tarafında (arka uç) kullanıcı bilgilerini değiştirmek için bir istek olduğunda POST
, PUT
, PATCH
e DELETE
, direktifi eklemelisiniz @csrf
istek formunda blade
HTML. bu @csrf
bu nedenle bir direktiftir Blade
uygulama tarafından doğrulanan gizli bir belirteç oluşturmak için kullanılır.
Direktif Blade
adlı laravel şablon motorunda kullanılan sözdizimidir. kılıç . dosya oluşturmak için blade
ona - bizim durumumuzda - bir isim vermeli ve ardından bıçağın uzantısını vermelisiniz. Bu, dosyanın isme sahip olacağı anlamına gelir. form.blade.php
.
dosya kullanılır blade
web sayfasındaki kullanıcılar için görünümler oluşturmak için birkaç ön yönerge vardır.definite veya blade steno sözdizimini kullanabilirsiniz. Örneğin, @if
bir koşulun karşılanıp karşılanmadığını kontrol edin, @empty
kayıtların boş olup olmadığını kontrol edin, @auth
bir kullanıcının kimliğinin doğrulanıp doğrulanmadığını vb. kontrol edin.
Ama direktife geri dönelim @csrf
. Bunu nasıl kullanacağınız aşağıda açıklanmıştır:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Laravel'in önceki sürümleri farklı bir kuruluma sahipti: ikisi de çalışıyor ve aynı şeyi yapıyor.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Gönderilen form isteğinde CSRF belirteci eksik olduğunda veya geçersiz göründüğünde, Laravel 419 durum koduyla "Sayfa Süresi Doldu" hata mesajı atar.
ara yazılım VerifyCsrfToken
Laravel uygulaması içinde CSRF doğrulamasını gerçekleştirir. bu middleware
kayıtlı Kernel.php
ve dizinde bulunur app/Http/Middleware
. Bu şu anlama gelir: middleware
API'lerle ilgili olmayan web içindeki istekler için tetiklenir.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
VerifyCsrfToken ara yazılımı, sınıfı genişletir Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, yani CSRF doğrulaması defisınıf içinde gece.
Laravel'in CSRF doğrulamasını nasıl ele aldığını öğrenmek için daha derine inelim.
Sınıfın içinde, işlevimiz var tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
kod, oturumun ve giriş CSRF belirteçlerinin eşleşip eşleşmediğini belirler.
İşlev iki şey yapar:
$this->getTokenFromRequest
gizli bir alan veya istek başlığı aracılığıyla eklenen gelen istekten gelen belirteç. Jetonun şifresi çözülür ve ardından jeton değişkenine geri gönderilir.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;
}
Kodda, başlıktan belirteç alır
2. Hem istek belirtecini hem de oturumu bir dizeye aktarın ve ardından şunu kullanın: hash_equals
her iki dizenin eşit olup olmadığını karşılaştırmak için PHP'de yerleşiktir. Bu işlemin sonucu her zaman bool (doğru) veya (yanlış) .
Ercole Palmeri
Herhangi bir ticari operasyon, farklı biçimlerde bile çok fazla veri üretir. Bu verileri bir Excel sayfasından manuel olarak girin…
Şirket e-postalarının ele geçirilmesi, 2024 yılının ilk üç ayında son çeyreğe kıyasla iki kattan fazla arttı…
Arayüz ayrımı ilkesi, nesne yönelimli tasarımın beş SOLID ilkesinden biridir. Bir sınıfın olması gerekir…
Microsoft Excel, veri analizi için referans aracıdır, çünkü veri kümelerini düzenlemek için birçok özellik sunar,…
2017 yılından bu yana Gayrimenkul Kitlesel Fonlaması alanında Avrupa'nın liderleri arasında yer alan Walliance, SIM ve platform, tamamlandığını duyurdu…
Filament, çeşitli tam yığın bileşenleri sağlayan "hızlandırılmış" bir Laravel geliştirme çerçevesidir. İşlemleri basitleştirmek için tasarlanmıştır…
«Evrimimi tamamlamak için geri dönmeliyim: Kendimi bilgisayarın içine yansıtacağım ve saf enerjiye dönüşeceğim. Bir kez yerleştikten sonra…
Google DeepMind, yapay zeka modelinin geliştirilmiş bir versiyonunu sunuyor. Yeni geliştirilmiş model yalnızca…