Neden bahsediyorum ? :-)


Artık neredeyse her sitede olan üyelik, bazı web uygulamaları için vazgeçilmez oldu. Çünkü üyelere ait özelleştirilmiş siteler her zaman daha popülerleşti. Bunu bir gerekli yanı da sistem güvenliği ve hizmet takibi. Mesela yaptığınız projede yapılacak saldırılarda 1-1 KİŞİ tespiti yapabilmenizi sağlayan mekanizma da aslında üye takibidir. Bazı projelerde ise hizmetinizi sınırlamak istediğiniz insanlar olabilir. Üye statü'leri izinleri veya kayıta kapalı (veya davetli) üyelikler ile hizmetinizi hedef kitlene sınırlayabilirsiniz.
Neyse üyeliğin yararlarını geçelim. Buraya öğrenmeye geldik :-)

Neye ihtiyacımız var?

Tabiki bir veritabanına, mysql kullandığımızı varsayarak kod örnekleyeceğim. Ama postgresql fln kullanan arkadaşlar da var ise bu dökümandaki algoritmayı izleyerek kolayca kendileri de kod yazabilirler. Aşağıda veritabanında kullanacağımız üye tablosuna ait veri yapısını import ederek kolayca oluşturabileceğiniz SQL sorgusunu koyuyorum, bu sorgudan hangi alanlar ve özelliklerinin neler olduğunu da kolayca görebilirsiniz.
CREATE TABLE `uyeler` (
  `no` int(10) NOT NULL auto_increment,
  `kadi` varchar(50) NOT NULL default '',
  `sifre` varchar(100) NOT NULL default '',
  `izin` varchar(20) NOT NULL default '',
  `adi` varchar(100) default NULL,
  `eposta` varchar(255) default NULL,
  PRIMARY KEY  (`no`)
) ENGINE=MyISAM AUTO_INCREMENT=1 ;
gördüğünüz gibi basitçe 6 alanım var, burada no, izin, adi ve eposta alanları sistemin düzgün çalışması için şart olan alanlar değiller fakat üyeniz hakkında küçük bir bilgi tutmanızı sağlar. Eğer isterseniz buradaki alan sayınızı artırarak yeni üye detayları ekleyebilirsiniz. Mesela MSN adresi, web sitesi, ev adresi, cep telefonu, kimlik bilgileri mesleği falan fişman.

Şimdilik kayıtlı bir kullanıcının giriş yapmasını vae sayfalarda kullanının giriş yapıp yapmadığını yani oturumunu kontrol etmeyi göstereceğim. Bildiğiniz gibi kayıt işlemi basitçe bir formdan mysql'e veri kaydetme işlemi.. Buna dökümanın sonunda değineceğim.

Giriş işlemi

Giriş işlemini yapcağımız bir form hazırlayın. Kullanıcı adı ve şifre giriş alanları olacak olan 2 input'luk bir form. “kadi” ve “sifre” gibi pratik alan adları belirlerseniz işiniz kolaylaşır. Bu formu giris.php diye bir işlem sayfanıza post methodu ile göndereceğiz. Şuna benzer bir form olacaktır :
<form name="giris" action="giris.php" method="post">

 <table cellpadding="8" cellspacing="0" align="center">
   <tr>
     <td width="100">Kullanıcı Adı</td>
     <td><input type="text" name="kadi"></td>
   </tr>
   <tr>
     <td width="100">Şifre</td>
     <td><input type="password" name="sifre"></td>
   </tr>
   <tr>
     <td colspan="2" align="right">
       <input type="submit" value="Giriş">
     </td>
   </tr>
 </table>

</form>
Giriş işlemi sayfamızın (giris.php) koduna bakacak olursak :
<?php

# mysql baglantisi, sesion_start yapilmis varsayiyoruz

# bilgiler
  $kadi  = $_POST["kadi"];
  $sifre = $_POST["sifre"];

# kullanici bilgisi alalim
  $sorgu = mysql_query("select sifre from uyeler where kadi = '".$kadi."'");
  if( mysql_num_rows($sorgu) != 1 ){
    print '<script>alert("Kullanıcı bulunamadı!");history.back(-1);</script>';
    exit;
  }else{
    # veriyi alıyoruz
      $bilgi = mysql_fetch_assoc($sorgu);
  }

# sifre eslestirmesi
  if( md5( trim($sifre) ) != $bilgi["sifre"] ){
    print '<script>alert("Yanlış şifre girdiniz!");history.back(-1);</script>';
    exit;
  }

# başarılı giriş yapıldı
# oturuma kaydedip anasayfaya gidelim
  $_SESSION["giris"] = md5( "kullanic_oturum_" . md5( $bilgi["sifre"] ) . "_ds785667f5e67w423yjgty" );
  $_SESSION["kadi"]  = $kadi;

?>
<script>
  alert("Başarıyla giriş yaptınız! Şimdi anasayfaya yönlendiriliyorsunuz.");
  window.top.location = './';
</script>
gördüğünüz gibi kontrol kısmında çok karmaşık bir kod yok. MySQL'den kullanıcıya ait veri alıyoruz. Eğer gelen kayıt kümesinin boyutu 1 değilse üye adı yok demektir. Hata veriyoruz. Eğer 1 ise kayıt kümesini $bilgi dizisine alıyoruz. Alt kısımda da girilen şifrenin md5'ini veritabanındaki string ile karşılaştırıyoruz. Çünkü veritabanında şifrelerimizi md5'leyip saklıyoruz. Çünkü birisi veritabanımızı araklarsa md5'i çözemesin diye. Üye bilgilerinin güvenliğini sağlamış oluyoruz.

En altta ise giriş kontrolü için oturuma 2 değişken attım birisi şifre ile oluşturulmuş karışık bir cümlenin md5'li hali. Bunu giriş kontrolünde oturumda olup olmadığını kontrol etmek için kullanacağız. Sadece kullanıcı adı kullanmamamın nedeni ise sunucu yönetimindeki birinin oturumları oynayıp giriş yapmış kullanıcı hakkını değiştirememesi için oldukça basit bir engel o kadar. İsterseniz daha karmaşık kriptografik anahtarlar da oluşturabilirsiniz. Bu sitede sadece anahtar tutulur mesela. Oturum bilgileri veritabanında saklanır.. Bu tarz gelişmiş şeyler için de beyin fırtınası yapıp güzel şeyler yazabilirsiniz.

Şimdi giriş yapıldıktan sonra anasayfa'ya yönlendirildi üye, peki biz sayfalarımızda oturumu gezen misafirin üye olup olmadığını nasıl anlayacağız?

Üye kontrolü, üye oturumu yönetimi

Benim site geliştirme yoluma göre ilk önce sitenin statik sayfasını hazırlayıp parçalardık hatırlarsanız. Ve her işlem/modül dosyamızın başında mysql.php veya ayar.php gibi bir include edilen dosyamız vardır. İşte buna giris_kontrol.php diye bir dosya daha ekleyin. Yani; üye'lere ait bilgileri alacağınız sayfalarda (üye kontrolü, üye alanları fln) giris_kontrol.php diye bir php include ettirin. Her sayfanıza. giris_kontrol.php dosyamızın kodunu verip açıklayayım :
<?php

# uye oturum degiskenleri
  $giris_yapilmis = false;
  $uye = false;

# kontrol ederek bilgileri dogrulayalim
  if( !empty($_SESSION["giris"]) && !empty($_SESSION["kadi"]) ){
  
    # kulanici bilgisini alalim
      $sorgu = mysql_query("select * from uyeler where kadi='".$_SESSION["kadi"]."'");
      if( mysql_num_rows($sorgu) == 1 ){
      
        $uye = mysql_fetch_assoc($sorgu);
        # anahtar kontrol
          if( $_SESSION["giris"]  ==  md5( "kullanic_oturum_" . md5( $uye["sifre"] ) . "_ds785667f5e67w423yjgty" ) ){
            $giris_yapilmis = true;
          }else{
            # giris yanlis. $uye'yi silelim
            $uye = false;
          }
      }
  }

?>
Tabiki bu sayfadan önce mysql ve ayar dosyanızın fln include edildiğini ve session_start yapılmış olduğunu düşünüyoruz çünkü bu sayfayı her sayfanın başında include ediyoruz.

Oturumdaki kadi değişkeni boş değilse veritabanından bilgileri alıyoruz. Eğer kullanıcı yoksa oturum açılmıyor zaten. Eğer şifre ile oluşturulan karışık cümlenin md5'i oturumdaki giris degişkeninin içeriğine eşitse bizim mantıksal koyduğumuz anahtar da doğrudur. Şimdi “giris_yapilmis” değişkenini true yapıyoruz ve $uye dizisine mysql sonuç kümesini atıyoruz. Neden bunu yapıyoruz çünkü, sayfalarımızda doğrudan $giris_yapilmis'i if yapılarımızda giriş yapılmış yapılmamış olduğunu hızlıca alabileceğiz. Mesela üyelere özel bir sayfanız var ise bu sayfanın başında;
if( !$giris_yapilmis ){
  print 'Bu sayfa üyelere özeldir! Lütfen giriş yapın!';
  exit;
}
diyerek giriş yapmamış kullanıcıların o sayfaya erişimini engelleyebilirsiniz.
Eğer üyeye ait bilgilere ihtiyacınız var ise zaten doğrudan $uye dizisinden alabilirsiniz.
Mesela giriş formunun yerine Hoşgeldin X dedirtmek için ile X yerine kullanıcı adını basabilirsiniz.

Kayıt işlemi

Kayıt işleminin mysql'e veri kaydetmek dışında bir kısmı olmadığından örneklemeye gerek duymuyorum. Sadece şifreyi veritabanına md5 fonksiyonundan geçirip kaydediyoruz. Onun dışındaki kontroller ve veri kayıdını yapamayacağınızı düşünmüyorum.


Hazırlayan : Mehmet Fatih YILDIZ
3 Haziran Cuma ´05   —   4 Yorum

Bunlar nedir ne işe yarar?

PHP'de aslında dinamizmi getiren çoğu şeye karşılık kullanıcının hareketlerini izlerken veya kullanıcının hareketlerine karşı kodumuzun vermesini istediğimiz tepkileri belirlerken kullanıcı taraflı bilgi saklamaya ihtiyaç duyuyoruz. Sonuçta bütün olay sunucuda veya kullanıcıda bitmiyor. İkisinin iyi senkronu ile iyi koda dayanıyor.

Cookie de session da aynı yapıdadır. Basit olarak olay session'u cookie'ye benzeterek anlatmakla daha rahat anlaşılacaktır.
Cookie'ler kullanıcının bilgisayarında bir meta ve değer olarak tutulan, domainlere göre süzgeçlenen dosyalardır. Yani;
1. Dosya adı vardır ve bellidir.
2. İçeriği o dosyaya ait bilgiyi içerir.
(Normal veriden farklı yani)
3. bu dosyaların ve buna ait bilgilerin silineceği tarih bellidir. Son kullanma tarihi gibi.

Cookie dosyaları zamanı geldiğinde silinen değişkene benzer veri taşıma methodudur. Kullanıcı tarafında taşındığı için günevli olmayıp, kodlarda içeriği zararlı veriler taşınmamalıdır. Mesela bir üye sisteminde cookie içinde kullanıcının şifresi taşınmaz. Ancak oturum id'si kullanıcı id'si gibi bilgiler taşınmalıdır.

Session ise cookie'ler gibi çalışır, ancak bu bilgilerin silineceği zaman kullanıcının oturumu sonlandırdığı andır. Yani bu verilerin yönetimini zamanla sağlamayız. Oturum dedğimiz şey ise tarayıcı programa göre değişir. Bazı programlar bulunduğu pencereye ait oturumu taban alır. bu tarayıcılarda bir oturuma ait sitedeki pencerelerin hepsi kapanınca oturum kapanmış olur. Bazı tarayıcılarda ise tarayıcı program ve onunla ilişkili process kalamyana kadar ortak bir oturum çerçevesinde gider.

Peki bunları nerelerde kullanırız?

Cookie'ler belirli bir tarihe göre silinirler.. Uzun vadeli kullanıcı taraflı veri saklarken cookie'ler biçilmiş kaftandır. Ancak kısa vadeli (3-5 dakikalık veriler için, mesela oturum yönetimi için) pek güvenilir olamayabilir. Bunun için session (adı üstünde zaten "oturum") kullanılır. Bir üye sistemi için cookie kullanılırsa, örneğin internet cafe'deki acil çıkışlarda masaya oturan diğer kişi bulduğu tarayıcı pencerelerini kurcalarken yanlış şeyler yapabilir..
Anket veya ziyaret kontrollerinde cookie'ler gayet güzel çalışabilirler.
Şu an dökümanlar bölümünde listelere dikkat ettiyseniz, listelerdeki dökümanların başındaki turuncu oklar renk değişimi gösterecektir. Okuduğunuz dökümanlar cookieler sayesinde orada daha flu bir renge dönüşecek ve okumadığınız, yeni dökümanları daha rahat seçebileceksiniz. Bu cookie sayesinde oluyor. Ama kullanıcı girişi çıkışı session + cookie karışımı ile.
Beni hatırla seçeneği ile bilgisayarınız bir kod yazılıyor. bu kod veritabanındaki hatırlama kodunuzla karşılaştırılıp eşlenmesi halinde otomatik giriş sağlanıyor. Tabiki bu kod yeterince güvenli. Çözebilen var ise artık girip istediğini yapsın. Zaten kodu kırmakla haketmiş :-)

Bu alanda yapılan yanlışlar ve güvenlik sorunları!!

- Çoğu php'ye yeni başlayan cookie'leri önce öğrenip, ilk giriştikleri üye sisteminde cookie ile yazıyor. Burası yanlışın başlangıcı.
- Yine çoğu yeni başlayan php programcıları üye sistemlerinde cookie veya session değişkenlerinin içine tek kontrol ile kullanıcı adı veya kullanıcı adı + şifre saklıyor.. Yanlışın 1 numaralısıdır bu..
Exploitler ile bu açıklar kolaylıkla aşılabilir.

"Hangisi" değil "Nasıl"?

Ne kullandığınız değil, nasıl kullandığınız önemlidir. Belki üye sistemi session yerine cookie ile daha sağlıklıdır. Nerede kullandığınız da çok önemli bir unsurdur. Mesela bir banka sitesini yapıyorsanız Session kontrollü cookie tabanlı bir yapı çok daha sağlam olur. vs vs..


Hazırlayan : Mehmet Fatih YILDIZ
PHP'de Oturum (Session) Yönetimi

PHP'nin olmazsa olmazı nerdeyse her php ile kodlanan sayfada bulunan oturum (session) yönetimi hakkında sizlere bilgi vereceğim. PHP'de 5 tane oturum yönetimi fonksiyonu vardır. Bu oturum yönetim fonksiyonları ve dökümantasyon bağlantıları :
session_start()
session_register()
session_is_registered()
session_unregister()
session_destroy()

Şimdi bunların anlatımına geçelim :

session_start()

Bu fonksiyonu oturumları kullanıcağımız her sayfanın başında belirtmeliyiz. Bu fonksiyon kullanıcı ilk defa giriyorsa kullanıcı için serverda bir dosya yaratır ve kullanıma hazırlar. Eğer daha önce girmişse onu kullanmaya hazırlar sadece. Her kullanıcı için uzun bir kod üretir. Bu kod sayılardan ve harflerden oluşur.
session_start();
Eğer php.ini dosyasında otomatik olarak oturum başlatma seçeneği aktif değilse bu işlemi yapmak zorundayız. Oturum fonksiyonları eğer bir oturum açılmamışsa (session_start) hata verecektir. Her sayfanızın başında bu fonksiyonu çağırarak bu sorunu rahatlikla çözebilirsiniz. Öneri olarak, her sayfanızda çalıştırdığınız (include) sayfanız varsa bu sayfaya ekleyin.

session_register()

Sunucuda sizin için açılmış olan dosyaya bir değer yazar. Aynı cookie gibi işler ancak dosyalar zamana göre silinmez, kullanıcı oturumunu kapatınca silinirler. Kullanıcının oturum kapatması ise, o andaki tarayıcı programının oturumu kapatması ile olur. Çoğu tarayıcı, oturumunu tüm pencereleri kapandığı zaman kapatmış olur.
$isim = "nazim";
session_register("isim");
$isim değerini nazim olarak atayıp sonra da oturumumuza kaydettik.

Oturum değişkenleri ve değerleri cookie'ler gibi bir dizide tutulur. $_SESSION ($HTTP_SESSION_VARS) dizisidir. Bu dizinin normal bir diziden hiçbir farkı yoktur. Atamaları da buna benzer bir teknik ile yapabiliriz.
session_register("isim");
$_SESSION["isim"] = "mfyz";
Önce $isim diye bir oturum bilgisi yaratıp sonra bilgiyi güncelledik.

session_is_registered()

Bir oturumun kayıtlı olup olmadığını veya bir oturum değişkeninin kaydedilip edilmediğini öğrenmemize yaran bir fonksiyondur.
if( session_is_registered("isim") ){
  echo "isim oturumu kayıtlı";
}else{
  echo "isim oturumu kayıtlı degil";
}
"isim" oturumunun kayıtlı olup olmadığına bakar.

session_unregister()

Kaydettiğiniz bir oturum değişkenini silmek için kullanılır.
session_unregister("isim");
Daha önce oluşturduğumuz isim adlı oturum bilgisini siler.

session_destroy()

Kayıtlı olan tüm oturum bilgilerini yok eder.
session_destroy();
Geçerli olan tüm oturum verilerini yok eder.


Şimdi ufak bir uygulama yapalım :

Giriş/Çıkış İşlemi

Günümüzde neredeyse her sitede bi üyelik sistemi var (forumu veya interaktif hizmeti olmamasina rağmen), bence çoğu site için gereksiz.
Basitçe bir giriş/çıkış sistemi yapalım. Bu iş için giris.php, cikis.php, index.php dosyalarimiz olacak.
<form action="giris.php" method="post">
  <input type="text" name="ad">
  <input type="submit" value="Giris">
</form>
Basit bir index sayfamız var. Burada giriş formu var. Bunu sitenizin istediğiniz köşesine koyabilirsiniz.
Ziyaretçi adını girip Giris'e tıkladığı zaman giris.php dosyasına post edilecek.
<?php

// bilgiyi alalim
$ad = $_POST["ad"];

// oturum baslatalim
session_start();

// giris kontorl degiskeni tanimlayalim
$giris = true;

// ve degiskenleri kaydedelim
session_register('ad');
session_register('giris');

// giris tamamlandi, anasayfaya gonderelim
header("location:index.php");

?>
Şimdi ansayfamizi gelistirmemiz gerek. Giriş yapmış ziyaretçilere hitap eden kısımları küçük bir sargı ile çevreleyeceğiz.
<?

// oturumu baslatalim
sesion_start();

// giris bilgilerini alalim.
$giris = $_SESSION["giris"];
$ad    = $_SESSION["ad"];

// giris kontorlu yapalim
// giris yapilmis ise $giris true olmali
if( $giris ){
  // giris yapilmis hosgeldin..
  print 'Hoşgeldin ' . $ad . '<br>
  <a href="cikis.php">Çıkış</a>';
}else{
  // giris yapilmamis giris formu yazdiralim
  print '<form action="giris.php" method="post">
    <input type="text" name="ad">
    <input type="submit" value="Giris">
  </form>';
}

?>
İşte oldu, anasayfamız giriş kontorlu yaparak kullanıcı daha önce giriş yapmışsa tanıyor.

Çıkış dosyamız ise çok basit. oturumu öldürecek.
<?

// oturumu baslatalim
session_start();

// oturumu oldurelim
session_destroy();

// ansayfaya gidelim
header("location:index.php");

?>
Hepsi bu kadar :-)

Hazırlayan : Nazım Akmandil

Popüler Etiketler

php apache kurulum phpstorm jetbrains mysql pgsql sql mssql ide editor www subdomain redirect crossdomain mobile startups iOS webkit web app app music google windows linux fstab ntfs jquery javascript textarea firefox search api ajax form button sitemap seo ui ux login css3 html meta query injection coding spam twitter widget mfyz internet tebrik ie browser db database service free export tool macosx url blog pear mdb2 prepare execute örnek kod ubuntu session cookie wanda digital medya optimization social share ios iphone ipad apple app store store in-app purchase purchase subscription verification storekit itunes connect itunes media sosyal applications kontrol yapıları if switch code mootools ipucu cms pharma hack wordpress gimp rss lifestream parse xml deployment version control svn git css less framework icon ikon grafik download banner calendar logo design link plugin howto nasıl optimizasyon mail signature imza facebook connect box subversion workspace kitap development opengraph fql wireless istatistik statistics graph laptop notebook table xmlhttprequest radio xhtml js html5 browsers screen lisans license support date diff newsletter assets http server cache htaccess object auth bootstrap job input select chart regex proje oyun while compile compiler on-the-fly language osx nedir internet explorer portfolio doritos tytz route router mod_rewrite open source kampanya analyse procedure insanlar konsol terminal integration network player developer ruffles style dokuman generator tarih icons zaman