PHP ile SESSION Kullanımı-2

PHP'de SESSION Kullanımı-2

Daha önce session kullanımını anlatmıştık, aşağıdaki makaleyi okuyup, daha sonra bu makalemi okumanızı tavisye ederim.

PHP'de Session Kullanımı-1

Şimdi bir örnek ile daha önce anlattığımız konuyu daha da pekiştirelim. Siz de farklı uygulamalar geliştirerek deneyiminizi artırabilirsiniz.

1) Önce PHPMyAdmin üzerinde dernekdb isimli bir veritabanı oluşturalım ve içinde aşağıdaki tabloyu oluşturalım. Burada uyeID Otomatik Artan(Auto Increment) ve Birincil Anahtar(Primary Key)'dir.



Aşağıdaki gibi bir kullanıcı giriş ekranı tasarlayalım ve kodları index.php olarak kaydedelim.



<html>
 
<head>
<meta charset="utf-8">
</head>
 
<body>
<form action="index2.php" method="POST"> 
<table border="1" cellpadding="4" cellspacing="2" align="center">
<tr>
<td colspan="2" align="center">Kullanıcı Girişi</td>
 
</tr>
<tr>
<td>Kullanıcı adı</td>
<td><input type="text" name="kullanici"></td>
</tr>
<tr>
<td>Şifre</td>
<td><input type="password" name="sifre"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="giris"></td>
</tr>
</table>
</form>
</body>
</html>


Şimdi index2.php dosyasını haırlayalım. Bu sayfada yukarıdaki formu doldurup GİRİS tuşuna bastıktan sonra atlayacaktır. Yukarıdaki Html kod satırlarında form nesnesinin action olayında, form submit edilince index2.php dosyasına gideceğini belirttik. 

Aşağıdaki satırlarda formdan gelen bilgiler $_POST aracılığı ile alınıyor. Örneğin ismi "kullanici" olan metin kutusuna(text) girilen değer $_POST['kullanici'] ile alınıp bir değişkene atanıyor.  SQL Sızıntısı gibi saldırılarak karşı mysql_real_escape_string() fonksiyonundan geçiriyoruz. Böylece bir aşama güvenlik sağlamış oluyoruz.

$kullaniciadi = mysql_real_escape_string($baglanti, $_POST['kullanici']); 

Bu makalemizde, sağladığımız bir güvenlik önlemi de şifreyi veritabanına direkt yazmamak. Veritabanına şifreyi direkt yazma yerine HASH(mesaj özütü) algoritmasından geçirerek yazıyoruz, mesaj özütü algoritmaları tek yönlüdür, Güvenlik kategorisindeki makalelerden mesaj özütü algoritmaları hakkında detaylı bilgi bulabilirsiniz. 

sifreleme.php isminde bir dosya olusturarak,  gönderdiğimiz bilgiyi, mesaj özütü algoritmasından geçiren bir fonksiyon yazdık. Bu fonksiyonda kullanıcı zayıf şifre girse bile sonuna eklemeler yaparak 40 karaktere çıkarıyoruz. 

Daha sonra yaptığımız işlem ise mysqli_connect tekniği ile veritabanına bağlanmak. Eski mysql_connect yöntemine göre daha güvenli bir yöntemdir. 

Veritabanına bağlandıktan sonra SELECT sorgusu ile bu kullanıcı adı ve şifreye uyan bir kayıt olup olmadığına bakıyoruz, eğer uyan kullanıcı adı ve şifre varsa oturum(session) nesnelerine ilgili bilgileri atıyoruz.

Session nesnesi oluşturmak için daha önce de belirttiğimiz gibi, php sayfasının başına session_start(); yazıyoruz. $_SESSION['kullanıcı']= $degisken şeklinde de atama yapıyoruz, sonraki php sayfalarında artık bu session değişkenlerine rahatça erişebiliyoruz. 

INDEX2.PHP sayfası
<html>
<head>
<meta charset="utf-8">
</head>
<body>
 
<?php
include_once("sifreleme.php");
error_reporting(0);
session_start();
 
$baglanti=mysqli_connect("localhost","root","","dernekdb");
// Bağlantı kontrolü
if (mysqli_connect_errno()) {
  echo "Bağlantı kurulamadı: " . mysqli_connect_error();
}
 
$kullaniciadi= mysqli_real_escape_string($baglanti,$_POST['kullanici']);
$sifre= mysqli_real_escape_string($baglanti,$_POST['sifre']);
 
$SHAsifre= sifrele($sifre);
$sql="select * from tbluyeler WHERE KULLANICI='".$kullaniciadi."' AND SIFRE='".$SHAsifre."'";
//echo $sql;
$sonuc= mysqli_query($baglanti,$sql);
if (mysqli_num_rows($sonuc)>0)
{
$satir= mysqli_fetch_array($sonuc);
echo "<center>Sayın ".$satir['ADI']." ".$satir['SOYADI']." Hoş Geldiniz</center>";
$_SESSION['user']=$kullaniciadi;
$_SESSION['name']=$satir['ADI'];
$_SESSION['surname']=$satir['SOYADI'];
echo '<script>window.location.href ="index3.php";</script>';
 
} else {
echo "<center>Herhangi bir kayıt bulunamadı.</center>";
}
 
?>
</body>
</html>

INDEX3.PHP sayfasını ise session nesnelerine diğer sayfalarda nasıl erişildiğini görmek amacıyla oluşturduk. $_SESSION['user'] bizim kullanıcı adını sakladığımız oturum nesnesi.  Aşağıdaki if satırı ile eğer session nesnesi içeriği boşalmışsa, oturum süresi geçmiştir ve biz kullanıcıyı cikis.php sayfasına yönlendirerek tekrar kullanıcı adı, şifre girmesini isteyeceğiz. 

if ($_SESSION['user']=="")
  echo '<script>window.location.href ="cikis.php";</script>';

cikis.php dosyasının içeriği de aşağıda verilmiştir, mavi renkleri kodları kopyalayıp, php dosyası şeklinde kaydederek çalıştırabiliriz. 

INDEX3.PHP Sayfası
<?php 
session_start();
error_reporting(0);
?>
<html>
 
<head>
<meta charset="utf-8"> 
</head>
<body>
 
<?php
if ($_SESSION['user']==""){
echo '<script>window.location.href ="cikis.php";</script>';
}else{
echo "Bu üçüncü sayfa session(oturum) aktif<br>";
echo "Kullanıcı adınız :".$_SESSION['user']."<br>";
echo $_SESSION['name']." ".$_SESSION['surname'] ;
echo "<br><a href=cikis.php>Oturumdan Çıkış</a>";
}
?>
 
</body>
</html>

Aşağıdaki cikis.php dosyasında oturumu sonlandırıyoruz, session_destroy() fonksiyonu oturumun sonlandırılmasını sağlıyor. Bu fonksiyonu kullanmak için yine php dosyasının başında session_start(); ifadesinin kullanıldığına dikkat ediniz.

CIKIS.PHP
<?php
session_start();
?>
<html>
 
<head>
<meta charset="utf-8"> 
</head>
<body>
<?php
$_SESSION = array();
session_destroy();
echo "Oturum sonlandırıldı.<br>";
echo "<a href=index.php>Tekrar giriş yapmak için tıklayınız.</a>"
?>
</body>
</html>


ÜYE KAYIT BÖLÜMÜ

Üye kayıt için aşağıdaki formu oluşturduk, formun HTML kodlarını şeklin hemen altında bulabilirsiniz. uyekayit.php dosyası olarak html kodlarını kaydediyoruz. Bu form doldurulup, "Üye Kaydet" butonuna basılınca form nesnesinin action olayında  belirtildiği uyekaydet2.php sayfasına yönlendiriliyor. 



 
UYEKAYIT.PHP
<html>
 
<head>
<meta charset="utf-8">
</head>
 
<body>
<form action="uyekayit2.php" method="POST"> 
<table align="center" border="1" cellpadding="4" cellspacing="2">
<tr>
<td colspan="2" align="center">Kullanıcı Girişi</td>
 
</tr>
<tr>
<td>Adı</td>
<td><input type="text" name="adi"></td>
</tr>
<tr>
<td>Soyadı</td>
<td><input type="text" name="soyadi"></td>
</tr>
<tr>
<td>E-posta</td>
<td><input type="text" name="eposta"></td>
</tr>
<tr>
<td>Kullanıcı Adı</td>
<td><input type="text" name="kullanici"></td>
</tr>
<tr>
<td>Şifre:</td>
<td><input type="password" name="sifre"></td>
</tr>
<tr>
<td>Şifre(Tekrar):</td>
<td><input type="password" name="tekrarsifre"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Üye Kaydet"></td>
</tr>
</table>
</form>
</body>
</html>

Evet yukarıdaki formun action olayında yönlendirdiğimiz uyekayit2.php dosyasının içeriği de aşağıda görülmektedir. Veritabanına mysqli yöntemiyla bağlanıp, INSERT sql komutu ile forma girilen bilgileri veritabanına yazdırıyoruz. 

Adı ve Soyadı alanlarının boş geçilmemesine, şifrenin 6 karakterden az olmamasına, Şifre ve Tekrar Şifre bilgilerinin aynı olmasına dikkat ediyoruz.

Girilen şifreyi veritabanına kaydetmeden önce sifreleme fonksiyonunda geçiriyoruz. 

UYEKAYIT2.PHP
<html>
<head>
<meta charset="utf-8">
</head>
<body>

<?php
include_once("sifreleme.php");
error_reporting(0);
 
$baglanti=mysqli_connect("localhost","root","","dernekdb");

// Bağlantı kontrolü
if (mysqli_connect_errno()) {
  echo "Bağlantı kurulamadı: " . mysqli_connect_error();
}
 
 
$adi=   mysqli_real_escape_string($baglanti, $_POST['adi']);
$soyadi= mysqli_real_escape_string($baglanti,$_POST['soyadi']);
$eposta= mysqli_real_escape_string($baglanti,$_POST['eposta']);
$kullaniciadi= mysqli_real_escape_string($baglanti,$_POST['kullanici']);
 
$yenieposta= filter_var($eposta, FILTER_SANITIZE_EMAIL);
//echo $yenieposta;
 
$sifre= mysqli_real_escape_string($baglanti,$_POST['sifre']);
$tekrarsifre= mysqli_real_escape_string($baglanti,$_POST['tekrarsifre']);
 
$mesaj="";
if ($adi=="" || $soyadi=="")
$mesaj= "Adı ve Soyadı alanlarını doldurunuz.<br>";
 
if ($sifre!=$tekrarsifre)
$mesaj.= "Şifreler aynı olmalı.<br>";
 
if (strlen($sifre)<6)
$mesaj.="Şifre en az 6 karakter olmalı<br>";
 
if ($mesaj!=""){
//hata yazdırıyoruz
echo $mesaj;
}
else{
//Buraya kaydetme kodlarımız gelecek;
$SHAsifre = sifrele($sifre);
$sql="INSERT INTO tbluyeler(ADI, SOYADI, EPOSTA, KULLANICI, SIFRE)
VALUES ('$adi', '$soyadi', '$yenieposta','$kullaniciadi','$SHAsifre')";
if (!mysqli_query($baglanti,$sql)) {
die('Hata: ' . mysqli_error($con));
}
echo "Kayıt başarıyla eklendi";
}
 
 
?>
</body>
</html>

Gelelim baştan beri kullandığımız şifreleme dosyasına. Bu dosyada, function sifrele() fonksiyonuyla başlayan kodlarda da görülebileceği gibi ilk önce girilen şifrenin uzunluğuna bakıyoruz. 40 karakterden küçükse, 40 karaktere tamamlayıp SHA1 mesaj özütü fonksiyonundan geçiriyoruz. SHA1 algoritması tek yönlü (160 bit=40 karakter) bir şifreleme algoritmasıdır.  

SIFRELEME.PHP
<?php
/*HASH Algoritmaları MD5 128 bit kullanmayınız.
SHA 160 bit (40 karakter) güvenlidir.
$sifre= "1234";
$tuz="2012201312201220131220122013122012201312";
echo $sifre."<br>";
$uzunluk = strlen($sifre);
echo "uzunluk :".$uzunluk."<br>";
$eklenecek=40-$uzunluk;
$tuz = substr($tuz,0,$eklenecek);
echo "Tuz(salt) :".$tuz."<br>";
echo strlen($tuz)."<br>";
$yenisifre = $sifre.$tuz;
echo "Yeni Şifre :".$yenisifre."<br>";
 
echo "SHA Hali :".sha1($yenisifre)."<br>";
echo "MD5 Hali :".md5($yenisifre)."<br>";
*/
function sifrele($sifre){
 
$eklenecek=0;
$tuz="2012201312201220131220122013122012201312";
$uzunluk = strlen($sifre);

if($uzunluk<40){
    $eklenecek=40-$uzunluk;
} else {
   $sifre= substr($sifre,0,40);
}

$tuz = substr($tuz,0,$eklenecek);
$yenisifre = sha1($sifre.$tuz);
return $yenisifre;

}
/*echo "======================<br>";
echo sifrele("1235")."<br>";
echo sifrele("1235")."<br>";
*/
 
?>

İyi çalışmalar dilerim,
Oğuzhan TAŞ
Şubat, 2015
 

Bookmark and Share