1) Kullanıcı Input Kontrolu

Web siteniz uzerine kullanıcıdan gelen her turlu veriyi mutlaka filtrelemeniz gerekir. $_POST , $_GET, $_COOKIE gibi kullanıcılardan gelebilecek veriler sistemde dosya acma, veri tabanı işlemlerinde kullanılıyorsa mutlaka kullanıldıkları alana uygunlukları kontrol edilmelidir.

Orneğin navigasyonu, index.php?sayfa=XXXX şeklinde kurulmuş bir programın kodları aşağıdaki şekilde yazılırsa.

PHP:
if ($_GET['sayfa'])

Cok buyuk bir guvenlik acığı var demektir. Programın beklediği URL ler index.php?sayfa=sozler.html iken, kotu niyetli bir kullanıcı index.php?sayfa=/etc/shadow ile tum unix sisteminin password dosyasını ele gecirebilir.

Bunun daha da kotusu eski versiyon PHP kullanıp register_globals ON tutulmuşsa, her turlu değişkene URL satırından değer vermek mumkun olur.

Diğer bir ornekte veritabanına kullanıcı doğrulaması yapılan bir kodda

SELECT username FROM users WHERE username='$user' AND password='$pass'

Sorgusu kullanılıyor ise, kotu niyetli bir kullanıcı URL satırından
login.php?pass=' OR '1'='1 girdisini verdiğinde SQL aşağıdaki şekle donuşur

SELECT username FROM users WHERE username='$user' AND password='' OR '1'='1'

Bu sorgu sonucunda şifresiz bir şekilde kullanıcı adına giriş yapabilirsiniz.


2) Kullanıcı Input + XSS

Yine kullanıcı, cross site scripting dediğimiz şekilde bir siteden başka bir siteye veri kacırma işlemi yapabilir. HTML elementleri kabul eden bir formunuza kotu niyetli bir kullanıcı aşağıdaki html kodunu girebilir.

Kod:


Bu tarz bir enjeksiyon ile X sitesindeki kişilerin cookieleri kotu adamın sitesine taşınır. Cookie ile hassas bilgi taşınan sitelerde, bu sayede kotu adam herhangi bir kullanıcı adına diğer siteye giriş yapabilir.

* İlla html tagları gerekliyse, en azından gibi zararlı şeylere acık taglar filtrelenmelidir. Bunun icin htmlspecialchars(), strip_tags() gibi fonksiyonları inceleyiniz.

* Diğer turlu enjeksiyonlar icin addslashes() fonksiyonu ile tırnaklar escape edilmeli, her turlu form girdisi, programın beklediği ozellikleri taşıyıp taşımadığına dair kontrol edilmelidir.

* Asla kullanıcı girdisinden file include(), require() fonksiyonları kullanılmamalıdır. Veya filtrelenerek kullanılmalıdır.


3) Dosya İzinleri

config.php db.php gibi veritabanı şifrelerinin plain-text saklandığı ortamlarda mutlaka sunucuların dosya okuma izin ayarları doğru yapılmalı. Genelde shared host ortamlarında herhangi başka bir kullanıcının web dizin adresi bulunduğunda, o dizinlere fopen() ile erişim sağlanabiliyorsa, o host ortamında buyuk bir guvenlik acığı var demektir. Bir cok panel, ve eski versiyon uygulama, php+apache ortamında safe mode veya open basedir varsayılan olarak kullanmamaktadır. Birden cok kullanıcının eriştiği ortamlarda mutlaka herkes kendi dizinine limitlendirilmeli, diğer kişilerin dizinlerine dosya acma izini verilmemelidir.

4) Hata Bildirimleri

Hata bildirimlerini mutlaka kapayınız. Dizin ve dosya isimleri hata bildiriminde browsera verilmekte ve kotu niyetli kullanıcılar uygulamanız hakkında ek bilgi edinebilmektedir. PHP'de error_reporting bolumunu inceleyin.

5) Session Guvenliği

Sessionlar en cok hatalı ve zarar verilmeye acık kod yazılan alanlardan biridir.

Herşeyden once session bilgisinin tutulduğu /tmp, /var/lib/php/session gibi dizinlere erişimler kısıtlanmalıdır. Dosya listesi cekmek icin yapılacak bir işlemde bile diğer insanların Session ID bilgileri listelenebilmektedir. Herhangi bir kişinin Session ID'sine sahipseniz, sunucuya kendinizi o kişi olarak tanıtabilme yeteneğine kavuşursunuz.

PHP:
if ($_SESSION['user_id'])

Bu tarz bir kod asla tek başına bir kişinin giriş yapıp yapmadığına bir işaret olarak kullanılmamalıdır. İdeal olarak, performans sorununuz yoksa database'den user_id veya password gibi alanlar her adımda onaylatılarak devam edilebilir.

Yine XSS kullanarak kotu adam size ozel bir session_id sini X sitesine girdiğinizde ustunuze atayabilir. (COOKIE veya URLden). Kullanıcı session_id sini alır ve sitede gezmeye başlar. Siteye giriş yapar yapmaz ise yukarıdaki ornekteki gibi sitenin sadece ozel kullanıcılarına acık alana girer. Kotu adam ise, daha onceden kendisi atadığı session_id sine sahip olduğu icin kendini o kullanıcı gibi gosterip iceriye giriş izni bulur.

Bu cok basit bir teknik gibi gorunsede web sitelerinin bir coğu bu atağa karşı acıktır. Kullanıcılar giriş yaptıktan sonra session_regenerate_id() ile session idlerini mutlaka yeniden atayınız. Giriş yapmadan onceki ID'nin guvenilirliği sizde olmadığı icin mutlaka yeni bir tane veriniz. Onu sizin verdiğinizden eminsiniz, ama diğeri kotu adam tarafından verilmiş olabilir.

Ek olarak session guvenliği icin, kullanıcının IP Adresi, User Agent'i şifrelenmiş olarak veritabanından kontrol edilebilir. Bu sayede kotu adam ID'ye sahip olsa bile onune bir adım engel daha koymuş olacaksınız.

Kredi kartı, şifre gibi bilgileri asla session veya cookie uzerinde plain-text olarak taşımayınız.


--

Devam edecek.