Documentation

You are viewing the documentation for the 2.3.x release series. The latest stable release series is 2.5.3.

§Cross Site Request Forgery’ye Karşı Korunmak

Cross Site Request Forgery (CSRF), saldırganın kurbanın bilgisayarını, kurbanın oturumu ile bir istek yapacak şekilde kandırdığı bir güvenlik açığıdır. Oturum jetonu her istekle birlikte gönderildiğinden, bir saldırgan kurbanın tarayıcısını bir istek yapmaya zorlarsa, bu istek kullanıcının adına yapılmış gibi olur.

CSRF ile, saldırı taşıyıcılarının neler olduğu ve neler olmadığı ile ilgili bilgi edinmeniz tavsiye edilir. Biz buradan başlamayı tavsiye ediyoruz: this information from OWASP.

Kısaca, bir saldırgan bir kurbanın tarayıcısını aşağıdaki türlerde istekler yapmaya zorlayabilir:

Bir saldırgan, tarayıcıyı:

zorlayamaz.

GET istekleri değiştirici bir anlam taşımadığından, bu en iyi yöntemi kullanan bır uygulama için bir tehlike yoktur. Yani, CSRF korumasına ihtiyaç duyan istekler, yukarıda belirtilen içerik türlerinden birine sahip POST istekleridir.

§Play’in CSRF koruması

Play, bir isteğin CSRF isteği olmadığını doğrulamak için birçok metot içerir. Birincil mekanizma bir CSRF jetonudur. Bu jeton hem gönderilen her formun sorgu dizesine konumlandırılır, hem de kullanıcının oturumuna eklenir. Daha sonra Play bu iki jetonun var olduğunu ve eşleştiğini doğrular.

Tarayıcıdan gelmeyen istekler (örneğin AJAX aracılığıyla yapılan istekler) için basit koruma sağlamak için, Play aynı zamanda şunu destekler:

§ Global bir CSRF filtresi uygulamak

Play, bütün isteklere uygulanabilecek bir global CSRF filtresi sunar. Bu bir uygulamaya CSRF koruması uygulamanın en kolay yoludur. Bu global filtreyi etkinleştirmek için, Play filtreleri yardımcısı bağımlılığını projenizin build.sbt dosyasına ekleyin:

libraryDependencies += filters

Şimdi filtreyi Global nesnenize ekleyin:

import play.GlobalSettings;
import play.api.mvc.EssentialFilter;
import play.filters.csrf.CSRFFilter;

public class Global extends GlobalSettings {
    @Override
    public <T extends EssentialFilter> Class<T>[] filters() {
        return new Class[]{CSRFFilter.class};
    }
}

§Mevcut jetonu almak

Formlara CSRF jetonları eklemeye yardımcı olmak için Play bazı şablon başlıklar sağlar. İlk olanı action URL’sinin sorgu dizesine jetonu ekler:

@import helper._

@form(CSRF(routes.ItemsController.save())) {
    ...
}

Bu, aşağıdaki gibi görünen bir form sunabilir:

<form method="POST" action="/items?csrfToken=1234567890abcdef">
   ...
</form>

Eğer sorgu dizesinde jetonu bulundurmak sizin için istenmeyen bir şey ise, Play aynı zamanda CSRF jetonunu formda gizli bir alan olarak eklemek için bir yardımcı da sağlar:

@form(routes.ItemsController.save()) {
    @CSRF.formField
    ...
}

Bu, aşağıdaki gibi görünen bir form sunabilir:

<form method="POST" action="/items">
   <input type="hidden" name="csrfToken" value="1234567890abcdef"/>
   ...
</form>

§Oturuma bir CSRF jetonu eklemek

Bir CSRF jetonunun formlarda sunulduğundan ve istemciye geri gönderildiğinden emin olmak için, eğer bir jeton gelen istekte mebcut değilse global filtre HTML kabul eden her GET isteği için yeni bir jeton üretecektir.

§Eylem bazında CSRF filtrelemesi uygulamak

Bazen, örneğin bir uygulamanın kökenler arası (cross origin) form gönderimlerine izin vermek istemesi durumunda, global CSRF filtrelemesi uygun olmayabilir. Bazı oturum tabanlı olmayan standartlar, örneğin OpenID 2.0, siteler arası form gönderimini veya sunucudan sunucuya RPC iletişimlerinde form gönderimini şart koşar.

Böyle durumlarda, Play uygulamanızın eylemleriyle birleştirilebilecek iki eylem sunar.

İlk eylem play.filters.csrf.RequireCSRFCheck eylemidir ve kontrolü uygular. Bu eylem, tüm kimlik doğrulama gerektiren POST form gönderimi kabul eden eylemlere eklenmelidir:

@RequireCSRFCheck
public static Result save() {
    // Handle body
    return ok();
}

İkinci eylem, play.filters.csrf.AddCSRFToken eylemidir ve gelen istekte eğer halihazırda bir CSRF jetonu yoksa, yenisini üretir. Bu eylem form sunan tüm eylemlere eklenmelidir:

@AddCSRFToken
public static Result get() {
    return ok(form.render());
}

§CSRF yapılandırma seçenekleri

AŞağıdaki seçenekler application.conf dosyasında yapılandırılabilir:

Sonraki: JSON ile Çalışmak


Dokümantasyonun bu çevirisi Play ekibi tarafından yapılmamaktadır. Eğer bir hata bulduysanız, bu sayfanın kaynak kodu burada bulunmaktadır. Dokümantasyon yönergelerini okuduktan sonra lütfen katkı yapmaktan çekinmeyin.