Cross-Site Request Forgery (CSRF) Saldırısına Karşı PHP Güvenliği

Cross-Site Request Forgery (CSRF) Saldırısına Karşı PHP Güvenliği

Bu makalede, Cross-Site Request Forgery CSRF saldırısı hakkında bilgi verilerek, PHP kodlama ile nasıl önleyebileceğiniz anlatılıyor Sitenizin güvenliği için önemli bir konu olan CSRF saldırılarını engelleyerek, kullanıcılarınızın bilgilerini güvende tutun

Cross-Site Request Forgery (CSRF) Saldırısına Karşı PHP Güvenliği

Cross-Site Request Forgery (CSRF) saldırısı, internet kullanıcıları için ciddi bir tehdit oluşturur. Bu saldırı türü, web sayfalarındaki güvenlik açıklarından yararlanarak, kullanıcının hesap bilgilerinin ele geçirilmesini amaçlar. Bu saldırıda, kullanıcı sahte bir web sayfasına yönlendirilir ve bu sayfada yapacağı herhangi bir işlem, gerçek web sayfasında yapılıyormuş gibi gösterilir. Böylece, saldırgan, kullanıcının kimlik bilgilerine erişebilir ve istediği gibi kullanabilir.

PHP, birçok web sitesinde kullanılan bir programlama dilidir ve CSRF saldırılarına karşı alınacak önlemler açısından oldukça güçlü bir araçtır. Bunun için, PHP'de token kullanımı ve referrer kontrolü gibi yöntemler kullanılabilir. Ayrıca, captcha gibi güvenlik önlemleri de alınabilir.

CSRF saldırısı, kullanıcının isteği olmadan bir web sayfasında işlem yapılmasına neden olan bir tür saldırıdır. Bu işlemler, genellikle kullanıcının hesap bilgilerine erişmek için yapılır. Saldırganlar, bu tür saldırılarında, sahte bir web sayfası aracılığıyla kullanıcıları yönlendirirler ve bu sayfada istenilen işlemler gerçekleştirilir.

PHP, CSRF saldırılarına karşı özellikle token kullanımı ve referrer kontrolü gibi yöntemlerle etkili bir koruma sağlayabilir. Token kullanımı, saldırı anında rastgele bir token oluşturarak, sadece bu token ile işlem yapılmasını sağlar. Referrer kontrolü ise, sadece belirli bir adresten (gerçek web sitesi) yapılan istekleri kabul eder ve sahte sayfalardan gelen istekleri reddeder.

CSRF saldırılarına karşı PHP'de alınabilecek etkili önlemler aşağıdaki gibidir:

Token kullanımı, CSRF saldırılarına karşı oldukça etkili bir yöntemdir. Saldırganlar, sahte bir sayfa aracılığıyla kullanıcıları yönlendirdiğinde, rastgele bir token oluşturulur ve sadece bu token ile işlem yapılabilir. Böylece, sahte sayfalar üzerinden gönderilen istekler reddedilir ve kullanıcının hesap bilgileri korunmuş olur.

Token'lar, PHP'de rastgele bir şekilde oluşturulabilir ve özel bir alana depolanabilir. Bu token, web sayfasında işlem yaparken kullanılacaktır. Özel bir alanda depolama, hem token'ların güvenliği açısından hem de sayfaların daha hızlı yüklenmesi için önemlidir.

Token kontrolü, işlem yaptığımız sayfada gönderdiğimiz token ile server tarafında oluşturulan token'ın eşleştiğini kontrol eder. Bu sayede, sahte sayfalardan gelen istekler reddedilir ve CSRF saldırılarına karşı etkin bir koruma sağlanır.

Referrer kontrolü, sadece belirli bir adresten gelen istekleri kabul eder. Bu sayede, kullanıcının gerçek web sitesi dışındaki sayfalardan gönderilen istekleri karşılamaz ve CSRF saldırılarını engeller.

Captcha, internet kullanıcılarının gerçekten insan olduğunu doğrulayan bir güvenlik önlemidir. Bu nedenle, sahte sayfalar tarafından gönderilen istekler, captcha doğrulamasını geçemeyecektir. Bu, CSRF saldırılarına karşı etkili bir koruma sağlar.

PHP kullanarak CSRF saldırılarına karşı alınabilecek önlemler için örnek kodlar aşağıdaki gibi olabilir:

  • Rastgele Token Oluşturma ve Depolama
  • Token Kontrolü
  • Referrer Kontrolü
  • Captcha Kullanımı

Bu kodlar, PHP'de CSRF saldırılarına karşı etkili bir koruma sağlar ve kullanıcıların hesap bilgilerinin güvenliği için önemlidir.


CSRF Saldırısı Nedir?

Web sitelerinin ve uygulamaların güvenliği, günümüzün en önemli konularından biridir. Cross-Site Request Forgery (CSRF) saldırısı da bu güvenlik zafiyetlerinden biridir. CSRF saldırısı, bir saldırganın yetkisiz şekilde bir kullanıcının tarayıcısına istekte bulunarak, istediği işlemleri gerçekleştirmesine neden olur.

Bir CSRF saldırısı gerçekleştirmek için, saldırgan kullanıcının güçlü bir web sitesine oturum açtığı bir tarayıcı sekmesi açar. Ardından, saldırgan hedef sitenin istediği bir işlemi gerçekleştirebilecek bir form oluşturur. Bu form, normal şartlarda yetkili bir kullanıcı tarafından doldurulması gereken bir form gibi görünür ancak tarayıcının yapısı nedeniyle, form otomatik olarak gönderilir. Bu şekilde, saldırgan hedef site üzerinde istediği işlemi gerçekleştirir.

Bir örnek vermek gerekirse, bir banka oturum açarak sisteme girer. Sonra, bir saldırgan aynı bilgisayarda oturum açarak birkaç gün sonra banka işlemleri için gerekli formu gönderir. Bu form, sadece doğru oturumu açan kişi tarafından gönderildiğinde işleme alınabildiği için, saldırgan otomatik olarak formu gönderir ve aynı zamanda banka işlemlerine yetkisiz erişim sağlar. Bu nedenle, tarayıcının yetenekleri CSRF saldırılarının gerçekleştirilmesine olanak tanır ve doğru önlemler alınmadığı takdirde sürekli bir tehdit unsuru olmaya devam eder.


CSRF Saldırısına Karşı Alınabilecek Önlemler

Cross-Site Request Forgery (CSRF) saldırısı web uygulamalarında sıklıkla karşılaşılan bir güvenlik zaafiyetidir. Bu saldırı türünde, saldırgan kullanıcının tarayıcısına bir link veya script göndererek sisteme yetkisiz bir şekilde erişebilir.

Bu tür saldırılara karşı PHP kodlayıcılarının alabileceği önlem teknikleri mevcuttur. Bunlar arasında en etkili olanı, random token kullanımıdır. Random token, her sayfa karşılaştığında otomatik olarak oluşturulan bir dizi karakterdir. Bu karakteri istekler arasında kullanarak, saldırganın sisteme erişememesi sağlanır.

Random token kullanımının yanı sıra, token oluşturma ve depolama teknikleri de saldırılara karşı önemli bir koruma sağlar. Token'lar, istekler arasında depolanarak sistem tarafından kontrol edilirler.

Token kontrollerinin doğru bir şekilde yapılabilmesi için, kullanıcının erişim hakları gibi özel bilgileri içermesi gereken token'lar, güvenli bir şekilde depolanmalıdır. Aksi takdirde, sisteme erişim kodlaması saldırgan için kolay olacaktır.

Referrer kontrolü de bir diğer CSRF saldırısı engelleme yöntemidir. Bu yöntemde, isteklerin kaynağı kontrol edilerek, yetkisiz erişimler engellenmektedir.

Captcha kullanımı da önemli bir koruma yöntemidir. Bu yöntem, kullanıcının gerçek bir kişi olduğunu doğrulayarak, saldırganların sisteme erişimlerini zorlaştırır.

Yukarıda bahsedilen tekniklerin her biri, PHP kodlaması için özel olarak kullanılabilir. Örneğin, random token'ların kullanımı aşağıdaki örnek kodda gösterilmiştir:

$table = db_query('SELECT * FROM users WHERE uid = ?', array($uid));$token = substr(base64_encode(openssl_random_pseudo_bytes(64)), 0, 32);$_SESSION['token'][$table->oid] = $token;

Token oluşturma ve depolama içinse aşağıdaki örnek kodlar kullanılabilir:

$token = md5(uniqid(mt_rand(), true));$_SESSION['token'] = $token;

Token kontrolü işlemi de aşağıdaki örnek kod kullanılarak gerçekleştirilebilir:

session_start();if ($_POST['token'] !== $_SESSION['token']) { die('Token hatası oluştu');}

Yukarıda bahsedilen teknikler, PHP kullanıcılarının CSRF saldırılarına karşı alabileceği önlemlerdir. Bu tekniklerin yanı sıra diğer birçok önlem de mevcuttur. Ancak, bu tekniklerin uygulanması bile saldırganların sistemlere erişimlerini önleyebilir ve web uygulamalarının güvenliğini artırabilir.


Random Token Kullanımı

CSRF saldırısı, kötü amaçlı saldırganların hedef web sayfasındaki formu atan kullanıcının kimliğiyle sahte talepler göndermek için kullanması sonucunda gerçekleşir. Bu nedenle, form doğrulama için token kullanarak bu saldırı türünden korunmak mümkündür.

Token, oturum açılış zamanı rastgele oluşturulan bir dizedir ve form gönderme talebiyle birlikte sunucuya gönderilir. Sunucu bu alıcıyı doğrular ve eğer token eşleşirse form işlenir.

Örnek kod:

Form PHP Sorgusu
                <form action="submit.php" method="POST">                    <input type="text" name="username"><br>                    <input type="password" name="password"><br>                    <input type="hidden" name="token" value="[random_token]">                    <input type="submit" value="Submit">                </form>            
                <?php                    session_start();                    if($_SERVER['REQUEST_METHOD'] == 'POST') {                        if($_POST['token'] == $_SESSION['token']) {                            // form işlenir                        } else {                            // hatalı token                        }                    }                    $token = md5(uniqid(mt_rand(), true));                    $_SESSION['token'] = $token;                ?>            

Yukarıdaki kod örneği, formda saklanacak olan rastgele token'ın oluşturulmasını ve saklanmasını gösterir. Sunucudaki PHP betiği, form gönderildiğinde saklanan token'ı POST isteğinin bir parçası olarak kontrol eder.

Random token kullanımı, CSRF saldırılarına karşı oldukça etkili bir önlemdir ve web uygulamalarının güvenliğinin önemli bir parçasıdır.


Token Oluşturma ve Depolama

CSRF saldırılarına karşı korunmak için token kullanımı oldukça etkilidir. Token'lar, web uygulaması tarafından oluşturulan rastgele bir kümedir ve bu token'lar, doğru şekilde kullanıldığında saldırılardan korunmak için oldukça etkilidir. Token'ların oluşturulması ve depolanması, çok önemlidir.

Token'lar oluşturulmadan önce, web uygulaması için bir saldırı durumu belirleyin. Token, saldırıya dirençli olmalıdır. Token'ların oluşturulmasında, PHP tarafından sağlanan birkaç fonksiyondan yararlanmak mümkündür. Bunlardan biri, "bin2hex(random_bytes())" fonksiyonudur. Bu fonksiyon, online web uygulamalarında rastgele token üretmek için güvenli bir yöntemdir.

Token'lar genellikle bir veritabanında saklanır. Veritabanında bir tablo oluşturun ve bu tabloda token'ları saklayın. Bu token'ların her biri, belirli bir kullanıcının kimliğini referans alarak üretilir. Token'ların depolanması sırasında dikkat edilmesi gereken bir diğer husus, bunların sistemi yavaşlatmaması ve depolama alanının gerekli boyutunda olmasıdır.

Token'ların oluşturulması ve depolanması crucial olsa da, bunların kullanımı da çok önemlidir. Web uygulaması, bir kullanıcının gönderdiği herhangi bir form verisiyle birlikte önceden üretilmiş token'ı göndermelidir. Bu token, kullanıcının oturum bilgileriyle birlikte kaydedilir ve her bir post işleminde güncellenir. Bu sayede, saldırganların sistemdeki güvenlik açıklarından faydalanarak veri çalmasını engellenebilir.

Bu gibi yöntemler kullanılarak, web uygulamaları CSRF saldırılarından korunabilir. Ancak bu önlemlerin alınması, yine de kesin bir çözüm değildir. Bu nedenle, web uygulamaları, güvenliğini kontrol etmek için sürekli olarak takip edilmeli ve güncellenmelidir.


Token Kontrolü

Token kontrolü, alınan güvenlik önlemlerinin son basamağıdır ve CSRF saldırısından korunmak için oldukça önemlidir. Token'ın doğru gönderilip gönderilmediği kontrol edilerek, saldırganların token'ı taklit etmeleri engellenir.

Token kontrolü işlemi kodda şu şekilde gerçekleştirilir:

```if(isset($_POST['submit'])) { if($_POST['token'] === $_SESSION['token']) { // Token doğru, işlem yapılabilir } else { // Token yanlış, işlem yapılamaz }}```

Öncelikle, formda gönderilen token ve session'daki token karşılaştırılır. Eğer token'lar eşleşiyorsa, işlem yapılabilir. Eğer token'lar eşleşmiyorsa, işlem yapılamaz.

Token'ın nasıl oluşturulduğu daha önce bahsedildiği gibi, öncelikle rastgele bir token oluşturulmalıdır. Oluşturulan bu token, session'da saklanmalı ve formda gönderilirken de aynı şekilde saklanarak gönderilmelidir.

Token'ın yanlış gönderilmesi veya saldırganların taklit etmeye çalışması, genellikle hata mesajlarına yol açar. Bu hata mesajları, saldırganların hangi adımları doğru yapmaları gerektiği konusunda bilgi sahibi olmalarına neden olabilir. Bu yüzden, hata mesajları daha genel bir şekilde yönetilmelidir. Örneğin;

```if(isset($_POST['submit'])) { if($_POST['token'] === $_SESSION['token']) { // Token doğru, işlem yapılabilir } else { // Token yanlış, hata mesajı gösterilir. die("Bir hata oluştu. Lütfen tekrar deneyin."); }}```

Bu şekilde hatalar daha genel bir şekilde yönetildiği için saldırganların hangi adımları doğru yapmaları gerektiği konusunda bilgi sahibi olmaları engellenir.


Referrer Kontrolü

Referrer kontrolü, web uygulamaları ve web tarayıcıları tarafından sağlanan bir güvenlik mekanizmasıdır. Bu mekanizma, isteklerin kaynağına göre doğrulama yapar ve CSRF saldırılarına karşı bir önlem olarak kullanılır. Referrer, HTTP isteği gönderen sayfanın URL'sini içeren bir HTTP başlığıdır.

Bir CSRF saldırısı durumunda, saldırgan, hedef web sayfasına istekte bulunacak bir form sayfası hazırlar ve bu formu, hedef kullanıcıya ulaştırmak için bir spam e-postası, sosyal medya mesajı veya kötü amaçlı bir reklam kullanarak gönderir. Bu sayede, hedef kullanıcı sahte bir talep gönderir ve kötü niyetli işlemler gerçekleştirilir.

Referrer kontrolü bir önlem olarak, hedef web sayfasının istek kaynağını alarak bağlantıyı kontrol eder ve sadece kaynakların doğrulanmış olan istekleri kabul etmesini sağlar. Bu saldırı türüne karşı alınan diğer önlemlerle birlikte kullanıldığında, web uygulamalarının tehlikeli gönderimlerden korunmasına yardımcı olur.


Captcha Kullanımı

Cross-Site Request Forgery (CSRF) saldırıları, internet kullanıcılarının en sık karşılaştığı güvenlik sorunları arasında yer almaktadır. Bu tür saldırılar, internet kullanıcılarının bilgilerinin çalınmasına ve kötü niyetli kişiler tarafından kullanılmasına neden olabilir. Bu nedenle, web geliştiriciler ve siber güvenlik uzmanları, CSRF saldırılarına karşı alınacak önlemlere yoğunlaşmaktadır. Bu yazımızda, CSRF saldırılarına karşı kullanılan en etkili önlemlerden biri olan Captcha kullanımını ele alacağız.

Captcha, WEB formu alanlarını korumak için yerleştirilen araçtır. Bu kullanım sayesinde, formu dolduran kişi gerçek bir insan olup olmadığı belirlenebilir. Captcha kullanımı, dünya genelinde birçok web sitesinde popüler hale gelmiştir. Bu sayede, spam mesajlar ve bot saldırıları önlenir.

Captcha, CSRF saldırılarına karşı güvenlik önlemi olarak da kullanılabilir. Bu başarılı bir yöntemdir. Çünkü, kullanıcıların yerleştirilen Captcha kodunu girerek, formu doldurması zorlaştırılır. CSRF saldırıları için, ciddi anlamda iş yükü artacağından, saldırganlar bu tür saldırılardan kaçınabilirler.

Örneğin, bir kullanıcının web sitesindeki bir formu doldurmak üzere giriş yapması gerektiğinde, Captcha kodu kullanımı gereklidir. Bu sayede, formların yalnızca gerçek kullanıcılar tarafından doldurulmasına izin verilir. Ayrıca, Captcha'nın altında yer alan "yenile" butonu, kullanıcıların yeni ve farklı bir Captcha kombinasyonu istemelerine olanak sağlar. Bu sayede, güvenlik önlemleri arttırılır.

Captcha kullanımının CSRF saldırılarına karşı etkili olması için, Captcha alanını sağlam bir şekilde kodlamak gereklidir. Doğru kodlama sayesinde, saldırganların Captcha kodlarını kırması ya da atlaması engellenir. Bu nedenle, Captcha kodlama işlemi profesyonel bir şekilde yapılmalıdır. Bu sayede, saldırıların etkisiz hale getirilmesi mümkün olabilir.

Captcha, CSRF saldırılarının ana nedenlerinden birine karşı etkili bir çözümdür. Herhangi bir web sitesinde, Captcha kullanımının standart bir güvenlik önlemi olarak yer alması gereklidir. Bu sayede, web siteleri saldırganlar tarafından ele geçirildiğinde bile, kişisel bilgilerden daha fazla zarar görülmemiş olur.

Captcha kullanımını CSRF saldırılarına karşı en iyi yapan şeylerden biri de, onların web sitelerinden çıkarma oranının yüksek seviyelerde olmasıdır. Captcha kodlarının, form doldurma işlemlerinin organik olarak gerçekleştirilmesini kolaylaştırdığı unutulmamalıdır. Bu sayede, web sitesi sahipleri internet sitesinin kullanımını artırmak istediklerinde, kullanıcıların kendilerine güvenli ve korumalı bir platform sunulacağından emin olabilirler.


Örnek Kodlar

Bu bölümde, CSRF saldırılarına karşı PHP kullanarak alınabilecek önlemler için bazı örnek kodları göreceğiz.

Öncelikle, Random Token kullanımı ile başlayalım. Bu yöntem, web sayfasının her ziyaretinde rastgele bir token oluşturarak, saldırganların sayfaya erişmesini engeller. Aşağıdaki kodu kullanarak, HTML formunuzu koruyabilirsiniz:

```session_start();$_SESSION['token'] = md5(uniqid());```

Token oluşturmak için, `session_start()` çağrısı kullanılarak oturum başlatılır ve `uniqid()` fonksiyonunu kullanarak benzersiz bir değer oluşturulur. Bu daha sonra `md5()` fonksiyonuyla özetlenir. Daha sonra, formunuzda bir gizli alan ekleyerek token'ı form ile sunabilirsiniz:

``````

Bu, form verilerinin sunucuya gönderilmesini engellediği için CSRF saldırılarını engeller.

Bir sonraki önlemimiz Token Kontrolü'nden bahsediyor. Bu, sunucudan token'ın alınması ve form verileriyle sunucuya sunulması arasında bir eşleme yapılmasını sağlar. Aşağıdaki örnekte, sunucuda token kontrolü için PHP kodu görebilirsiniz:

```session_start();if($_POST['token'] !== $_SESSION['token']) { die("Token Geçersizdir!");}```

Bu kod, POST verileri içinde bulunan "token" değeri ile sunucuda kaydedilen token değerlerinin eşleşmeyip eşleşmediğini kontrol eder. Eğer eşleşmezse, kullanıcı token geçersizdir mesajını alır.

Captcha kullanarak CSRF saldırılarından korunmak için aşağıdaki örnek kodları kullanabilirsiniz:

```session_start();//Captcha yapısını yükleyininclude_once "captcha/CaptchaSecurityImages.php";$securityImage = new CaptchaSecurityImages(80, 30, 5);$securityImage -> showSecurityImage();//Captcha değerini doğrulayınif ($_SESSION['security_code'] != $_POST['security_code']) { die("Captcha doğrulanamadı.");}```

Burada, `include_once` fonksiyonu kullanarak Captcha yapısını yükleyebilirsiniz. CaptchaSecurityImages sınıfını kullanarak kullanıcıya görüntü gösterilir. Gösterilen görüntüden, kullanıcının göndermeye çalıştığı formda Captcha değerini doğrulayabilirsiniz.

Bu örnek kodlara benzer şekilde, PHP kullanarak CSRF saldırılarına karşı çok sayıda farklı önlem alınabilirsiniz. Unutmayın, her önlem istisnalarını ve farklı durumlarını ele alır. Bu nedenle, web sitenizi herhangi bir saldırıya karşı korumak için tüm önlemleri almanız gerekebilir.