§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
GETistekleri application/x-www-form-urlencoded,multipart/form-dataveyatext/plaingövde türlerindePOSTistekleri
Bir saldırgan, tarayıcıyı:
PUTveyaDELETEgibi diğer istek metotlarını kullanmayaapplication/jsonve 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-Withbaş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
nocheckdeğerine veya geçerli bir CSRF jetonuna sahipCsrf-Tokenbaş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ıcsrfTokendir.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.nameayarlandı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.CSRFErrorHandlerveyaplay.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.