Üye Girişi Kontrol Mantığı Nasıl Olmalıdır.

PHP ve MySQL ile ilgili yardım taleplerinizi paylaşabilirsiniz.
Cevapla
Kullanıcı avatarı
Gökhan
Deneyimli Üye
Deneyimli Üye
Mesajlar: 390
Kayıt: 11 Şub 2009, 22:57

Üye Girişi Kontrol Mantığı Nasıl Olmalıdır.

Mesaj gönderen Gökhan » 07 Şub 2012, 22:14

Üyelik içeren bir sistem oluşturduğumuzda, üyelerin gerekli bilgilerini veritabanında users, members, uyeler ya da benzeri bir isimli tabloda tutarız.

Üyeleri birbirlerinden mutlak olarak ayırabilmek için en az bir adet benzersiz alan bulundurmalıyız. Genellikle username, uyeadi, un benzeri alanları tekil(benzersiz, unique) olarak ayarlarız. Ya da doğrudan email adresini bu iş için düşünürüz, bu durumda da ilgili alanımız email, eposta ve benzeri bir isimli alan olur.

Her durumda hangi alanı kullanacaksak kullanalım, bu alan tekil olmalı, yani farklı iki veya daha fazla kayıtta, bu alana eş değerler girmeyecek şekilde, veritabanı indeximizi ve alan özelliklerini ayarlamalıyız.

Üye kaydı sırasında, öncelikle, veritabanımızdan üyenin bu alan için girdiği değeri kontrol ederek, eğer eş bir kayıt varsa uyarı olarak geri dönmeli ve başka bir değer seçmesini istemeliyiz.

Örnek olarak, kullanıcı adı istediğimizde, ve sistemimizde daha önce phpindir isimli bir kayıt var ise, ve yeni bir kullanıcı da bunu istiyorsa, bu kayda izin vermemeliyiz, aksi halde, bu kullanıcıları hiç bir şekilde birbirinden ayıramayız.

Diğer alanlar, serbest olarak aynı olabilir, örneğin isim alanı, şifre alanı vb.

Geleneksel olarak, kullanıcının girdiği şifre değerini de, pwd, sifre, password, pass benzeri alanlarda ama md5() fonksiyonu ile şifreleyerek tutarız. Yani kullanıcı benim şifrem 123456 olsun dediğinde, biz bunu veritabanına 123456 olarak kaydetmemeliyiz.

Aşağıdaki benzeri şekilde;

Kod: Tümünü seç

//...
$pwd = md5($_POST["pwd"]);
//...
kullanıcının girdiği şifreyi md5() ile değiştirmeliyiz (veritabanında şifre alanı için 32 haneli varchar alan oluşturun, md5() 32 haneli bir çıktı verir)


Kayıttan sonra, üye, giriş yapmak için sitemize gelip, giriş formu ile bize, kullanıcı adı ve şifre bilgilerini gönderdiğinde, veritabanımızın uyeler tablosunda, uyeadını sakladığımız alan değeri, üyenin kullanıcı adı olarak post ettiği ve şifre sakladığımız alanı, üyenin şifre olarak post ettiği değeri içeren kayıtların sayısını isteyen bir sorgu oluşturalım. (Üyenin giriş formundan gönderdiği şifre değerini, veritabanındaki saklı değer ile karşılaştırmadan önce md5() den geçirmeyi unutmayalım, aksi halde kullanıcı şifresini doğru girdiği halde veritabanındaki kayıt ile asla eşleşmeyecektir.)

Eğer, kullanıcı adını, tekil kaydetmeyi sağlamışsak, giriş yapan kişi, kullanıcı adı ve şifre ikilisini doğru vermediği sürece 0, doğru verdiği sürece de 1 kayıt dönecektir. Üçüncü bir olasılık yoktur.

Eğer sorgu sonrası dönen kayıt sayısı 1 ise, üye giriş işlemlerini başlatırız (cookie ya da session olarak (session ileriki php sürümlerinde kaldırılıyor))

Örnek;
> uyeler tablosunda, un varchar(10) ve pwd varchar(32) allanlarında kullanıcı adı ve şifre saklayalım.
> giriş formumzda kullanıcı adını un isimli bir textBox'dan, şifreyi ise pwd isimli bir textBox'dan isteyelim.

Giriş sorgusu anındaki kod bölümümüz, şuna benzer olacaktır;

Kod: Tümünü seç

//...
if (!get_magic_quotes_gpc())
$un = addslashes($_POST["un"]);
else
$un = $_POST["un"];
$pwd = md5($_POST["pwd"]);

$sorgu = "select un, pwd from uyeler where un = '" . $un . "' and pwd = '" . $pwd . "'";
$sonuc = mysql_query($sorgu);
$adet = mysql_num_rows($sonuc);
//...
Yukarıdaki örnek kod bölümünde eğer $adet değeri 1 ise, üye girişi başarılı ve gerekli işlemler yapılır, yoksa, üye girişi başarısız hatası verilerek, forma geri dönülür.

$un değerini, addslashes() fonksiyonundan geçirmemizdeki amaç ise gönderilmesi muhtemel ' simgesinden kurtulmaktır. Tek tırnak ile sql injection'a maruz kalabiliriz, bunun için tırnakları yoksaymalıyız.

Aslında php'deki magic_quuotes özelliği bizi bu olasılıktan korusa da, ileriki sürümlerde, magic_quotes da php'den kaldırılıyor. Sunucu php.ini ayarlarında magic_quotes kapalı ise addslashes() ekleyecek şekilde kodumuzu yazarak kendi önlemimizi almalıyız.

Not : Veritabanımızda çalıştıracağımız, ve içerisinde kullanıcının girebileceği data içeren her türlü sorguda (') tek tırnaklara dikkat etmeliyiz...

Cevapla

Kimler çevrimiçi

Bu forumu görüntüleyen kullanıcılar: Hiç bir kayıtlı kullanıcı yok ve 1 misafir