PHP CSRF saldırılarına karşı önlem


CSRF ya da XSRF Saldırısı Nedir?

XSRF ya da CSRF (İngilizce: cross-site request forgery, Türkçe: sitelerarası istek sahtekârlığı), internet sitelerini hedef alan kötü niyetli bir exploit türüdür. XSRF ile internet sitesinin güvendiği bir kullanıcı üzerinden, siteye izin verilmeyen ya da kullanıcının farkında olmadığı komutlar gönderilir. Kötü niyetli bir web sitesinin bu tür komutları iletebilmesinin birçok yolu vardır; örneğin özel olarak hazırlanmış resim etiketleri, gizli formlar ve JavaScript XMLHttpRequests, kullanıcının etkileşimi ve hatta bilgisi olmadan çalışabilir. Bir kullanıcının belirli bir siteye güveninden yararlanan siteler arası komut çalıştırmanın (İngilizce: cross-site scripting) aksine, CSRF bir sitenin kullanıcının tarayıcısında sahip olduğu güvenden yararlanır.

Bir CSRF saldırısında, masum bir son kullanıcı, bir saldırgan tarafından kandırılarak, istemedikleri bir web isteği gönderir. Bu, web sitesinde yanlışlıkla istemci veya sunucu veri sızıntısı, oturum durumunun değiştirilmesi veya bir son kullanıcının hesabının manipülasyonunu içerebilecek eylemlerin gerçekleştirilmesine neden olabilir.

CSRF ya da XSRF Saldırısı Nasıl Önlenir?

Bu saldırı türlerini CSRF token üreterek ve her türlü istek-request-lerde bu tokenları kontrol ederek, karşılaştırarak güvenlik önlemi alabiliriz. Bu sayede gerçek oturumun sahibindeki tokenlar eşleşmeyeceğinden dolayı saldırganın saldırılarını boşa çıkarmış oluyoruz.

İlk olarak oturum (session) işlemlerini başlatacağımız alanda $token değişkenimiz tanımlıyoruz.

session_start(); // oturumumuzu başlatıyoruz.
//CSRF token olup olmadığını kontrol ediyoruz, eğer yoksa token oturumumuzu oluşturup bu tokeni bir değişkene aktarıyoruz.
if (empty($_SESSION['token'])) {
    $_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];

Şimdi token değişkenimizi göndereceğimiz isteklerde gizli bir inputun içerisine yerleştiriyoruz. Ya da bunu ajax ile göndereceksek javascript değişkeni olarak da yazdırabilirsiniz.

<input type="hidden" name="token" value="<?= $token ?>" />

Şimdi sıra bu değişkeni gönderdiğimiz istek tarafında kontrol etmekte.

if (!empty($_POST['token'])) {
    if (hash_equals($_SESSION['token'], $_POST['token'])) {

        // Eğer oluşturduğumuz token'lar uyuşuyorsa yapmak istediğimiz işleme bu alanda devam edebiliriz.

    } else {
        // Eğer bir uyuşmazlık varsa burada işlemi öldürüp hatayı bastırıyoruz.
        die("Erişim reddedildi!");
    }
}

Yukarıdaki anlatımdaki işlemleri uygulayarak siz de kendinizi CSRF (XSRF) saldırılarına karşı koruyabilirsiniz.

Diğer yazılarıma göz atmak için tıklayın.

Web sitesine mi ihtiyacınız var ?

Kategori: