Merhabalar;
Bu dersimizde php ile güvenli beni hatırla sistemi hazırlayacağız. Bu sistem sayesinde kullanıcılar sitemize her girdiklerinde yeniden oturum açmak zorunda kalmayacaklar ve çok daha akıcı bir deneyim elde edecekler.
Kısaca sistemin mantığından bahsedersek; kullanıcımız giriş formunda beni hatırla seçeneğini işaretlerse bunu post sayfamızda yakalayacağız. Daha sonra random bir kod oluşturup bu kodu kullanıcının id’si ile birlikte veri tabanımıza kaydedeceğiz. Aynı kodu bir de kullanıcının tarayıcısına çerez olarak kaydedeceğiz.
Kullanıcı farklı bir zamanda siteye tekrar girdiğinde header sayfamızın en üstüne eklediğimiz kod parçası bu çerez ile veri tabanımızdaki satırı eşleştirecek ve oturumu otomatik olarak başlatacak.
Öncelikle giriş formumuza beni hatırla seçeneğini ekleyelim.
... <label for="ckb1"> Beni hatırla </label> <input id="ckb1" type="checkbox" name="remember-me">
Daha sonra bu formun post edildiği adreste birkaç düzenleme yapalım.
<?php $User = $_POST['username']; $Pass = $_POST['password']; // Formdan aldığımız bilgileri veri tabanında sorguluyoruz. $CheckUser = $db->query("SELECT * FROM users WHERE username='{$User}' and password = '{$Pass}' ")->fetch(PDO::FETCH_ASSOC); if ( $CheckUser ) { // Eğer kullanıcı var ise standart session başlatma işlemlerini uygulayın, ardından beni hatırla işlemlerini yapalım. if ( isset($_POST['remember-me']) ) { $UserID = $CheckUser['id']; // Kullanıcının id'si. $delete = $db->exec("DELETE FROM remember_me WHERE user_id = '$UserID' "); // Önceki anahtarları siliyoruz. $NewToken = bin2hex(openssl_random_pseudo_bytes(32)); // Rastgele kod üretiyoruz. // Ürettiğimiz kodu kullanıcı id'si ve tarayıcı bilgisi ile birlikte veritabanımıza kaydediyoruz. $Insert2 = $db->prepare("INSERT INTO remember_me SET user_id = :bir, remember_token = :iki, expired_time = :uc, user_browser = :dort"); $insert = $Insert2->execute(array( "bir" => $UserID, "iki" => $NewToken, "uc" => time()+604800, 'dort' => md5($_SERVER['HTTP_USER_AGENT']) )); // Kullanıcının tarayıcısına bu kodu çerez olarak kaydediyoruz. setcookie("RMB", $NewToken, time() + 604801,'/'); } }
Burada form post sayfamıza ekleme yaptığımız beni hatırla sistemi ile ilgili olan kısım sadece 13 ile 37 satırları arasında kalan kod. Siz bu kısmı alıp kendi kullandığınız kodların altına ekleyebilirsiniz.
Şimdi veri tabanımızda remember_me adında bir tablo oluşturuyoruz ve şu sütunları ekliyoruz.
Şu ana kadar ne yaptık?
Kullanıcının giriş formu aracılığıyla beni hatırla seçeneğini seçtiğini algıladık. Formumuzu post ettiğimiz adreste, oluşturulmuş tüm eski oturumları temizledik ve rastgele bir kod ürettik. Bu kodu hem veritabanımıza kullanıcı id’si ile birlikte ekledik hem de kullanıcının tarayıcısına çerez bilgisi olarak kaydettik.
Şimdi ne yapacağız?
Şimdi ise son adım olarak kullanıcı siteye tekrar girdiğinde çerez bilgisini veritabanımızda sorgulayıp eğer geçerli ise oturumu otomatik olarak başlatacağız.
Aşağıdaki kodu site ilk açıldığında en üstte çalışacak şekilde bir dosyaya ekleyebilirsiniz. Oturumun site ilk açıldığında anında başlaması için bu kodun ilk çalışması şart. Header.php tarzı dosyalara ekleme yapabilirsiniz.
<?php session_start(); // Eğer aktif bir oturum yok ise. if ( !isset($_SESSION['Oturum']) || $_SESSION['Oturum'] != 'active' ) { // Eğer beni hatırla çerezi var ise. if ( isset($_COOKIE['RMB']) and $_COOKIE['RMB'] != 'false' ) { $CookieToken = $_COOKIE['RMB']; // Çerez kodu. $Browser = md5($_SERVER['HTTP_USER_AGENT']); // Tarayıcı bilgisi. $time = time(); // Unix zaman. $query = $db->query("SELECT * FROM remember_me WHERE remember_token = '{$CookieToken}' and user_browser = '$Browser' and expired_time > $time ")->fetch(PDO::FETCH_ASSOC); // Eğer çerez kodu geçerli ise ve max oturum süresi 7 gün aşılmamış ise. if ( $query ) { $CookieUser = $query['user_id']; // Çereze ait kullanıcı id'si. // Çerezdeki kullanıcı id'sini veri tabanımızda sorguluyoruz. $CheckUser = $db->query("SELECT * FROM users WHERE id = '{$CookieUser}' ")->fetch(PDO::FETCH_ASSOC); if ( $CheckUser ) { // Kullanıcı geçerli. $CheckUser kullanıcısı için oturum başlatılabilir. // Burada standart login sayfanızda hangi işlemleri yapıyorsanız onları yapın ve oturumu başlatın. // Bu şekilde kullanıcının oturumu otomatik olarak başlamış olacak. $_SESSION['Oturum'] = 'active'; $_SESSION['UserID'] = $CheckUser['id']; } else { // Çerez geçersiz, çerezi sıfırla ve giriş sayfasına yönlendir. setcookie("RMB", 'false', time() -3600,'/'); header("Location:/Login"); exit; } } else { // Çerez geçersiz, çerezi sıfırla ve giriş sayfasına yönlendir. setcookie("RMB", 'false', time() -3600,'/'); header("Location:/Login"); exit; } } }
Bu şekilde kullanıcının oturumunu da otomatik olarak başlatmış olduk. Sistem en basit haliyle bu şekilde işliyor. Çerez olarak hiçbir kullanıcı adı veya parola tutmadığımız için çok daha güvenli. Tarayıcı bilgisini kaydedip sorgulamamız ise farklı tarayıcılarda aynı çerez kodunun çalışmasını engelliyor ve ekstra bir güvenlik katmanı sağlıyor.
Şimdilik dersimizin sonuna geldik, konu ile ilgili takıldığınız bir nokta olursa yorum olarak aşağıya yazabilirsiniz. Elimden geldiğince yardımcı olmaya çalışırım.
7 yorum
Eyvallah çok işime yaradı teşekkür ederim kardeşim
çok teşekkür ederim
çok teşekkürler, herkese iyi çalışmalar dilerim 🙂 Ek olarak; Bunun çalışıp çalışmadığını hemen nasıl kontrol edebiliriz acaba? 1 hafta beklemeden 😀
çok teşekkürler, herkese iyi çalışmalar dilerim 🙂 Ek olarak; Bunun çalışıp çalışmadığını hemen nasıl kontrol edebiliriz acaba? 1 hafta beklemeden 😀
Selamlar, faydalı bilgi için teşekkürler,
Bir sorum olacak eğer cookie bir şekilde çalınır ya da cookie değeri taklit edilip console dan create edilirse böylece aynı token a sahip bir cookie oluşmuş olacak ve bu cookie ye sahip kişi şifre vs… girmeden login olmuş olmayacak mı?
dostum rica etsem bu kodu eklememe yardımcı olurmusunuz
Uygulanmış bir örnegi yükleme şansınız yokmu