Merhabalar.Tespit ettiğim güvenlik açıklarını ve sebeplerini açıklıyorum.
SQL INJECTION
İlk olarak verdiğiniz kodda url üzerinden gönderilecek parametrelerin güvenliğini sağlamadan "$_GET"
değişkeni kullanılıyor.Örneğin kullanıcı adı ve ya şifre kısmına OR '1'='1 admin tarzı veriler girileceğini göz önüne alacak olursak sql sorgumuz
bu şekilde olacaktır; "SELECT * FROM user WHERE username = 'admin' AND password = 'password' OR '1'='1';
kodumuzda password alanı için güvenlik önlemi olmadığından 1=1 koşulunu sağlayan her şeyi yani veritabanındakı tüm kullanıcıları döndürecektir.
Açığı önlemek için kullanıcı bilgilerini sql sorgusuyla doğrudan birleştirmek yerine, php data objects (pdo) ve ya mysqli tarzı hazır ifadeler kullanmak gerekli.
XSS
" echo "Invalid username ($username) or password"; " bu kodun bulunduğu satırda username değişkeni filtreleme olmadan doğrudan string içerisine
yerleştiriliyor ve filtreleme yok."><script>alert('XSS Attack!');</script> gibi özel karakterler ve ya html etiketleri kullanıldığında tarayıcı bu kodu çalıştırır ve xss açığı ortaya çıkar.Bu açığı önlemek için specialchars ve ya strip tags gibi fonksiyonlar kullanarak tarayıcı tarafından özel karakterlerin yorumlanmasını engelleye biliriz.Örnek;
echo "Invalid username (" . htmlspecialchars($username) or password";
HEADER
Kodumuzda header yönlendirmesi yapmadan önce echo ile bir çıktı veriliyor.Tam olarak şurada:echo "Invalid username ($username) or password"; . Bu bazen kodun doğru çalışmasını engelleye biliyor.Düzeltecek olursak hata çıktısını vermeyip doğrudan yönlendirmemiz gerekiyor.Örnek:
} else { header('Location: /error.php');} . Bu şekild, eğer kullanıcı adı veya parola geçersizse, hata mesajı yerine doğrudan başka bir sayfaya yönlendirme yapılır ve header fonksiyonu çağrılmadan önce herhangi bir çıktı verilmez. Bu sayede header yönlendirmesi sıkıntı çıkarmadan çalışır.
Atladığım ve ya yanlış yorumladığım bir konu varsa,yardımcı olursanız sevinirim.Herkese iyi forumlar.