PHP’de Güvenlik Önlemleri

Merhaba arkadaşlar, bu yazımda çoğu Php programcısının çok fazla önem göstermediği sıkça yapılan güvenlik açıklarını ve bu açıkların nasıl giderileceği konusunu anlatacağım. Genel olarak amaç yazılımı çalıştırabilmek ya da hızlı çalıştırabilmek olunca çoğu kişi güvenliği önemsemiyor ama bu yaptıkları hatanın bedelini, bütün emeklerinin heba olmasıyla ödemeleri pek muhtemel. Bundan dolayı yazdığımız betiklerin hızlı çalışması kadar güvenliğinin de üst düzey olması çok önemli. Yazımıza, güvenlik açıklarını teker teker inceleyerek ve çözümlerini ele alarak başlayalım.

Form Elemanlarından Veri Alırken Karşılaşılan Problemler: Burada iki türkü sorunla karşılaşılır. Birincisi Html etiketlerinin temizlenmemesinden (XSS “Cross Site Scripting”) kaynaklı olan problemlerdir. Böyle bir durumda, kullanıcıların çerezlerinde (cookie) saklı olan sisteme giriş bilgilerinin çalınması pek muhtemel. Diğeri ise veritabanına gönderilen bilgilerin temizlenmemesinden (SQL Injection) kaynaklanan problemlerdir. Bu durumun sonucunda ise veritabanınızın silinmesinden, izinsiz girişlerin olmasına kadar bir çok sorunla karşılaşırsınız. Şimdi de bu problemlerin nasıl çözüleceğini anlatayım.

alert('hecklendin');
$formdan_gelen = "";

//Html etiketlerini temizler
$formdan_gelen = strip_tags($formdan_gelen);
//Html etiketlerini zararsız hale getirir
$formdan_gelen = htmlentities($formdan_gelen);
//Html etiketlerini zararsız hale getirir
$formdan_gelen = htmlspecialchars($formdan_gelen);
?>

Yukarıda Html etiketlerinin zararsız hale getirme işlemini gösterdim. Şimdi de veritabanına yapılan saldırılardan ve izinsiz girişleri engelleme yöntemlerini açıklayayım.

Vertabanınında bulunan verilerin çalmasının, silmesinin ya da izinsiz girişlerin önüne geçmek için Html etiketlerini temizledikten sonra yukarıda bulunan kesme işaretini geçersiz yapmayı uygulamanız yeterli. Fakat mysql_real_escape_string kullanacaksanız, bu koddan önce MySQL bağlantınızı açmayı unutmayın.

Dosya Yükleme İle İlgili Problemler: Yüklen dosyalar diğer bir önemli güvenlik sorunudur. Bundan dolayı yüklediğiniz dosyaların türüne dikkat etmeyi sakın unutmayın. Şimdi bu sorunun çözümünü yapalım.

'.jpg',
'image/pjpeg' => '.jpg',
'image/png' => '.png',
'image/x-png' => '.png',
'image/gif' => '.gif'
);

//yüklenen dosyanın türü
$tur = $_FILES['file']['type'];

//dosya türü kontrolü
if(!array_key_exists($tur, $izinli_dosyalar)){
echo "Bu türde dosya yükleyemezsiniz.";
}
?>

Dosya Import Ederken Karşılaşılan Problemler: Parametreden sayfa include ederken (index.php?sayfa=iletisim.php), allow_url_fopen ayarı açık olduğunda uzak siteden zararlı betikleri sisteminizde çalıştırabilirler (tam yol bağlantı adresi ya da ip adresi göstererek). Bunu çözmek için include yerine file_get_contents() kullanabilir ya da uzak site olarak verilebilecek parametreleri temizleyebilirsiniz. Şimdi parametre temizleme ile ilgili çözümü yapalım.

Bağlantıdaki Parametre İle İlgili Problemler: Form elemanlarından veri alırken karşılaşılan problemlerin aynısı bu konu için de geçerlidir. Bundan dolayı o sorunları burada yapacağımız örneklere de uygulayın. Ben diğer önemli bir açıktan daha bahsedeceğim. Sayfamızın bilgisini başka bir sayfaya aktarırken kullandığımız parametre değerlerine, müdahale etmek çok kolay. Bu sorunu en çok özel mesaj kutusunda yaşarız. Eğer şifreleme yapmazsak herkesin mesajlarına erişmemiz mümkün. Bundan dolayı, bu parametre değerlerini şifrelemeniz kullanıcılarınızın ve bilgilerinizin güvenliği açısından çok önemlidir.

Bu örnekte parametreye erişmek mümkün fakat hem mesaj id değeri hem de sabit değerin ikisini birden doğru tahmin etme olasılığı neredeyse mümkün olmadığı için bilgileriniz (örnekteki özel mesajlar için) güvende oluyor.

Global Değişken İle İle İlgili Problemler: Register Globals olarak bilinen bu sorunla en çok oturum açarken karşılaşırız. Global değişkenler ($_SESSION, $_POST, $_GET vs.) evrensel olduklarından dolayı değerleri her yerde geçerlidir. Bundan dolayı, bu değişkenlere yapılacak saldırıları hesaba katmak zorundayız. Sorunu çözmek için oturum açılmamışsa bile ilk önce oturumu iptal etmeli sonra oturum açılmalıdır. Hemen bu durumun örneğini yapalım.

Bu örnekte oturumu iptal edip sonra açtığımız için saldırıda bulunan kişi giriş izni alamayacaktır. Yazdığınız programların güvenli olmasını istiyorsanız bu yazıdaki örneklerin hepsini birbiriyle uyum içerisinde kullanmalısınız. Bir kaçını dikkate alıp birkaçını dikkate almazsanız da güvenlik açığı vermiş olursunuz. Bu yazıda, sıkça düşülen güvenlik hatalarını anlatmaya çalıştım. Umarım faydalı olmuştur. Kısaca söylemek istediğim, kod yazmak kolay güvenliğini sağlamak zordur, verdiğiniz emekleri küçük ihmaller yüzünden kaybetmek istemiyorsanız yazılımı yaptığınız kadar güvenliğine de zaman ve emek harcayın.