Bu yazımda Cookies ve Session kullanmadan Php & MySQL sistemlerde giriş, çıkış gibi işlemleri yapmayı deneyeceğim. Kısaca admin panelinin giriş işlemleri de diyebiliriz. Şimdi kesin içinizden demişsinizdir ne alaka. Bu kadar saçma bir şeye ne gerek var? diye. Aslında mantıklıca baktığımızda saçma doğru. Farkındayım Ama yazım amacım şu; ufkumuzu genişletmek. Lisede gördüğümüz matematik derslerin deki saçma sapan aşırı uçlarda yer alan sorular gibi görelim bunuda. Hiçbir işimize yaramayacak, kullanmayacağız belki ama azda olsa ufkumuzu genişletmiş olacağız. Belki okurken içinden çıkamadığınız bir projeye çözüm bile olabilir. Şahsen bana oluyor, o yüzden bu tarz değişik makaleleri bol bol okurum.
Neyse geçelim bakalım sistemimize. Şöyle kısaca mantığından bahsedeyim sonrasında veri tabanı şemasına geçelim bakalım. Şimdi veri tabanımızda admin bilgilerinin yer aldığı tabloda bir kolonumuz olacak. Aşağıda kolonun adını ‘giris’ diye adlandıracağım. Admin giriş yapacağı zaman eğer kullanıcı adı ve şifre doğru ise, ‘giris’ kolonuna giriş yapıldığını belli eden bir değer kaydedecek ve giriş yapılacak. Çıkış yapılınca da o kolonun içi temizlenecek. Ve giriş yapılmadığı zaman kolonun içi boş olacağından eğer içi boşsa sayfaları göstermeyecek.
Şimdi veri tabanımıza geçelim. Veri tabanımız da ki admin giriş bilgilerinin yer aldığı tablomuzun adı “admin” olsun. Bu tablo altında da ‘admin_id’, ‘kullanici_adi’, ’sifre’, ’giris’ gibi kolonlarımız olsun. Tabi bunları istediğiniz gibi yazacağınız sisteme göre artırabilirsiniz. Ama ben şuan bize lazım olacak temel bilgileri yazdım sadece.
Veri tabanımızı oluşturduk. Şimdide şimdi de içini dolduralım. ‘admin_id’ nin değeri 1 olsun. Birden fazla admin de olabilir tabi. Ama biz şimdilik sadece bir tane varmış gibi anlatalım. Zaten admin sayısı artınca da mantık değişmeyecek. ‘kullanici_adi’ nın değeri klasik olarak admin olsun bakalım. Şifrede 123456 olsun ama şak diye 123456 diye işlemesin veri tabanına. Hacker abi(!)lere davetiye çıkartmayalım. Onuda normal bir şekilde şifrelemeniz yeterli olacaktır. Ben genelde girilen şifreyi önce md5 sonrasında sha1 ile şifreler, oluşan 40 karakterlik yeni şifrenin ilk, orta son kafama göre 32 karakterlik kısmını alırım. Hemen gösterip sonrasında da niye böyle bir şey yaptığımı kısaca anlatayım.

$gelen_sifre = $_POST["sifre"];
$sifre = sha1(md5(".$gelen_sifre."));
$yeni_sifre = substr($sifre, 5, 37);
?>


Bu şekil şifreledim çünkü herhangi bir kelimeyi md5 ile şifrelediğimizde 32 karakterli bir değer çıkar karşımıza ve günümüzde en çok kullanılan metoddur. Genelde yazılımcılar sadece md5 ile şifreleyip veri tabanına kaydeder. Ve biri onun veri tabanına girip o md5 değerini alıp herhangi bir online brute force aracılığı ile şifreyi rahatça kırar. Yok efendim şifre zor olunca wordlistlerde olma olasığı az olduğundan zor şifreler kırılamaz gibisinden boş laflara inanmayın sakın. Çeşitli dillerle yazılmış değişik mantıklarda md5 kırma algoritmaları mevcut. İsteseniz 100 karakterli içinde her türlü değerin olduğu bir şifreyi md5leyin onu bile kırabilirler. Sadece zaman gerekir o kadar. Neyse dönelim konumuza. Şimdi neden sadece md5 ile yetinmeyip sha1 ile de şifrelediğimi anladınız. Şimdi de neden sha1 değerimizin 32 karakterlik bir kısmını aldık oraya gelelim. Eğer biri senin sunucuna girip te o değeri ele geçirirse ilk bakacağı iş kaç karakterli olacağıdır. 32 karakteri görünce hemen sazan gibi atlayıp md5 sanacaktır. Ve hemen kırmaya uğraşacaktır. Bırakın uğraşsın, sonuca ulaşamaz. İşte bunun için 33 değil, 31 değil de 32 karakterlik bir kısmını aldık. substr() fonksiyonu ile 5 ten başlayıp 37. karaktere kadar olan 32 karakterlik kısmını aldım. Ama siz kafanıza göre canınızın istediği yerden başlayıp 32 karakteri alabilirsin.
Şimdi bunları da anlattıktan sonra gelelim ‘giris’ kısmına. Bu kısımda ise şöyle bir yol izleyeceğim. Eğer kullanıcı adı ve şifre doğru ise; ‘giris’ kolonunun değerini ‘on’ diye kaydedelim. Sonrasında da eğer ‘giris’ kolonundaki değer ‘on’ ise giriş yapılmıştır, sayfa içerikleri gösterilebilir. Hayır ‘on’ değilde boş ise giriş yapılmamıştır; sayfaları gösterme.
Peki niye giriş yapılmayınca ‘giris’ kolonunu ‘off’ değil de boş bıraktık? Şöyle açıklayayım; eğer ben bir hacker olsam, senin veri tabanına sızsam ve “admin” tablosunda ‘giris’ diye bir kolon, o kolonun içindeki değeri de ‘off’ olarak görürsem hemen derim “eğer off kapalı giriş yapılamamış demekse on yapılmış demektir” diye ve hemen onu on diye değiştiririm. Ama boş olarak görürsem ben nereden bileyim senin hangi değeri kullandığını.
Şimdi buraya kadar herhangi bir sıkıntı yoksa geçelim hemen php kısmına.
İlk önce admin paneli klasöründe giris.php diye giriş formunun olduğu bir dosya olsun.
giris.php içeriği;

$islem = $_GET["islem"];
İf ( $islem != "giris" ) {
?>






} else if( $islem == "giris" ) {
$gelen_kadi = $_POST["username"]; // giriş formundan gelen kullanıcı adı
$gelen_sifre = $_POST["password"]; // giriş formundan gelen şifre
$gelen_sifre_filtre = sha1(md5(".$gelen_sifre.")); // giriş formundan gelen şifreyi önce md5 sonra sha1 ile şifreliyoruz
$gelen_sifre_yeni = substr($gelen_sifre_filtre, 5, 37); // elimizdeki 40 karakterlik sha1 şifremizin 5 ile 37. karakter arasındaki 32 karakterlik kısmı alıyoruz
$sorgu = mysql_fetch_object(mysql_query("SELECT * FROM admin WHERE id=1"));
$mevcut_kadi = $sorgu->kullanici_adi; // veri tabanına kayıtlı kullanıcı adı
$mevcut_sifre = $sorgu->sifre; // veri tabanına kayıtlı şifre
if ( $gelen_kadi == $mevcut_kadi and $gelen_sifre_yeni == $mevcut_sifre ) {
$sql = mysql_query("INSERT into admin (giris) VALUE ('on')");
echo "başarıyla giriş yapıldı. Yönlendiriliyorsunuz…" ;
echo "";
} else if( $gelen_kadi != $mevcut_kadi or $gelen_sifre_yeni != $mevcut_sifre ) {
echo "kullanıcı adı veya şifre hatalı. Lütfen tekrar deneyin…" ;
echo "";
}
}
?>


giris.php dosyasının içeriği bu kadar. Peki biz burada ne yaptık? Formdan gelen kullanıcı adı ve şifreyi aldık, şifreyi md5 ve sha1 ile şifreleyip, veri tabanına kayıt ederken hangi 32 karakteri almış isek o 32 karakteri aldık. Kullanıcı adı ve şifreyi veri tabanındakiler ile karşılaştırdık. Eğer doğru ise “admin” tablosundaki ‘giris’ kolonunun değerini ‘on’ diye kaydettik. Eğer kullanıcı adı veya şifre hatalı ise ekrana hata verdirtip, tekrardan forma yönlendirdik. Ve böylece bu dosya ile işimiz bitti. Şimdi gelelim index.php dosyasına.
index.php sayfa içeriği;

$sorgu = mysql_fetch_object(mysql_query("SELECT * FROM admin WHERE id=1"));
$giris_kontrol = $sorgu->giris;
if ( $giris_kontrol == "on" ) {
// buraya admin panelinin içeriği gelecek. Ve eğer veri tabanındaki ‘giris' kolonu ‘on' ise gözükecek.
} else if( $giris_kontrol != "on" ) {
echo "sayfayı görüntüleme yetkiniz yok. Yönlendiriliyorsunuz…"
echo "";
}
?>


Evet index.php ile de işimiz bitti. Peki burada ne yaptık? Burada da dedik ki eğer “admin” tablosundaki ‘giris’ kolonunun değeri ‘on’ ise sayfa içeriğini göster. Değil ise hata ver ve giriş formuna yönlendir.
Son olarak geldik cikis.php dosyasına. Buradaki yapacağımız işlem ise sadece ‘giris’ kolonunun içini temizlemek olacaktır.
cikis.php içeriği;


$sql = mysql_query("INSERT into admin (giris) VALUE (' ')");
echo "başarıyla çıkış yapıldı. Yönlendiriliyorsunuz…" ;
echo "