§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:
- Tüm
GET
istekleri application/x-www-form-urlencoded
,multipart/form-data
veyatext/plain
gövde türlerindePOST
istekleri
Bir saldırgan, tarayıcıyı:
PUT
veyaDELETE
gibi diğer istek metotlarını kullanmayaapplication/json
ve benzeri farklı içerik türlerini göndermeye- sunucunun tanımladığından farklı olarak yeni çerezler tanımlamaya
- tarayıcının isteklere eklediği normal başlıklara ilave olarak keyfi başlıklar eklemeye
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:
- Eğer bir
X-Requested-With
başlığı mevcut ise, Play bu isteği güvenli olarak kabul eder.X-Requested-With
, jQuery gibi birçok popüler Javascript kütüphanesi tarafından isteklere eklenir. - Bir
nocheck
değerine veya geçerli bir CSRF jetonuna sahipCsrf-Token
başlığı mevcut ise Play bu isteği güvenli kabul eder.
§ 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:
csrf.token.name
- Hem oturumda hem de istek gövdesi/sorgu dizesinde kullanıalcak jetonun adıdır. VarsayılanıcsrfToken
dir.csrf.cookie.name
- Eğer yapılandırıldıysa, Play CSRF jetonlarını oturumda saklamak yerine verilen isimde bir çerezde saklayacaktır.csrf.cookie.secure
- Eğercsrf.cookie.name
ayarlandıysa, CSRF çerezi güvenli işaretine sahip olmalı/olmamalı işaretidir. Varsayılanısession.secure
ünkiyle aynıdır.csrf.body.bufferSize
- Jetonları gövdeden okuyabilmek için, Play ilk önce gövdeyi tamponlamalı ve potansiyel olarak ayrıştırmalıdır. Bu seçenek gövdeyi tamponlamak için en yüksek tampon boyutunu ayarlar. Varsayılanı 100k’dir.csrf.sign.tokens
- Play imzalı CSRF jetonları kullanmalı/kullanmamalı ayarı. İmzalı CSRF jetonları bir jetonun her istek için rastgeleleştirilmiş olduğundan emin olur ve böylece BREACH tarzı saldırıları yok eder.csrf.error.handler
- Hata işleyici.play.filters.csrf.CSRFErrorHandler
veyaplay.filters.csrf.CSRF.ErrorHandler
ı uygulamalıdır.
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.