Basit Bir Oturum Açma Sistemi

CİDDEN ÖNEMLİ NOT: Bu kod parçası güncel haliyle GÜVENLİK AÇIĞI İÇERMEKTEDİR. DEĞİŞİKLİK YAPMADAN KULLANMAYINIZ! Aksi halde sorumluluğun S’sini almayacağımı bizzat belirtirim.

Birkaç gün önce hem PHP Session’ların ne olduğunu ve nasıl kullanıldığını öğrenmek, hem yakuter’in anlattığı ezSQL sınıflarının nasıl kullanıldığını öğrenmek, hem de belki ileride bir projede kullanırım kalsın bir köşede dediğim için gerçekten çok basit bir oturum açma sistemi yazdım.

Sistem, girilen kullanıcı adı ve şifreyi veritabanında arıyor, eğer doğruysa oturum açıyor. Oturumun açık olup olmadığı proje esnasında is_logged() isimli fonksiyon ile kolaylıkla kontrol edilebiliyor.

Projede oturum açılıp açılmadığı kullanıcının tarayıcısına yazılan bir çerez (cookie) yerine, sunucu bazlı sessionlar tarafından belirleniyor. Bu da cookie desteklemeyen tarayıcılarda bile sorun yaratmamasını sağlayacaktır.

Proje Dosyaları

index.php Başlangıç işlerini yapar. Kullanıcı hangi sayfayı istiyor olursa olsun bu sayfadan geçmek zorundadır.

 <?php

/* Projenin diğer dosyaları doğrudan çağrılınca çalışmamaları için */ /* Other php's of project shouldn't call directly. */ define('DUYURU',1);

/* Session */ session_start(); header('Content-Type: text/html; charset=utf-8');

/* Veritabanı ve Fonksiyonlar*/ /* Database and Functions */ require_once("./db/settings.php"); /* Genel ve veritabanı ayarlarını tutar. General and database connection settings. */ require_once("functions.php"); /* Projenin gerekli fonksiyonlarını içerir. Functions needed by this project. */

/* Post-Get İşleyici: Eğer sayfaya get ya da post verileriyle gelinirse gerekli fonksiyonlara yönlendirme yapılır. */ /* Post-Get Processor: If user sent data includes POST or GET data, then user redirects to proper function. */ if (isset($_GET['action'])) { switch ($_GET['action']) { case 'logout': logout(); break; case 'login': login(); break; } } /* Post-Get İşleyici Bitti*/ /* End of Post-Get Processor */

/* Çıktı Başlangıcı */ /* Projenin bu adımından sonra istediğiniz çıktıyı alabilrisiniz. Oturum açılıp açılmadığını projinizin herhangi bir noktasında is_logged() fonksiyonu ile yapabilirsiniz. is_logged: Eğer oturum açıldıysa 1, oturum açılmadıysa 0 döndürür. Örnek kod aşağıdadır. */

/* Start of Output */ /* At this stage of project. You can output whatevet you want. If you want to check if user logged in or not, just use is_logged() function. is_logged: If user logged returns 1, else returns 0\. Sample code is bellow. */

if (!is_logged()) { ?> <form name="loginform" id="loginform" action="index.php?action=login" method="post"> <p> <label>Kullanıcı adı<br /> <input type="text" name="user" id="user" class="input" value="" size="20" tabindex="10" /></label> </p> <p> <labelifre<br /> <input type="password" name="pass" id="pass" class="input" value="" size="20" tabindex="20" /></label> </p> <input name="key" type="hidden" value="<?php echo(md5(session_id())); ?>"/> <p class="submit"> <input type="submit" id="wp-submit" value="Giriş" tabindex="100" /> </p> </form> <?php } else { ?> Tebrikler oturum açtın. Şimdi <a href="index.php?action=logout">kapat</a>. :) <?php } ?>

functions.php Proje tarafından gerekli fonksiyonları içerir.

 <?php

if (!defined('DUYURU')) { /* You can't reach this page directly. */ /* Bu sayfaya doğrudan erişilemez. */ die('Yok artık Lebron James!'); }

function is_logged() { /* Return values: 1 = LOGGED; 0 = GUEST */ if (isset($_SESSION['logged'])) { return $_SESSION['logged']; } else { return 0; } }

function login() { /* Zaten açık oturumu bir daha açamayız. */ /* Can't login, if person already logged in. */ if (!$_SESSION['logged'] == 1) { /* Input values; $_POST['user'] = user_name $_POST['pass'] = password $_POST['key'] = session in md5 */ /* Return values: 1: Login OK, $_SESSION['logged'] = 1; -1: Login Failed. */ global $db, $prefix, $mesaj; if (!(isset($_POST['user']) && isset($_POST['pass']) && isset($_POST['key']))) { $mesaj = 'invalid_data'; return -1; } $session = htmlspecialchars($_POST['key']); $user = htmlspecialchars($_POST['user']); $pass = htmlspecialchars($_POST['pass']); if (htmlspecialchars(md5(session_id())) != $session) { $mesaj = 'session_invalid'; return -1; } if ($user == NULL || $user == "" || $pass == NULL || $pass == "") { $mesaj = 'invalid_data'; return -1; } $sonuc = $db->get_row('SELECT pass FROM '.$prefix.'user WHERE name = "'.$user.'"'); if (md5($pass) == $sonuc->pass && $_SESSION['logged'] != 1) { $sonuc = $db->get_row('SELECT ID, name, real_name, login_count FROM '.$prefix.'user WHERE name = "'.$user.'"'); $_SESSION['name'] = $sonuc->name; $_SESSION['real_name'] = $sonuc->real_name; $_SESSION['ID'] = $sonuc->ID; $db->query('UPDATE '.$prefix.'user SET login_count = "'.++$sonuc->login_count.'" WHERE ID = "'.$_SESSION['ID'].'"'); $db->query('UPDATE '.$prefix.'user SET last_login = NOW() WHERE ID = "'.$_SESSION['ID'].'"');

$_SESSION['logged'] = 1; header('Location: index.php'); return 1; }

$mesaj = 'invalid_data'; return -1; } }

function logout() { /* Açık olmayan oturumun nesini sonlandıracağım! */ /* Can't logoff, if person is not login. */ if ($_SESSION['logged'] == 1) { global $mesaj; $_SESSION['logged'] = 0; $mesaj = 'logged_out'; } } ?>

db/settings.php Veritabanı bağlantı ayarlarını içerir. ezSQL ile bağlantı kurar.

 <?php

if (!defined('DUYURU')) { /* You can't reach this page directly. */ /* Bu sayfaya doğrudan erişilemez. */ die('Yasak. :)'); }

/* ez_SQL sınıfları çağırılır. */ /* ez_SQL classes */ include ("./db/core.php"); include ("./db/mysql.php");

/* Sunucu Ayarları */ $db_server = 'localhost'; $db_name = 'veritabanı_adı'; $db_user = 'veritabanı_kullanıcısı'; $db_passwd = 'veritabanı_şiresi'; $prefix = "log_"; /* Veritaanı öneki. */ $version = 0.1; /* Proje sürümü - Project version */

$db = new ezSQL_mysql($db_user,$db_passwd,$db_name,$db_server);

/* GEREKLİ VERİTABANI TABLOSU YAPISI - REQUIRED DATABASE TABLE STRUCTURE */

/* CREATE TABLE IF NOT EXISTS `log_user` ( `ID` int(11) NOT NULL auto_increment, `name` text NOT NULL, `pass` text NOT NULL, `real_name` text NOT NULL, `last_login` datetime NOT NULL default '0000-00-00 00:00:00', `login_count` int(11) NOT NULL default '0', PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

INSERT INTO `yse_user` (`ID`, `name`, `pass`, `real_name`, `last_login`, `login_count`) VALUES (1, 'Umut', '202cb962ac59075b964b07152d234b70', 'Umut Benzer', '2008-07-09 01:56:10', 0);

*/

/* Bu tablo ile kullanıcı adı Umut şifre 123 olan bir test kullanıcısı yaratılır. */ /* With this table a test user created with username Umut pass 123 */

?>
``` Projenin tüm dosyalarını (ve ezSQL sınıflarını) [buradan indirebilirsiniz](loginout.zip). Dosya, veritabanı tablosunu yaratmak için gerekli SQL satırlarını da içerir.

*Sistem Gereksinimleri:* PHP 4+, MySQL