Aslında kısa bir şekilde bir konuya değineceğim. Bazı şahıslar scriptler yapıp satarak bir şekilde ekmek parası derdindeler lakin ekmek parası kazanacağım derken de yapılan bir sistemin baştan savma olmaması gerek. Geçenlerde ufak bir script adını vermeyeceğim elime geçti ve biraz inceleme fırsatım oldu. Scriptteki ilk gözüme çarpan şey kullanıcılardan alınan verilerin iyi süzülüp vt ye kaydedilmemesiydi.  Hadi bunu geçtik diyelim bir php betiğinin admin klasöründe olmasının nasıl bir güvence altında olduğunu anlamak inan o kadar zor ki.

Yani insan bunu acaba admin dizinine atarak o dosyayı koruduğunu mu sandı yoksa eski versiyonlardan kalan işe yaramayan bir php betiğimiydi orda yıllanmaya yüz tutan :) Bu betik hiç bir şekile güvenlik altına alınmamış ve dışarıdan veri post edilerek veritabanına ekleme yapılabilmekteydi. Yazının başında da değindiğim verilerin iyi süzülmemesi de bu açığı biraz daha ateşli tetikleyerek admin kısmında javascript kod çalıştırılmasına izin vermekteydi neyseki script yapımcısına bildirdim ve  açığı kapadığını bildirdi ama bu açıktan haberdar olup da patch yapan kaç kişi vardır bilinmez.

Böyle olunca da istenirse admin cookie bilgileri alınabilirdi veya yönlendirme kodu eklenerek site başka bir siteye yönlendirebilirdi. Asıl demek istediğim şeye gelince şunları unutmamakda fayda var.

Script Kodlarken;

  • Kullanıcıdan alınan verilerin iyi filtrelenmesi gerekiyor. Bunu ilk başta vt ye kaydederken yaparsanız veri listeleme kısmında ekstra işler yapmaktan kurtularak scriptinizin performansınıda bir nebze sağlamış olursunuz.
  • Scriptinizin yönetim kısmında bulunan sayfalara mutlak suretle güvenlik fonksiyonları uygulayın. ( Define ile koruma veya SESSION vb..)
  • İlk madde de söyledim ama burdan yine fayda var söylemekte. Dışarıdan alınan verilerin mutlak suretle kontrolünü  yapınız. Örneğin bir integer değer alıyorsanız bunu is_numeric() veya intval() gibi fonksiyonlardan geçirerek sql sorgularınıza dahil ediniz.
  • String değerlerinize mutlak suretle sql sorgunuza dahil etmeden önce mysql_real_escape_string() veya addslashes() gibi fonksiyonlardan geçiriniz aksi halde php.ini de magic_quotest_gpc kapalı olduğu durumlarda sql injecktionlara elvermiş olursunuz.
  • XSS veya html gibi zarar verecek kodlardan kurtulmak için strip_tags() veya htmlspecialchars() gibi fonksiyonlardan geçiriniz. Eğer bunlar sizi tatmin etmez ise html prufier sınıfını kullanabilirsiniz. Ayrıca strip_tags() kullanırken bazen bazı etiketlere izin vermek durumunda kalabiliriz örneğin <img> <a> bunlar ilk başta zararsız gibi görünse de <img src=”javascript:alert(document_cookie);”> gibi bir string ile aşılabilir o yüzden iyi bir filtreleme yapmanız gerekiyor.
  • Diğer bir husus dosya upload konusu. Çoğu yeni programcı dosya tip kontrolünü basit bir mantık ile yapmaktalar Nedir bu yöntem hemen açıklayalım explode ile dosya adını nokta (.) karakterinden bölerek elde edilen dizinin birinci elemanının daima uzantı olacağı ihtimalini düşünmeleridir. Bu yanlış bir yöntemdir ve çok kolay aşılabilmektedir. Her dosya “dosya.uzanti” şeklinde olacak diye kural kaide yoktur. Örneğin şu şekilde olabilir exploit.jpg.php. Bu şekilde bir php dosyası az önceki bahsettiğim zayıf güvenlikten dolayı sunucuya upload edilebilmektedir.  Çünkü nokta (.) dan bölünerek elde edilen dizinin birinci elamanı “jpg” olduğundan kolayca aşılacaktır ama asıl dosya uzantısı php idi. if ($dosya_tip == $uzanti[1])…
  • Yönetici veya Kullanıcı oturumlarında eğer COOKIE kullanıyorsanız mutlak suretle COOKIE deki değerleri ilgili admin veya üye tablonuza sorgu yaparak COOKIE deki değerin doğruluğunu teyit ediniz. Bunu söylememin sebebi ise programcıların bazen basit hatalar yapmasından kaynaklanıyor. Örneğin bir cookie değeri atanır ve oturum kontrollerinde o çerez var ise geçiş izni verir. Saldırgan bu cookie değerini elde ettiği vakit sahte bir cookie yaratarak sizin sağlamış olduğunuz o güvenliği delip geçer. Hatta gerekirse kriptolayarak cookie değerleri atarsanız bir anahtar değeri ile güvenliğinizi daha da artırmış olursunuz.
  • Gerekmediği Sürece COOKIE oturum yönetimi  kullanmak yerine SESSION kullanabilirsiniz.  Sebebine gelince COOKIE değerler ziyaretçilerin bilgisayarlarına kaydedildikleri için değişime uğrayabilme ihtimalinin olmasıdır.

Şuan aklımda bu saatte bunlar var ve paylaşayım dedim.