Php üyelik sistemi yapımı - GitHub
PHP PDO ile yapılmış güvenli üyelik sistemi scripti indirin. Üyelik scriptini GitHub üzerinden ücretsiz olarak indirebilir ve ayrıca üyelik sisteminin yapılış videosunu ücretsiz olarak izleyebilirsiniz.
Bu PHP üyelik sistemi scripti, aynı anda kullanıcı adı ve e-posta ile giriş yapmanızı sağlayan güvenli üyelik sistemi script sistemidir. Ve güvenlik önlemleri ile oturumu oluşturur. Ve bu üyelik sistemi ile ilgili bir diğer önemli özellik de, giriş yapan kullanıcı giriş sayfasına veya kayıt sayfasına erişmeye çalışırsa, profil sayfasına veya üyeler alanı sayfasına yönlendirilecektir. Çünkü kullanıcı bir kez oturum açtıktan sonra oturum açma veya kayıt sayfalarına girmesine gerek olmamalıdır.
Öncelikle aşağıdaki GitHub bağlantısından üyelik sistemi scriptini indirebilirsiniz.
Aşağıda, güvenli bir kullanıcı oturum açma/kayıt/şifre sıfırlama sisteminin nasıl oluşturulacağını izleyip öğrenmeni sağlayan öğretici bir video da var. Video serisi 4 bölümden oluşmaktadır.
- İlk video, projeyi kurmakla ilgilidir.
- İkinci video, güvenli kullanıcı kayıt sistemidir.
- Üçüncü video, güvenli kullanıcı giriş sistemidir.
- Dördüncü video, şifre sıfırlama sistemidir (şu anda aktif değildir)
Videonun sonuna, kaba kuvvet (brute force) saldırılarını durdurmak için girişleri sınırlama ve portaldaki tüm kullanıcı etkinliğini ve daha fazlasını izlemek için etkinlik izleyici gibi birçok güvenlik özelliğine sahip en gelişmiş kullanıcı kayıt ve oturum açma sistemi için bir demo var.
1. HTML Formu ve Veritabanının Hazırlanması
1a. Tablo yapısı hakkında açıklama
İşte user tablosunun SQL kodu, bu kodu kullanarak gerekli kolonları içeren tabloyu oluşturabilirsiniz.
---- Table structure for table `users`--CREATE TABLE `users` ( `id` int(11) NOT NULL, `username` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `created` datetime NOT NULL DEFAULT current_timestamp(), `updated` datetime NOT NULL DEFAULT current_timestamp()) ENGINE=InnoDB DEFAULT CHARSET=latin1;---- Indexes for table `users`--ALTER TABLE `users` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `username` (`username`), ADD UNIQUE KEY `email` (`email`);---- AUTO_INCREMENT for table `users`-- ALTER TABLE `users` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
1b. Veritabanına Bağlanmak
Include dizininde bir dosya oluşturun ve bunu connect.php olarak kaydedin, bu kodu bu dosyada kullanın. Bu kod, sağlanan veritabanı kullanıcı oturum açma bilgileriyle veritabanına bağlanır, önceki adımda oluşturduğunuz veritabanı adını kullanın. Bu, veritabanına PDO ile bağlanma yöntemidir. Bu connect.php'yi kullanarak veritabanına bağlanmak için diğer PHP dosyalarına dahil edeceğiz. Bu dosyayı her dosyada sadece bir kez kullanacağız, bunun için require_once PHP işlevini kullanacağız.
<?php $dsn = 'mysql:host=localhost;dbname=login-portal'; $db = new PDO($dsn, 'root', '');?>
1c. HTML Şablonu İndir
Giriş, Kayıt, Şifre Sıfırlama HTML Formları için buradan indireceğiniz hazır HTML şablonu kullanabilirsiniz.
**header.php**
Bu header.php dosyası, body bölümünde div etiketini açana kadar HTML kodunun head bölümünü içerir.
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content=""> <title>Admin Portal - Register</title> <!-- Bootstrap Core CSS --> <link href="./vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- Custom CSS --> <link href="./dist/css/sb-admin-2.css" rel="stylesheet"> <!-- Custom Fonts --> <link href="./vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script class="lazyload img-fullwidth" src="https://cdn.ogznet.com/assets/img/empty.webp" data-src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script class="lazyload img-fullwidth" src="https://cdn.ogznet.com/assets/img/empty.webp" data-src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <![endif]--></head><body> <div id="wrapper">
**footer.php**
Footer.php'de, div etiketinin kapatılmasından HTML kodunun sonuna kadar olan koddur.
</div> <!-- jQuery --> <script class="lazyload img-fullwidth" src="https://cdn.ogznet.com/assets/img/empty.webp" data-src="./vendor/jquery/jquery.min.js"></script> <!-- Bootstrap Core JavaScript --> <script class="lazyload img-fullwidth" src="https://cdn.ogznet.com/assets/img/empty.webp" data-src="./vendor/bootstrap/js/bootstrap.min.js"></script> <!-- Custom Theme JavaScript --> <script class="lazyload img-fullwidth" src="https://cdn.ogznet.com/assets/img/empty.webp" data-src="./dist/js/sb-admin-2.js"></script></body></html>
Bu 2 şablon dosyasını yükledikten sonra, giriş bilgilerini ekleyeceğiz.
1d. Kullanıcı Giriş Formu
Burada PHP PDO ile veritabanına bağlanmak için connect.php dosyasıyla birlikte üstbilgi ve altbilgi şablon dosyalarını kullanıyoruz.
Yukarıda indirdiğiniz HTML şablonu içinde Kullanıcı Adı/E-posta ve Parola giriş alanları ile basit önyükleme stili formu bulunur. Gönder butonu ile formu gönderdikten sonra, gönderilen bu veriler kullanıcılar tablosunda kontrol edilecektir. Bu Kullanıcı Adı/E-posta & Şifre kombinasyonu ile herhangi bir satır eşleşirse, Kullanıcı Sisteme giriş yapacaktır.
<?php require_once('includes/connect.php'); include('includes/header.php');?><div class="container"> <div class="row"> <div class="col-md-4 col-md-offset-4"> <div class="login-panel panel panel-default"> <div class="panel-heading"> <h3 class="panel-title">Please Sign In</h3> </div> <div class="panel-body"> <form role="form" method="post"> <fieldset> <div class="form-group"> <input class="form-control" placeholder="E-mail" name="email" type="text" autofocus > </div> <div class="form-group"> <input class="form-control" placeholder="Password" name="password" type="password" value=""> </div> <input type="submit" class="btn btn-lg btn-success btn-block" value="Login" /> </fieldset> </form> </div> </div> </div> </div></div><?php include('includes/footer.php'); ?>
2. Form Doğrulama İşlemleri
Üyelik Sistemimizde ilerlemeden önce, kullanıcı girişlerini kontrol etmek için PHP Form doğrulamalarını eklemeliyiz. HTML Form Validations'ı kullanabiliriz, ancak bu tarayıcı tabanlı doğrulama olduğu için o kadar güvenli değildir, biraz kodlama bilgisi olan herhangi biri doğrulamayı tarayıcıdan değiştirebilir. Bu amaçla, kodunuzda PHP Form Validations kullanmanızı şiddetle tavsiye ederim.
Burada gönderilen giriş alanı değerlerinin boş olmadığını kontrol ediyoruz, bu kontrolü Kullanıcı Adı/E-posta Alanı ve Şifre Alanı için ekliyoruz.
Hatta PHP Form Validations ile devam etmeden önce, formun gönderilip gönderilmediğini kontrol etmek için genel olarak gönderiyi kontrol etmeliyiz.
if(isset($_POST) & !empty($_POST)){ // PHP Form Validations if(empty($_POST['email'])){ $errors[]="User Name / E-Mail field is Required"; } if(empty($_POST['password'])){ $errors[]="Password field is Required"; }}
3. Form Doğrulama Hatalarını Görüntüleme
Yukarıdaki form doğrulama kodu ile form alanlarını doğrulamak için kontrol ettik. Bu, giriş alanı için gerekli doğrulamadır. Hata olması durumunda, tüm bu hata mesajlarını saklamak için bir hata dizisi oluşturduk.
Şimdi, bu hata mesajlarını, bir uyarı stiliyle görüntüleyerek kullanıcıya gösterme zamanı.
Hata mesajını görüntülemeden önce error dizisinin boş olup olmadığını kontrol etmeliyiz.
<?php if(!empty($errors)){ echo "<div class='alert alert-danger'>"; foreach ($errors as $error) { echo "<span class='glyphicon glyphicon-remove'></span> ".$error."<br>"; } echo "</div>"; }?>
4. Başarısız Form Gönderiminde Form Verilerini Görüntüleme
Hata durumunda, form sayfası hata kalmayana kadar tekrar tekrar yüklenecektir. Değerleri geri getirip formda göstermiyorsak, bir kullanıcının aynı girdi dosya değerini tekrar tekrar girmesi zordur, bu oluyorsa kullanıcı birkaç kez deneyecektir, eğer yeterli sabrı varsa, yoksa web sitesini terk edecektir. Kullanıcı ile bu tür durumlardan kaçınmak için hata durumunda form giriş alanlarındaki değerleri döndürmeliyiz. Böylece o kullanıcı formdaki değerleri güncelleyebilir ve formu tekrar gönderir.
Burada Kullanıcı Adı / E-posta giriş alanları değerini döndürüyoruz. Hatalı veya hatalı giriş bilgileri durumunda, kullanıcının formu tekrar doldurmasına gerek yoktur, kullanıcı adı / e-posta giriş alanı değerini güncelleyebilir ve formu gönderebilir. Şifre giriş alanı için kullanıcının tekrar girmesi gerekir, çünkü kullanıcı bu şifre giriş alanlarının değerini, şifre giriş alanlarının varsayılan olarak gizli oldukları için yeniden doğrulayamaz.
<div class="form-group"> <input class="form-control" placeholder="E-mail" name="email" type="text" autofocus value="<?php if(isset($_POST['email'])){ echo $_POST['email']; } ?>"></div>
5. CSRF Koruması Ekleme
CSRF Tokens, formlarımızı istekleri gönderen saldırganlardan koruyarak ekstra bir koruma katmanı ekler. Form aracılığıyla gönderilen CSRF belirtecinin geçerli olup olmadığını kontrol eder, aksi takdirde token uyuşmazlığı hatası döndürür.
Kullanıcı gerçek kullanıcıysa ve aynı sayfadan gönderiyorsa, yalnızca talep edilen kabul edilecek ve Kullanıcı Kaydı başarıyla tamamlanacaktır.
Formlarımıza CSRF Koruması eklemek için üç adım vardır.
5a. CSRF Simgesi Oluşturma
CSRF Token, birden çok PHP işleviyle oluşturulan rastgele bir dizedir. CSRF Token oluşturmak için, burada bu üç PHP fonksiyonunu rand, uniquid, md5 fonksiyonlarını kullanıyorum. Bu üç işlevi birleştirerek, bir CSRF Simgesi oluşturuyorum ve bunu bir değişkene atadım, ayrıca bu CSRF belirtecini oturumda saklıyorum. Bu CSRF Token oturumunu, bir sonraki adımda belirteci kontrol ederken kullanacağız.
Ek güvenlik katmanı için form sayfasının yüklendiği zamanı saklıyorum. Bu süreye dayanarak belirteci kontrol edebiliriz, Form belirli bir sürenin ötesinde gönderilirse isteği reddedebiliriz.
$token = md5(uniqid(rand(), TRUE));$_SESSION['csrf_token'] = $token;$_SESSION['csrf_token_time'] = time();
5b. CSRF Simgesi Ekleme
CSRF Token eklemek basittir, önceki adımda CSRF Token'ı oluşturduk. Bu belirteç forma eklenmelidir, bunun için onu gizli giriş alanı olarak ekleyeceğiz. Formu gönderirken, bu CSRF token da POST super gobal'daki istekle birlikte gönderilecektir.
<input type="hidden" name="csrf_token" value="<?php echo $token; ?>">
5c. CSRF Simgesini Kontrol Etme
Şimdi CSRF Simgesini kontrol etme zamanı, eğer csrf belirteci ayarlanmışsa, form aracılığıyla gönderilen csrf belirteci ile oturumda saklanan csrf belirteci değerini karşılaştıracağız. Eşleşmiyorsa, bir hata mesajı döndürürüz.
// CSRF Token Validation if(isset($_POST['csrf_token'])){ if($_POST['csrf_token'] === $_SESSION['csrf_token']){ }else{ $errors[] = "Problem with CSRF Token Validation"; } }
Ardından, CSRF Token Time doğrulamasını kontrol etmeliyiz. Yani sayfa birkaç gün önce yüklendiyse ve formu birkaç gün sonra gönderdiyse, bu isteği işleme almamalıyız. Bu tür istekleri engellemek için CSRF Token Time Validation ekliyoruz.
Her şeyden önce, isteğe izin vereceğimiz maksimum süreyi ayarlıyoruz. Burada saniye cinsinden 24 saat olarak ayarlıyoruz. Ardından, daha önce belirlediğimiz maksimum süreye eklenen csrf token time ile şimdiki zaman damgasını kontrol edeceğiz. Eğer aralık içindeyse, talebe izin veririz, aksi takdirde isteği reddeder ve bir hata mesajı veririz.
// CSRF Token Time Validation $max_time = 60*60*24; // in seconds if(isset($_SESSION['csrf_token_time'])){ $token_time = $_SESSION['csrf_token_time']; if(($token_time + $max_time) >= time() ){ }else{ $errors[] = "CSRF Token Expired"; unset($_SESSION['csrf_token']); unset($_SESSION['csrf_token_time']); } }
6. Giriş Mantığını Ekleme
Ve son adım oturum açmaktır, Form doğrulamaları, CSRF Token Koruması gibi yukarıdaki tüm adımlardan sonra, PHP PDO'nun basit SELECT SQL sorgusunu kullanarak gönderilen Kullanıcı Oturum Açma kimlik bilgilerini kullanıcılar tablo kayıtlarıyla kontrol edeceğiz.
İlk olarak, herhangi bir hata olup olmadığını kontrol ediyoruz. Hata yoksa, PHP PDO'da adlandırılmış dizi bağlama ile SELECT İşlemi ile devam edeceğiz.
6a. Kullanıcının Varlığını Kontrol Etme
SELECT SQL sorgusu ile özetlenen e-postanın kullanıcı veritabanımızda olup olmadığını kontrol edeceğiz. Varsa, satır sayısı olarak 1 döndürür, çünkü daha önce veritabanı tablosunu oluştururken kullanıcı adı ve e-posta için benzersiz anahtar kullandık. Yani bir e-posta veya kullanıcı adı yalnızca bir kez saklanacaktır.
Satır sayısı bire eşitse, şifre karmasını gönderilen şifre ile karşılaştırmaya devam edeceğiz.
Gönderilen e-posta kimliğine sahip herhangi bir kayıt yoksa, bir hata döndürürüz.
if(empty($errors)){ // Check the Login Credentials $sql = "SELECT * FROM users WHERE email=?"; $result = $db->prepare($sql); $result->execute(array($_POST['email'])); $count = $result->rowCount(); $res = $result->fetch(PDO::FETCH_ASSOC); if($count == 1){ }else{ $errors[] = "User Name / E-Mail not Valid"; }}
6b. Parolayı Karşılaştırma
Yukarıdaki adımdan, eğer kayıt sayısı bire eşitse. Daha sonra düz metin şifresini bir önceki adımdan aldığımız veritabanından şifre hash'i ile karşılaştıracağız.
Şifreyi karşılaştırmak için password_verify işlevini kullanıyoruz. true dönerse, oturumu oluşturacağız ve kullanıcıyı üyeler alanı sayfasına yönlendireceğiz. Aksi takdirde, bir hata mesajı döndürürüz.
if($count == 1){ // Compare the password with password hash if(password_verify($_POST['password'], $res['password'])){ // create the session and redirect to members area }else{ $errors[] = "User Name / E-Mail & Password Combination not Working"; }}
6c. Kullanıcı Adı ve E-posta ile Oturum Açmayı Etkinleştirme
Yalnızca e-posta adresi olan kullanıcılara izin vermek yerine, bunu kullanıcı adı ve e-posta adresiyle çalışacak şekilde güncelleyeceğiz. Kullanıcı, geçerli bir kullanıcı adı ve şifre kombinasyonu veya geçerli bir e-posta ve şifre kombinasyonu girebilir.
// Check the Login Credentials$sql = "SELECT * FROM users WHERE ";if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){ $sql .= "email=?";}else{ $sql .= "username=?";}$result = $db->prepare($sql);$result->execute(array($_POST['email']));$count = $result->rowCount();$res = $result->fetch(PDO::FETCH_ASSOC);
7. Güvenli Oturum Oluşturma
Kullanıcı Girişi işlemindeki son adımı tamamlamak için oturumu oluşturun. Şifreleri karşılaştırırken true dönerse. Ardından oturum kimliğini yeniden oluşturuyoruz ve kullanıcı bilgileriyle oturumu oluşturuyoruz.
Oturumu oluşturduktan sonra, kullanımı pano sayfasına yönlendiriyoruz.
if(password_verify($_POST['password'], $res['password'])){ // regenerate session id session_regenerate_id(); $_SESSION['login'] = true; $_SESSION['id'] = $res['id']; $_SESSION['last_login'] = time(); // redirect the user to members area/dashboard page header("location: index.php");}
8. Çıkış İşlemleri
Giriş yaptıktan sonra, kullanıcının sistemden çıkış yapmasının bir yolu olmalıdır. Kullanıcının oturumunu kapatmak için basit bir işlev session_destroy kullanıyoruz.
Aşağıdaki kodu kullanın ve logout.php dosyası olarak kaydedin, tüm çıkış bağlantılarında bu sayfaya bağlantı verin.
<?phpsession_start();session_destroy();header("location: login.php");?>
9. Üye Paneli Sayfasında Oturum Açmayı Kontrol Etme
Aşağıdaki kodu check-login.php dosyasına kaydedin. Bu dosyayı kimliği doğrulanmış sayfalar bölümüne ekleyeceğiz, bu sayfalara yalnızca oturum açmış kullanıcılar erişebilecek.
İşte bu kodda, önceki adımda oluşturulan oturumları kontrol ediyoruz. Değerlerden herhangi biri yoksa, kullanıcıyı giriş sayfasına yönlendiriyoruz.
Kullanıcı, giriş bilgileriyle tekrar giriş yapmalıdır.
<?phpsession_start();if(isset($_SESSION['login']) & ($_SESSION['login'] == true)){}else{ // redirect user to login page header("location: login.php");}if(isset($_SESSION['id']) & !empty($_SESSION['id'])){}else{ // redirect user to login page header("location: login.php");}if(isset($_SESSION['last_login']) & !empty($_SESSION['last_login'])){}else{ // redirect user to login page header("location: login.php");}?>
10. Oturum Açma ve Kayıt Sayfalarında Oturum Açılıp Açılmadığını Kontrol Etme
Kullanıcı zaten Giriş Yapmışsa, kullanıcı giriş sayfasına veya kayıt sayfasına erişememelidir, bu nedenle bu kodu ekliyoruz.
Bu kodu if-logggedin.php dosyasına kaydedin. Bu dosyayı login.php ve register.php dosyalarını dahil edeceğiz.
Bu dosyayı sadece login.php & register.php dosyalarına ekliyoruz, hala mevcut sayfaların dosya adını basename ve PHP_SELF sunucu değişkeni ile kontrol ediyoruz.
login.php veya register.php'ye eşitse, oturumu kontrol ediyorum. Oturum ayarlanmışsa, kullanıcı kontrol paneli sayfasına yönlendirilecektir. Aksi takdirde, kullanıcı aynı oturum açma veya kayıt sayfasında kalacaktır.
<?php// check the current pageif((basename($_SERVER['PHP_SELF']) == 'login.php') || (basename($_SERVER['PHP_SELF']) == 'register.php')){ if(isset($_SESSION['id']) & !empty($_SESSION['id'])){ // redirect to dashboard page header("location: index.php"); }}?>
Üyelik Sistemi Scripti İndir
Herhangi bir nedenle bu dosyaları birleştiremiyorsanız, yukarıdaki kod parçacıklarını birleştirerek dosyaları oluşturabilirsiniz. Tüm kodlama dosyalarına buradan ulaşabilirsiniz.
Yorumlar (0)