Zafer Günlükleri

Bir programcının hayat ve yazılım üzerine notları

09 May 2020

Beego ve Cross Site Request Forgery (CSRF)

Cross Site Request Forgery kısaca CSRF türkçeye “Siteler Arası İstek Sahtekârlığı” şeklinde çevrilebilir. CSRF web geliştiricilerinin sürekli karşı karşıya kaldıkları bir durumdur. Web uygulamasının görevi kendisine gelen isteklere belirli kurallar çerçevesinde cevap vermektir. Burada sorun şudur ki; web uygulaması kendisine gelen isteğin esas sahibinin kim olduğunu bilmez. Örneğin http://www.zafercelenk.com adresinde bulunan bir iletişim formu üzerinden mesaj gönderdiğimizi düşünelim. Bu form bilgilerini gerçekten bu adresi açmış olan bir tarayıcı üzerinden gönderebileceğimiz gibi kendi yazdığımız bir uygulama üzerindende gönderebiliriz. Bu durumda sunucu isteğin bir tarayıcıdan mı yoksa özel olarak yazılmış bir uygulamadan mı geldiğini bilemeyecektir.

Bu durum önemlidir, çünkü kötü niyetli bir kişi böyle bir uygulama ile sunucunuzu gereksiz yere meşğul edebilir. Hatta daha kötüsü sunucunuza sızmaya çalışabilir. Bu konuda internette bir çok yazı bulabilirsiniz o yüzden biz kendi konumuz olan CSRF konusunda nasıl önlem alırız üzerine devam etmek istiyorum.

CSRF üzerine genel bir çözüm token kullanarak istek gönderen kişinin tanımlanmasını amaçlar. Burada token üzerine kurulan sistem şu şekilde bir işleyişe sahiptir.

  • Sunucu bir token oluşturur ve sayfayı çağıran tarayıcıya gönderir.
  • Tarayıcı gelen token bilgisini saklar ve yeni bir istek yaparken tekrar bu token bilgisini gönderir.
  • Sunucu istekle birlikte gelen token bilgisini inceler ve gönderdiği ile uyuşuyorsa isteğe izin verir.
  • Eğer token geçersiz veya hatalıysa sunucu isteği reddeder.

Bu senaryodan da anlaşılacağı gibi sunucu kendisine istek yapanları etiketleyerek yabancıları ayırıp, güvenli bir iletişim sağlanmasını amaçlamaktadır.

Beego ile XSRF

Beego framework Go üzerine geliştirilmiş ve tam kapsamlı bir web frameworktur. Bir çok alanda kendi içinde gelen çözümleri ile hızlı ve performanslı web uygulamaları geliştirmenize olanak sağlar. Beego ile CSRF zafiyetinden kurtulmak oldukça kolaydır. Bunun için framework kendi içinde yerleşik bir mekanizma ile gelir. Bu mekanizma Beego içinde XSRF isimi ile anılır ve kullanılır.

EnableXSRF = true

Beego’nun XSRF sistemi etkinleştirmek için app.conf dosyasına yukarıdaki tanımı eklemek gerekir. Bunun ardından Beego tüm proje içindeki POST, PUT ve DELETE istekleri için XSRF koruma mekanizmasını aktif hale getirecektir. Ancak halen yapılması gereken bir kaç adım daha var. Öncelikle sayfa yüklenirken gerekli token bilgisini oluşturup sayfaya göndermemiz gerekiyor. Bunun için Beego bize oldukça kolay ve basit bir yapı sunar.

func (this *HomeController) Get(){
    this.Data["xsrfdata"]=template.HTML(this.XSRFFormHTML())
}

Burada token bilgisi Beego tarafından oluşturulur ve xsrfdata değişkeni ile sayfaya gönderilir. Ardından sayfada istek yapılacak formlara bu değişken gizli alan olarak eklenir. Böylece bizim tarafımızda yapılacakları tamamlamış oluyoruz.

<form action="/new_message" method="post">
  {{ .xsrfdata }}
  <input type="text" name="message"/>
  <input type="submit" value="Post"/>
</form>

Bu işlemlerden sonra tüm kontrolleri Beego tarafına devretmiş oluyoruz. Siz formu gönderdiğnizde Beego token bilgisini alarak gerekli kontrollleri yapıyor. Eğer token geçerli ise istek işlenip cevap veriliyor. Aksi taktirde bir panic hatası ile işlem durduruluyor.

Beego XSRF devre dışı bırakmak

Beego üzerinde XSRF etkinleştirildiği zaman tüm sistem üzerinde kontroller yapılmaya başlayacaktır. Ancak bazen bazı işlemlerde XSRF kontrolünü devre dışı bırakmak isteyebilirsiniz. Örneğin bir ödeme formunu banka sistemine yönlendirdiniz ve bankada işlem sonuçlarını size bir POST isteği ile iletmek istiyorsa bu durumda bankadan gelen isteklerde XSRF korumasını devre dışı bırakmanız gerekebilir. Bunun için Beego’nun çözümü aşağıdaki gibidir.

type BankController struct{
    beego.Controller
}
func (c *BankController) Prepare() {
    c.EnableXSRF = false
}

Burada BankController genelinde XSRF koruması devre dışı bırakılmıştır. Bu pek tavsiye edilen bir uygulama olmasada yukarıdaki gibi bir örnek senaryoda yapılması gerekebilir.

Beego ile XSRF testi için geliştirmiş olduğum uygulamaya https://github.com/zafer06/beego-xsrf-test adresinden ulaşıp kodları inceleyebilir ve kendi bilgisayarınıza indirip çalıştırarak deneyebilirsiniz.

Ayrıca daha detaylı bilgi için Beego XSRF dökümantasyonunu (https://beego.me/docs/mvc/controller/xsrf.md) ziyaret edebilirsiniz.

İlgili Kaynaklar: