<!--[if gte mso 9]> Normal 0 21 MicrosoftInternetExplorer4 <![endif]-->
Bu iki saldýrý þeklindeki ana fark saldýrýnýn nasýl yapýldýðýdýr. XSS giriþ doðrulamayý atlatma ile ve bir sayfaya direk olarak kod enjekte etme ile yapýlýr. XSRF zaten orada olaný kötüye kullanmak için yapýlýr..izin verilen sayfa elementlerini, CGI’larý direk olarak ek kimlik doðrulamasý gerekmeden çalýþtýrarak.
XSS ve XSRF’deki esas problem XSS’in, XSRF açýklarýnýn riskini artýrmasýdýr. Birlikte kullanýldýðýnda birbirlerini çok iyi tamamlarlar. En büyük risk, birleþtirildiklerinde, tarayýcý farklý web sitelerine gidebilir, tek bir siteyle sýnýrlý kalmaz. XSRF tek baþýna saldýrganýn HTTP cevabýný okuyabilmesine izin vermediði için saldýrýnýn baþarýlý olup olmadýðý bilinemez. Fakat, XSS ile birleþtirildiðinde, saldýrgan sonuçlarý kendi seçtiði bir yere yönlendirebilir ve saldýrýnýn baþarýlý olup olmadýðýný anýnda görebilir.
Önleme
XSRF’i fixlemek XSS’i, hatta SQL Injection http://www.olympos.org/glossary/term/563 - i ‘ý fixlemekten daha zor olabilir. Çünkü kötü amaçlý isteði kurban gönderdiðinde, isteðin saldýrý olup olmadýðýný anlamak zor olabilir. XSRF için alýnan önlemler, eðer XSS açýklarý varsa etkisiz olabilir. XSRF’i engellemek demek ayný zamanda XSS saldýrýlarýný da engellemek demektir. Giriþ filtreleme XSRF saldýrýlarýný engellemese de XSS saldýrýlarýný önlemek için mutlaka yapýlmalýdýr. Giriþ filtreleme, kaynaðý neresi olursa olsun, uygulama tarafýndan kabul edilen verilere uygulanmalýdýr.
XSRF önleme genelde her web uygulamasý özelliðinin ve form’unun tekrar kodlanmasýný gerektirir. anti-XSRF token’larý kullanarak veya CAPTCHA implemente ederek XSRF saldýrýlarýný önleyebilirsiniz. Ýmplementasyonu daha kolay fakat çok etkili olmayan, yine de hiç olmamasýndan iyi, baþka metodlar da var. Birden fazla metodun kombinasyonunun kullanýlmasý genelde tavsiye edilmektedir. Aþaðýda her bir metod anlatýlmaktadýr:
Yardýmcý
Kullanýcý tarafýndan gelebilecek tüm giriþlerin filtrelenmesi gerekir. Bunun için aþaðýdakileri yapýn:
* Filtrelemede black list yerine white list metodunu kullanýn. White list metodu, kötü olan içerikleri bloklamak yerine iyi olan giriþleri kabul etme iþlemidir. Örneðin Türkiyedeki bir telefon numarasý her zaman (alan kodu ile birlikte) 10 rakam olmalýdýr; telefon numarasýna white list uygulamak demek sadece 10 ader rakam kabul etmek, baþka birþeyi kabul etmemek demektir.
* Kullanýcý tarafýndan saðlanan tüm verileri, tarayýcýlarýnýn yorumlayabileceði bir formatta gönderilmesini engelleyecek þekilde kodlayýn. Örneðin, küçüktür iþareti < < olarak (veya URL’de %3c olarak) kodlanmalý.
* (programlama sitelerinden indirilen veya programlama örneklerinden alýnan) Üçüncü parti kodlarý kendi web uygulamanýzda (ne kadar güvenli olup olmadýðýný anlamadan) kullanmayýn.
Kurban
Anti_XSRF Nonce Token
XSRF’i önlemede hiçbir metod kesin deðil fakat anti_XSRF nonce token’larý kullanmak riskin büyük bir bölümünü yokeder. Teoride, geçerli bir token saldýrgan tarafýndan tahmin edilebilir, fakat bu gerçekte kolay bir iþlem deðildir. Dahasý, bu metod günümüzde XSRF saldýrýlarýný engellemede en etkili metoddur. Kullanýcý login olduktan sonra bir “giz” yaratarak kullanýcýnýn doðru olup olmadýðýný kontrol edebilirsiniz. Kullanýcý login olduktan sonra gizli bir hash veya token yaratýp sunucu-tarafý oturumunda depola ve bunu her link ve form’a dahil et. Birbirini takip eden her http isteði bunu içermeli, aksi takdirde kabul edilmemeli ve oturum geçersiz kýlýnmalý. Eðer XSS açýðý varsa “Giz” oturum id’si ile ayný olmamalý. Token’ý herhangi bir oturum deðiþkeni gibi oluþtur. Basit bir koþul ifadesi doðrulanabilir.
Ayrýca etkisini artýrmak için kýsa bir zaman dilimine kýsýtlanabilir. Bu deðiþiklik saldýrganýn XSRF saldýrýsýnda geçerli token kullanmasýný gerektirir. Kullanýcý token’ý oturumda depolandýðý için, saldýrganýn bu kurbanýna özel token’ý kullanmasý gerekecektir.
Bunu PHP’de yapýlýþý ile ilgili bir örnek verelim. Bu futbol maçý biletleri sipariþ edilebilen bir web uygulamasý örneði:
<?php
session_start();
$token = md5(uniqid(rand(),TRUE));
$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();
?>
<form action=”purchase.php” method=”POST”>
<input type=”hidden” name=”token” value=”<?php echo $token; ?>” />
<p>
Item:
<select name=”item”>
<option name=”fieldlevel”>fieldlevel</option>
<option name=”upperdeck”>upperdeck</option>
</select><br/>
Number:<input type=”text” name=”number” /><br/>
<input type=”submit” value=”Purchase” />
</p>
</form>
Token herhangi bir oturum deðiþkeni gibi yaratýlmalý.
<?php
if (!isset($_SESSION['token']))
{
$_SESSION['token'] = md5(uniqid(rand(), TRUE));
}
?>
Token’ý basit bir koþul ifadesi ile kontrol edin:
<?php
if ($_POST['token'] == $_SESSION['token'])
{
/* Valid Token */
}
?>
Token’ýn geçerliliðini belirli bir zaman periyoduna kýsýtlamak, örneðin dört dakika, güvenliði artýracaktýr:
<?php
$token_age = time() – $_SESSION['token_time'];
if ($token_age <= 240)
{
/* Less than four minutes has passed. */
}
?>
CAPTCHA
CAPTCHA implemente etmekde XSRF saldýrýlarýný engelleyebilir. CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) basitçe kullanýcýnýn karýþýk fakat okunabilir harf (veya harf rakam kombinasyonu) içeren resimde gösterilenleri girmesini gerektirir. Burdaki fikir bilgisayarýn grafikte gizli olan kelimeyi bulamayacaðý ve insanlarýn kolaylýkla ayýrtedebileceðidir. CAPTCHA kullanýmý, kullanýcýnýn spesifik iþlemler öncesi resimdeki bilgiyi girmesi ile olur.
Ýþleme devam için otomatik bir script’in yaratýlmasý çok zor olsa bunu aþma konusunda araþtýrmalar yapýlýyor. Eðer bu metodu kullanmaya karar verirseniz güçlü bir CAPTCHA kullanýn. Güçlü bir CAPTCHA inþa etmek zor olabilir. Ek olarak, resimlerin bilgisayar tarafýndan okunamadýðýna emin olmak için, geliþtiricilerin, CAPTCHA’nýn script seviyesinde atlatýlamayacaðýna emin olmasý gerekir. Ayný CAPTCHA birden fazla mý kullanýlýyor? uygulamanýn tekrar-oynatma (replay) saldýrýsýndan etkilenmesine yol açarmý? Ya da CAPTCHA ya geçirilen düz yazý cevap web formunun bir parçasýmý? Bunlar düþünülmesi gereken problemler.
Diðer Çözümler
Daha az zaman ve efor gerektiren (fakat daha az etkili olan) diðer çözümlere gelelim. Çoðunlukla gizleme ile güvenlik (security through obscurity) den oluþurlar. Bu da saldýrganýn açýktan yararlanmasýnda ek bilgi gerektirir. Fakat, tekrar uyaralým, uygulamanýz uzman bir saldýrgana bu þekilde karþý koyamaz.
Yönlendirme
XSRF saldýrýlarýný HTTP isteðinin yetkili bir kaynaktan gelip gelmediðini kontrol ederek ve yönlendirme kullanarak önleyebilirsiniz. Eðer Referer baþlýðý yoksa, veya iþlemi gerçekleþtirmesi gerekmeyen bir sayfa veya site içeriyorsa, yönlendirme kullanýcýyý baþka bir sayfaya yönlendirerek ek iþlem yapýlmasýný engelleyebilir.
<?php
if ($_SERVER['HTTP_REFERER'] != ‘http://www.victim.tld/transfer.html’ )
{
header(”Location: http://www.victim.tld/transfer.html - http://www.victim.tld/transfer.html” );
exit;
}
?>
URL Rewrite
Form-tabanlý kimlik doprulama yaparken diðer bir opsiyon da cookie yerine URL rewrite (özellikle bu opsiyon uygulama sunucusu tarafýndan transparan olarak yapýlabiliyorsa) kullanýmýdýr. Oturum tanýmlayýcýsýný her URL’ye dahil edildiðinde, bu tanýmlayýcý arka arkaya yapýlan sayfa isteklerinde ayrýþtýrýlýp oturum bilgisini tanýmakta kullanýlabilir. Fakat çoðu uygulamada bunun uygulanabilmesi büyük bir çalýþma gerektirebilmektedir.
Get yerine Post kullanýmý
Uygulamanýn objeleri yaratma, deðiþtirme ve silme gibi durum deðiþiklikleri için GET yerine POST kullanýmýna zorlama yapýlabilir. Hem HTTP GET, hem de HTTP POST kullanan uygulamalar XSRF açýklarýndan etkilense de, HTTP GET kullanarak saldýrýyý gerçekleþtirmek çok daha kolaydýr. POST kullanýmý resim tag’leri örneðimizdeki saldýrýyý etkisiz kýlar ve uygulama içerisinde resim link’lerinin paylaþýlabilmesine izin verir. Ayrýca bunu implemente etmek çok kolaydýr. Ayrýca saldýrganlarýn baþka hedef aramasýna yol açacak kadar caydýrýcý olabilir. Fakat yine de çok bilgili bir saldýrgan JavaScript kullanarak POST isteklerinden de bu saldýrýlarý yapabilir.
Oturum tanýmlayýcýlarýnýn gizli form alanlarý olarak geçirmek
Formlarda hidden alanlarýnda oturum tanýmlayýcýlarýný kullanabilirsiniz. Bu bilgi web sayfasýnda görülmez fakat diðer alanlarla birlikte otomatik olarak gönderilir. Gizli form alanlarýnda oturum tanýmlayýcýlarýný geçirmek, bir sayfadan diðerine geçiþte resim linkleri yazý linkleri kullanýmýndan mahrum býrakýr, bu sebeple bu pek kullanýþlý deðil. Ayrýca HIDDEN form alaný deðeri web sayfasýnda görünmese de tarayýcýnýn kaynak görüntüleme seçeneði ile kolayca görülebilir. Bunun içinde gizli veri kriptolanarak sadece gerektiðinde dekriptolanabilir.