Laravel CSRF Nedir ? Neden CSRF Kullanırız ?

Bu yazımızda Laravelin bize sağladığı kolaylıklardan biri olan ve yazılım güvenliğinde önemli bir yere sahip olan CSRF (Cross-site request forgeries) konusuna değinmeye çalışacağız.

CSRF Nedir ?

Türke karşılığı "Siteler arası istek sahtekarlığı" olan bu terim, web uygulamasını kullanan kullanıcının kendi isteği haricinde yürütülen işlere denilmektedir. Mesela sitede anket diye bir form uygulaması olsun. Bu form uygulamasının kullanıcı haricinde ya da istenmeyen kişiler tarafından doldurulup post edilmesi bir CSRF açığıdır. Laravel CSRF sıladırıları karşısında bir takım önlemler almış.

CSRF koruması olmadan kötü amaçlı bir web sitesi, sizin web uygulamanızda kötü şeyler yapabilir.

Bir örnek vermek gerekirse;

<form action="https://kodlamaklazim.com/user/email" method="POST"><input type="email" value="info@kodlamaklazim.com">
</form>

<script>document.forms[0].submit();
</script>

Yukarıdaki kod parçacığında sitemizde olan bir formu kötü niyetli bir yazılımcı konsola ya da bir api kaynağında yazdığı kodda otomatik post işlemi gerçekleştirebilir.

İşte bu durum bir csrf açığıdır.

Bu güvenlik açığını önlemek için, kötü amaçlı uygulamanın erişemediği gizli bir oturum değeri için gelen her POST, PUT, PATCH veya DELETE isteğini incelememiz gerekir.

CSRF Açığını Engelleme

Laravel, uygulama tarafından yönetilen her aktif kullanıcı oturumu için otomatik olarak bir CSRF token oluşturur. Bu token kimliği doğrulanmış kullanıcının, uygulamaya istek atan doğru kişi olup olmadığını kontrol etmek için kullanılır.

Bu token, sessionda depolandığından ve kullanıcı her giriş çıkış yaptığında değiştiğinden kötü amaçlı yazılım ya da web sitelerinin kullanıcı kimliği onaylamadan CSRF zafiyetini aimaları mümkün görünmüyor

Laravel'de o anki oturumun CSRF değerine, session isteği veya csrf_token() metodu ile ulaşabiliriz.

<?php
use Illuminate\Http\Request;

Route::get('/token', function (Request $request) {
    $token = $request->session()->token();
    $token = csrf_token();
    // ...
});

Laravel uygulamamızda bir form oluşturduysak , CSRF middleware'inin isteği doğrulayabilmesi için forma gizli bir csrf_token eklemelisiniz.

Blade yapısında formu açtıktan sonra bir alt satıra @csrf yazmanız yeterli olacaktır.

<form method="POST" action="/kisi">
    @csrf   
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>

Yukarıdaki kod parçacığında form elementi içerisine eklediğimiz 2 satırdan herhangi birini kullanmamız yeterli olacaktır. Sadece ikisini de göstermek için 2 satırı ekledim.

CSRF yapısı hazır şekilde App/Http/Middleware/VerifyCsrfToken dizininde bulunur. Laravel bu iki isteği karşılaştırır ve iki istekte eşit ise kullanıcı oturumunu doğrular.

Api Ya da Dış Kaynaklarda CSRF Kullanımı

Laravel'i bir api ya da dış kaynaklara bilgi vermek, veri sağlamak için kullanıyorsanız, CSRF koruması ve kimlik doğrulaması için Laravel Sanctum kütüphanesini inceleyebilirsiniz.

URL'leri CSRF Korumasından Hariç Tutmak

Bazı durumlarda bir kaç urli CSRF koruması dışında bırakmak isteyebiliriz. Mesela ödeme sistemi kullanıyorsunuz. Kullandığınız bu sistemden nasıl bir token geleceğini laravel bilemeyeceği için sistemde hata oluşacaktır. Veya webhook kullanıyorsanız keza aynı şekilde.

Bunu şu şekilde çözeriz. App/Http/Middleware/VerifyCsrfToken.php dosyasındaki $except dizisi içerisine CSRF korumasına alınmasını istemediğimiz url'leri yazabiliriz.

VerifyCsrfToken.php dosyası

<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
    /**
     * Korumaya alınmayacak linkler
     *
     * @var array
     */
    protected $except = [
        "https://kodlamaklazim.com"
    ];
}


Laravel X-CSRF-TOKEN Nedir ?

CSRF parametresini post isteğini kontrol ederken kullanmanın yanı sıra, App/Http/Middleware/VerifyCsrfToken.php ara katman yazılımı uygulamaya istek atarken meta başlıklarını da incelemektedir. Bu yüzden csrf belirtecini meta etiketi içerisinde de tanımlayabiliriz.

<meta name="csrf-token" content="{{ csrf_token() }}">

Ardından jquery,react gibi Javascript teknolojilerinden uygulamamıza istek atarken headers nesnesi içerisinde csrf korumamızı göndeririz. Eğer meta içerisindeki token ile gönderdiğimiz token uyuşursa sistem yapmak istediğimiz işlemi yapmamıza izin verecektir.

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

Laravel X-XSRF-TOKEN Nedir ?

Laravel geçerli CSRF belirtecini framework tarafından oluşturulan her yanıta dahil eden XSRF-TOKEN tanımlama bilgisinde depolar. X-XSRF-TOKEN isteğini ayarlamak için çerez değerini kullanabilirsiniz.

Angular ve Axios gibi bazı JavaScript frameworkleri ve kütüphaneleri , CSRF değerini aynı kaynaklı isteklerde X-XSRF-TOKEN başlığına otomatik olarak yerleştirdiğinden, bu tanımlama bilgisi öncelikle geliştirici kolaylığı olarak gönderilir.

YAZAR HAKKINDA

26 Yaşında. Araştırmayı seven, bir şeyler öğretmeye meraklı bir Bilgisayar Mühendisi

1 YORUM

Muhammed Fatih BAĞCIVAN

26-April-2021

Laravel üzerinde csrf konusunda bilmedigim şeylerin olduğunu ve bunları sorunsuz bir şekilde anlamama yardımcı olan kodlamaklazim.com blog sitesi ve değerli editörü Zafer Yıldız hocama sonsuz teşekkür ediyorum :) Allah her zaman emeklerinin karşılığını bo


Yorum Yap

@COPYRIGHT KodlamakLazım Tüm Hakları Saklıdır.