En son 20 Ağustos 2019'da Vincy tarafından değiştirilmiştir.

Kullanıcı girişi ve kaydı, herhangi bir CMS uygulaması için temel bir gerekliliktir. Bu, bir projeye başlarken yapılan ilk çalışmadır. Kullanıcı oturum açma kimlik doğrulamalı uygulama, anonim erişimi engelleyerek güvenlik sağlar. OAuth girişini etkinleştirmek veya Tek Oturum Açma (SSO) uygulamak ve benzeri diğer yollar gibi, uygulamamızda kimlik doğrulamasını etkinleştirmenin çeşitli yolları vardır. Önceki bir eğitimde, nasıl uygulanacağını ve ayrıca hakkında gördük.

Bu örnek, hem oturum açma hem de kayıt işlevlerini içerir. Kayıtlı üyeleri saklamak için MySQL veritabanını kullandım. Kullanıcı kaydı, kullanıcıdan ayrıntıları almak için girdi içerecektir. Bu formu gönderirken, form verileri PHP'ye gönderilir ve veritabanında saklanır. Kullanıcı şifresi veri tabanına kaydedilmeden önce şifrelenecektir. PHP koduna göndermeden önce. Kullanıcı geçerli kimlik bilgileriyle oturum açtığında, kullanıcının ve kendisinin daha fazla ilerlemesine izin verilecektir.

Kullanıcı Kayıt Formu

Bu kod, kullanıcıya kayıt formunu göstermek içindir. Kullanıcı formu ayrıntılarıyla birlikte gönderdiğinde, kullanıcı girişini doğrulamak için JavaScript işlevi çağrılır. Başarılı bir doğrulamadan sonra, PHP kodu, veritabanı ekleme işlemini yürütmek için gönderilen form verilerini okuyacaktır.

">

JavaScript doğrulaması, zorunlu alanların boş olmayan kontrolünü ve ayrıca regex kalıbıyla e-posta biçimi doğrulamasını halledecektir.

Bu PHP kodunu oluşturmak için kayıt formu verilerini kullanarak ekleyin. Veritabanını çalıştırdıktan sonra kullanıcıyı onaylamak için başarı/hata yanıtı gönderilecektir.

openConnection(); $sql1 = "tbl_registered_users'dan isim ve e-posta seçin burada email="$email""; $user = $db->query($sql1); $sonuç = $user->fetchAll(); $_OTURUM["e-postaadı"] = $sonuç["e-posta"]; if (boş($sonuç)) ( $sql = "tbl_registered_users (isim,e-posta, şifre) değerlerine girin("$isim","$email","$şifre")"; $db->exec($sql) ); $database->closeConnection(); $response = array("type" => "success", "message" => "Başarıyla kayıt oldunuz.
Şimdi Oturum Açın."); ) else ( $response = array("type" => "hata", "message" => "E-posta zaten kullanılıyor."); ) ) ?>

PHP kullanarak Giriş Kimlik Doğrulaması

Kayıtlı kullanıcı, bu giriş formu aracılığıyla uygulamaya giriş yapabilir. Oturum açma kimlik doğrulaması, oturum açma e-postası ve parolasını kayıtlı kullanıcı veri tabanıyla eşleştirerek yapılır. Eşleşme bulunursa, uygulama kullanıcının daha fazla ilerlemesine izin verecektir. Aksi takdirde, oturum açma paneli kullanıcıyı geçersiz girişim hakkında bilgilendirir.

Veritabanı ile kullanıcı girişini doğrulamak için kullanılan PHP kodu aşağıda gösterilmiştir. Başarıyla oturum açtıktan sonra, kullanıcıyı dashboard.php'ye yönlendiriyorum. Pano, oturum açmış üyeye hitap ederek karşılama mesajını gösterecektir. Ayrıca, mevcut oturumu kapatma seçeneği de olacaktır.

openConnection(); $sql = "tbl_registered_users arasından * seçin, burada email = "$email" ve password= "$password""; $user = $db->query($sql); $sonuç = $user->fetchAll(PDO::FETCH_ASSOC); $id = $sonuç["id"]; $isim = $sonuç["isim"]; $email = $sonuç["email"]; $_OTURUM["isim"] = $isim; $_OTURUM["id"] = $id; $database->closeConnection(); başlık("konum: dashboard.php"); ) ?>

Bu yazıda öğreneceksiniz kayıt ve yetkilendirme formu nasıl oluşturulur HTML, JavaScript, PHP ve MySQL kullanarak. Bu tür formlar, türü ne olursa olsun hemen hemen her sitede kullanılmaktadır. Forum, çevrimiçi mağaza ve sosyal ağlar (Facebook, Twiter, Odnoklassniki gibi) ve diğer birçok site türü için oluşturulurlar.

Yerel bilgisayarınızda bir siteniz varsa, umarım zaten vardır. Onsuz hiçbir şey işe yaramaz.

Veritabanında Tablo Oluşturma

Kullanıcı kaydını gerçekleştirmek için öncelikle bir Veritabanına ihtiyacımız var. Zaten sahipseniz, o zaman harika, yoksa onu yaratmanız gerekir. Makalede, bunun nasıl yapılacağını ayrıntılı olarak anlatıyorum.

Ve böylece, bir Veritabanımız var (kısaltılmış DB), şimdi bir tablo oluşturmamız gerekiyor kullanıcılar kayıtlı kullanıcılarımızı ekleyeceğimiz.

Veritabanında tablo nasıl oluşturulur, yazıda da anlattım. Bir tablo oluşturmadan önce, hangi alanları içereceğini tanımlamamız gerekir. Bu alanlar, kayıt formundaki alanlarla eşleşecektir.

Biz de formumuzun hangi alanlara sahip olacağını düşündük, hayal ettik ve bir tablo oluşturduk. kullanıcılar bu alanlarla:

  • İD- Tanımlayıcı. Tarla İD veritabanındaki her tabloda olmalıdır.
  • ilk adı- Adı kaydetmek için.
  • Soyadı- Soyadını kaydetmek için.
  • e-posta- Posta adresini kaydetmek için. Giriş olarak e-posta kullanacağız, bu nedenle bu alan benzersiz olmalı, yani BENZERSİZ bir dizine sahip olmalıdır.
  • e-posta_durumu- Mailin onaylanıp onaylanmadığını gösteren alandır. Posta onaylanırsa 1, aksi takdirde 0 değerine sahip olacaktır.
  • parola- Parolayı kaydetmek için.


Kayıt formunuzda daha fazla alan olmasını istiyorsanız, onları da buraya ekleyebilirsiniz.

İşte bu, masamız kullanıcılar hazır. Bir sonraki adıma geçelim.

Veritabanı bağlantısı

Veritabanını oluşturduk, şimdi ona bağlanmamız gerekiyor. MySQLi PHP uzantısını kullanarak bağlanacağız.

Sitemizin klasöründe, adıyla bir dosya oluşturun. dbconnect.php, ve içine aşağıdaki betiği yazıyoruz:

Veritabanı bağlantı hatası. Hata Açıklama: ".mysqli_connect_error()."

"; exit(); ) // Bağlantı kodlamasını ayarlayın $mysqli->set_charset("utf8"); //Kolaylık için buraya sitemizin adını içerecek bir değişken ekleyin $address_site = "http://testsite .yerel" ; ?>

Bu dosya dbconnect.php form işleyicilerine bağlanması gerekir.

Değişkene dikkat edin $adres_site, burada üzerinde çalışacağım test sitemin adını belirttim. Buna göre sitenizin adını belirtirsiniz.

site yapısı

Şimdi sitemizin HTML yapısına bir göz atalım.

Dosyaları ayırmak için site üst bilgisini ve alt bilgisini taşıyın, başlık.php ve altbilgi.php. Bunları tüm sayfalara bağlayacağız. Yani, ana (dosya index.php), kayıt formunun bulunduğu sayfaya (dosya form_register.php) ve yetkilendirme formunun bulunduğu sayfada (dosya form_auth.php).

Bağlantılarımızla engelleyin, kayıt ve yetki, tüm sayfalarda görüntülenecek şekilde sitenin başlığına ekleyin. Bir bağlantı girilecek kayıt formu sayfası(dosya form_register.php) ve diğerini içeren sayfaya İzin formu(dosya form_auth.php).

header.php dosyasının içeriği:

sitemizin adı

Sonuç olarak, ana sayfamız şöyle görünür:


Elbette siteniz tamamen farklı bir yapıya sahip olabilir ama bu bizim için şu anda önemli değil. Önemli olan, kayıt ve yetkilendirme için bağlantılar (düğmeler) olmasıdır.

Şimdi kayıt formuna geçelim. Zaten anladığınız gibi, dosyada var form_register.php.

Veritabanına gidiyoruz (phpMyAdmin'de), tablo yapısını açıyoruz kullanıcılar ve hangi alanlara ihtiyacımız olduğunu görün. Bu nedenle, ad ve soyadı girmek için alanlara, posta adresi (E-posta) girmek için bir alana ve şifre girmek için bir alana ihtiyacımız var. Ve güvenlik amacıyla bir captcha giriş alanı ekleyeceğiz.

Sunucuda, kayıt formunun işlenmesinin bir sonucu olarak, kullanıcının kayıt yapamayacağı çeşitli hatalar meydana gelebilir. Bu nedenle, kullanıcının kaydın neden başarısız olduğunu anlaması için kendisine bu hatalarla ilgili mesajların gösterilmesi gerekir.

Formu görüntülemeden önce, oturumdaki hata mesajlarını görüntülemek için bir blok ekliyoruz.

Ve başka bir an, eğer kullanıcı zaten yetkiliyse ve ilgi uğruna, tarayıcının adres çubuğuna yazarak doğrudan kayıt sayfasına girer. website_url/form_register.php, bu durumda, kayıt formu yerine, zaten kayıtlı olduğu için bir başlık göstereceğiz.

Genel olarak, dosya kodu form_register.php böyle aldık:

Zaten kayıtlısınız

Tarayıcıda, kayıt sayfası şöyle görünür:


Yolu ile gerekli özellik, tüm alanları zorunlu hale getirdik.

Kayıt formu koduna dikkat edin, burada güvenlik kodu görüntülenir:


Görüntü için src özniteliğinin değerinde, dosyanın yolunu belirttik. captcha.php, bu captcha'yı oluşturur.

Dosyanın koduna bakalım captcha.php:

Kod iyi yorumlanmıştır, bu yüzden sadece bir noktaya odaklanacağım.

Bir fonksiyonun içinde imageTtfText(), yazı tipinin yolu belirtilir verdana.ttf. Captcha'nın düzgün çalışması için bir klasör oluşturmalıyız. yazı tipleri, ve yazı tipi dosyasını oraya koyun verdana.ttf. İnternetten bulup indirebilir veya bu makalenin materyalleri ile arşivden alabilirsiniz.

HTML yapısıyla işimiz bitti, artık devam etme zamanı.

e-postayı jQuery ile doğrulama

Herhangi bir formun, hem istemci tarafında (JavaScript, jQuery kullanarak) hem de sunucu tarafında girilen verilerin doğrulanması gerekir.

E-posta alanına özellikle dikkat etmeliyiz. Girilen e-posta adresinin geçerli olması çok önemlidir.

Bu giriş alanı için email (type="email") tipini belirliyoruz, bu bizi hatalı formatlara karşı bir nebze olsun uyarıyor. Ancak bu yeterli değildir, çünkü tarayıcının bize sağladığı kod denetçisi aracılığıyla özniteliğin değerini kolayca değiştirebilirsiniz. tip ile birlikte e-postaüzerinde metin, işte bu kadar, çekimiz artık geçerli olmayacak.


Ve bu durumda, daha güvenilir bir kontrol yapmalıyız. Bunu yapmak için JavaScript'ten jQuery kitaplığını kullanacağız.

jQuery kitaplığını bağlamak için dosyada başlık.php etiketler arasında , kapanış etiketinden önce , şu satırı ekleyin:

Bu satırdan hemen sonra e-posta doğrulama kontrol kodunu ekleyin. Buraya girilen şifrenin uzunluğunu kontrol etmek için kodu ekliyoruz. En az 6 karakter uzunluğunda olmalıdır.

Bu betiğin yardımıyla girilen e-posta adresinin geçerliliğini kontrol ediyoruz. Kullanıcı yanlış E-posta girdiyse, bununla ilgili bir hata görüntüler ve formun gönder düğmesini devre dışı bırakırız. Her şey yolundaysa, hatayı kaldırır ve formun gönder düğmesini etkinleştiririz.

Ve böylece, müşteri tarafında form doğrulama ile işimiz bitti. Şimdi birkaç kontrol yapacağımız ve veritabanına veri ekleyeceğimiz sunucuya gönderebiliriz.

kullanıcı kaydı

Formu işlenmek üzere dosyaya gönderiyoruz kayıt.php, POST yöntemi aracılığıyla. Öznitelik değerinde belirtilen bu işleyici dosyasının adı eylem. Ve gönderme yöntemi, öznitelik değerinde belirtilir. yöntem.

bu dosyayı aç kayıt.php ve yapmamız gereken ilk şey, bir oturum başlatma işlevi yazmak ve daha önce oluşturduğumuz dosyayı dahil etmek. dbconnect.php(Bu dosyada veri tabanına bağlantı yaptık). Ve yine de, hücreleri hemen ilan edin hata mesajları ve başarı mesajları oturum global dizisinde. AT hata mesajları form işleme sırasında oluşan tüm hata mesajlarını kaydedeceğiz ve başarı mesajları Mutluluk mesajları yazalım.

Devam etmeden önce kontrol etmeliyiz formun hiç gönderilip gönderilmediği. Saldırgan bir özelliğin değerine bakabilir eylem formdan ve hangi dosyanın bu formu işlediğini öğrenin. Ve tarayıcının adres çubuğuna aşağıdaki adresi yazarak doğrudan bu dosyaya gitme fikrini bulabilir: http://site_site/register.php

Bu nedenle, global POST dizisinde, adı formdaki "Kaydol" düğmemizin adıyla eşleşen bir hücre olup olmadığını kontrol etmemiz gerekiyor. Böylece "Kayıt Ol" butonuna basılıp basılmadığını kontrol etmiş oluyoruz.

Saldırgan doğrudan bu dosyaya gitmeye çalışırsa bir hata mesajı alır. $address_site değişkeninin sitenin adını içerdiğini ve dosyada bildirildiğini hatırlatırım. dbconnect.php.

Hata! ana Sayfa .

"); } ?>

Oturumdaki captcha değeri, dosyada oluşturulurken eklendi captcha.php. Bir hatırlatma olarak, bu kod parçasını dosyadan bir kez daha göstereceğim. captcha.php, burada captcha değeri oturuma eklenir:

Şimdi testin kendisine geçelim. Dosyada kayıt.php, "Kaydol" düğmesine basılıp basılmadığını veya daha doğrusu yorumun nerede olduğunu kontrol ettiğimiz if bloğunun içinde " // (1) Bir sonraki kod parçası için yer"Biz yazarız:

//Alınan captcha'yı kontrol edin //Dizenin başından ve sonundan itibaren boşlukları kırpın $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha)( //Alınan değeri oturumdaki değerle karşılaştırın. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Eğer captcha doğru değilse, kullanıcıyı kayıt sayfasına geri döndürün, orada yanlış captcha'yı girdiğine dair bir hata mesajı görüntüleyeceğiz. $error_message = "

Hata! Yanlış captcha'yı girdiniz

"; // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] = $error_message; // Kullanıcıyı kayıt sayfası başlığına döndürün ("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Location: " .$address_site ."/form_register.php"); //Komut dosyasını durdurun exit(); ) // (2) Bir sonraki kod parçası için yerleştirin )else( //Eğer captcha geçilmemişse veya boşsa çık ("

Hata! Doğrulama kodu yani captcha kodu yoktur. Ana sayfaya gidebilirsiniz.

"); }

Ardından, POST dizisinden alınan verileri işlememiz gerekiyor. Her şeyden önce, global POST dizisinin içeriğini, yani orada adları formumuzdaki giriş alanlarının adlarıyla eşleşen hücreler olup olmadığını kontrol etmemiz gerekir.

Hücre varsa bu hücreden stringin başından ve sonundan itibaren boşlukları kırpıyoruz, aksi halde kullanıcıyı kayıt formunun olduğu sayfaya geri yönlendiriyoruz.

Ayrıca boşluklar kırpıldıktan sonra değişkene bir string ekliyoruz ve bu değişkenin boş olup olmadığını kontrol ediyoruz, boş değilse devam ediyoruz, aksi takdirde kullanıcıyı tekrar kayıt formu ile sayfaya yönlendiriyoruz.

Bu kodu belirtilen konuma yapıştırın // (2) Bir sonraki kod parçası için yer".

/* $_POST global dizisinin formdan gönderilen verileri içerip içermediğini kontrol edin ve gönderilen verileri normal değişkenler içine alın.*/ if(isset($_POST["ad"]))( // Başındaki ve sonundaki boşlukları kırpın string $first_name = trim($_POST["ad"]); //Değişkenin boş olup olmadığını kontrol edin if(!empty($first_name))( // Güvenlik için özel karakterleri HTML varlıklarına dönüştürün $first_name = htmlspecialchars( $first_name, ENT_QUOTES) ; )else( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Adınızı giriniz

Ad alanı eksik

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); ) if( isset($_POST["soyadı"]))( // Dizinin başındaki ve sonundaki boşlukları kırpın $last_name = trim($_POST["soyadı"]); if(!empty($soyadı)) ( // Güvenlik için özel karakterleri HTML varlıklarına dönüştürün $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Soyadınızı giriniz

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); ) )else ( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Ad alanı eksik

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); ) if( isset($_POST["email"]))( // Dizinin başındaki ve sonundaki boşlukları kırpın $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) E-posta adresinin biçimini ve benzersizliğini kontrol etmek için kod yeri )else( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages" ] .= "

E-postanızı giriniz

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); ) )else ( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); ) if( isset($_POST["şifre"]))( // Dizinin başındaki ve sonundaki boşlukları kırpın $şifre = trim($_POST["şifre"]); if(!empty($şifre)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Şifreyi şifrele $password = md5($password."top_secret"); )else( // Hata mesajını oturuma kaydet. $_SESSION["error_messages"] .= "

Şifrenizi girin

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); ) )else ( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); ) // (4) Veritabanına kullanıcı ekleme kodunun yeri

Alan özel bir öneme sahiptir. e-posta. Alınan posta adresinin biçimini ve veritabanındaki benzersizliğini kontrol etmeliyiz. Yani, aynı e-posta adresine sahip bir kullanıcının zaten kayıtlı olup olmadığı.

Belirtilen yerde" // (3) Posta adresinin biçimini ve benzersizliğini kontrol etmek için kod yeri" aşağıdaki kodu ekleyin:

//Normal ifadeyi kullanarak alınan e-posta adresinin biçimini kontrol edin $reg_email = "/^**@(+(*+)*\.)++/i"; //Alınan e-posta adresinin formatı normal ifadeyle eşleşmiyorsa if(!preg_match($reg_email, $email))( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Geçersiz bir e-posta girdiniz

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); ) // Veritabanında zaten böyle bir adres olup olmadığını kontrol edin $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); Varsa tam olarak bir satırsa, bu e-posta adresine sahip kullanıcı zaten kayıtlı if($result_query->num_rows == 1)( //Eğer sonuç yanlış değilse if(($row = $result_query->fetch_assoc()) ! = false) ( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Bu e-posta adresine sahip kullanıcı zaten kayıtlı

"; //Kullanıcıyı kayıt sayfası başlığına döndürün("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); )else( //Hata mesajını kaydedin oturuma .$_SESSION["error_messages"] .= "

Veritabanı sorgusunda hata

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Location: ".$address_site."/form_register.php"); ) /* seçimi kapat */ $ result_query-> close(); //komut dosyasını durdurun exit(); ) /* seçimi kapatın */ $result_query->close();

Ve böylece, tüm kontrolleri bitirdik, sıra kullanıcıyı veri tabanına eklemeye geldi. Belirtilen yerde" // (4) Veritabanına bir kullanıcı eklemek için kod yeri" aşağıdaki kodu ekleyin:

//Veritabanına kullanıcı eklemek için sorgu $result_query_insert = $mysqli->query("INSERT INTO `users` (ad, soyad, e-posta, şifre) VALUES ("".$ad_adı."", "".$soyadı ." ", "".$email."", "".$password."")"); if(!$result_query_insert)( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Veritabanına bir kullanıcı eklemek için hata isteği

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); )else( $_SESSION["success_messages"] = "

Kayıt başarıyla tamamlandı!!!
Artık kullanıcı adınızı ve şifrenizi kullanarak giriş yapabilirsiniz.

"; //Kullanıcıyı oturum açma sayfasına gönder header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Location: ".$address_site."/form_auth.php"); ) /* İsteği tamamla */ $ result_query_insert-> close(); //veritabanı bağlantısını kapat $mysqli->close();

Veritabanına kullanıcı ekleme isteğinde bir hata oluşursa, oturuma bu hatayla ilgili bir mesaj ekler ve kullanıcıyı kayıt sayfasına döndürürüz.

Aksi takdirde, her şey yolunda giderse, oturuma bir mesaj da ekliyoruz, ancak bu zaten daha keyifli, yani kullanıcıya kaydın başarılı olduğunu söylüyoruz. Ve yetkilendirme formunun bulunduğu sayfaya yönlendiriyoruz.

E-posta adresinin biçimini ve parolanın uzunluğunu kontrol etmek için komut dosyası dosyadadır başlık.php, dolayısıyla bu formdaki alanları da etkiler.

Oturum ayrıca dosyada başlatılır başlık.php, yani dosyada form_auth.php Bir hata aldığımız için oturumun başlatılmasına gerek yoktur.


Dediğim gibi, posta adresinin biçimini ve parolanın uzunluğunu kontrol eden komut dosyası da burada çalışır. Bu nedenle, kullanıcı yanlış e-posta adresi veya kısa şifre girerse, hemen bir hata mesajı alacaktır. Düğme içeri gel inaktif hale gelecektir.

Hataları düzelttikten sonra, düğme içeri gel aktif hale gelir ve kullanıcı formu işleneceği sunucuya gönderebilir.

Kullanıcı yetkilendirmesi

değer atfetmek eylem yetkilendirme formunun bir dosyası var auth.php, bu, formun bu dosyada işleneceği anlamına gelir.

Öyleyse dosyayı açalım auth.php ve yetkilendirme formunu işlemek için kodu yazın. Yapılacak ilk şey, oturumu başlatmak ve dosyayı dahil etmektir. dbconnect.php veritabanına bağlanmak için.

//Form işleme sırasında oluşabilecek hataları eklemek için bir hücre tanımlayın. $_SESSION["hata_mesajları"] = ""; //Başarılı mesajlar eklemek için bir hücre tanımlayın $_SESSION["success_messages"] = "";

/* Formun gönderilip gönderilmediğini, yani Oturum Aç düğmesinin tıklanıp tıklanmadığını kontrol edin. Evet ise, daha ileri gidiyoruz, değilse, kullanıcıya doğrudan bu sayfaya gittiğini belirten bir hata mesajı göstereceğiz. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Bir sonraki kod parçası için yer )else( çıkış("

Hata! Bu sayfaya doğrudan eriştiniz, bu nedenle işlenecek veri yok. Ana sayfaya gidebilirsiniz.

"); }

//Alınan captcha'yı kontrol edin if(isset($_POST["captcha"]))( //Dizenin başındaki ve sonundaki boşlukları kırpın $captcha = trim($_POST["captcha"]); if(!empty ($captcha )( //Alınan değeri oturumdaki değerle karşılaştırın. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != ""))( // Eğer captcha geçersiz ise, kullanıcıyı yetkilendirme sayfasına geri döndürürüz ve orada yanlış captcha'yı girdiğine dair bir hata mesajı gösteririz.$error_message = "

Hata! Yanlış captcha'yı girdiniz

"; // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] = $error_message; // Kullanıcıyı yetkilendirme sayfası başlığına döndürün ("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Location: " .$address_site ."/form_auth.php"); //Komut dosyasını durdurun exit(); ) )else( $error_message = "

Hata! Captcha giriş alanı boş olmamalıdır.

"; // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] = $error_message; // Kullanıcıyı yetkilendirme sayfası başlığına döndürün ("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Location: " .$address_site ."/form_auth.php"); //Komut dosyasını durdur exit(); ) //(2) Posta adresini işlemek için yer //(3) Parolayı işlemek için yer //(4) İçin yer veritabanına sorgu yapmak )else ( //captcha geçilmezse exit("

Hata! Doğrulama kodu yani captcha kodu yoktur. Ana sayfaya gidebilirsiniz.

"); }

Kullanıcı doğrulama kodunu doğru girdiyse devam ediyoruz, aksi halde yetkilendirme sayfasına geri dönüyoruz.

Email adresi doğrulaması

// Dizinin başındaki ve sonundaki boşlukları kırpın $email = trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Normal ifadeyi kullanarak alınan e-posta adresinin formatını kontrol edin $ reg_email = " /^**@(+(*+)*\.)++/i"; //Alınan e-posta adresinin biçimi normal ifadeyle eşleşmiyorsa if(!preg_match($reg_email, $email) )( // Oturum hata mesajına kaydet.$_SESSION["error_messages"] .= "

Geçersiz bir e-posta girdiniz

"; //Kullanıcıyı yetkilendirme sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_auth.php"); //Komut dosyasını durdurun exit(); ) )else ( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Posta adresini (e-posta) girme alanı boş olmamalıdır.

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_register.php"); //Komut dosyasını durdurun exit(); ) )else ( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Email girmek için alan yok

"; //Kullanıcıyı yetkilendirme sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_auth.php"); //Komut dosyasını durdurun exit(); ) // (3) Şifre işleme yeri

Kullanıcı bir e-posta adresini yanlış biçimde girdiyse veya e-posta adresi alanındaki değer boşsa, onu, bununla ilgili bir mesaj görüntülediğimiz yetkilendirme sayfasına döndürürüz.

Parola kontrolu

İşlenecek bir sonraki alan şifre alanıdır. Belirlenen yere" //(3) Parola işleme yeri", Biz yazarız:

If(isset($_POST["şifre"]))( // Dizinin başındaki ve sonundaki boşlukları kırpın $şifre = trim($_POST["şifre"]); if(!empty($şifre))( $password = htmlspecialchars($password, ENT_QUOTES); // Şifreyi şifrele $password = md5($password."top_secret"); )else( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] . = "

Şifrenizi girin

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_auth.php"); //Komut dosyasını durdurun exit(); ) )else ( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Şifre girmek için alan yok

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_auth.php"); //Komut dosyasını durdurun exit(); )

Burada, md5 () işlevini kullanarak, alınan şifreyi şifreliyoruz, çünkü veritabanında şifreli biçimde şifrelerimiz var. Bizim durumumuzda şifrelemede ek gizli kelime " çok_gizli", kullanıcıyı kaydederken kullanılmış olmalıdır.

Şimdi mail adresi gelen mail adresine ve şifresi de alınan şifreye eşit olan bir kullanıcı seçimi üzerinden veri tabanına sorgulama yapmanız gerekiyor.

//Kullanıcının seçimine göre veritabanına sorgu. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" AND password = "".$password."""); if(!$result_query_select)( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Veritabanından kullanıcı seçiminde sorgu hatası

"; //Kullanıcıyı kayıt sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_auth.php"); //Komut dosyasını durdurun exit(); )else( //Veritabanında bu tür verilere sahip kullanıcı olup olmadığını kontrol edin ve ardından bir hata mesajı görüntüleyin if($result_query_select->num_rows == 1)( // Girilen veriler veritabanındaki verilerle eşleşiyorsa, kaydedin oturum dizisi için kullanıcı adı ve şifre $_SESSION["email"] = $email; $_SESSION["password"] = $password; //Kullanıcıyı ana sayfa başlığına döndür("HTTP/1.1 301 Kalıcı Olarak Taşındı" ); header("Konum: ".$address_site ."/index.php"); )else( // Hata mesajını oturuma kaydedin. $_SESSION["error_messages"] .= "

Yanlış kullanıcı adı ve / veya şifre

"; //Kullanıcıyı yetkilendirme sayfasına döndürün header("HTTP/1.1 301 Kalıcı Olarak Taşındı"); header("Konum: ".$address_site."/form_auth.php"); //Komut dosyasını durdurun exit(); ) )

Site çıkışı

Ve uyguladığımız son şey çıkış prosedürü. Şu anda, başlıkta yetkilendirme sayfasına ve kayıt sayfasına bağlantılar gösteriyoruz.

Site başlığında (dosya başlık.php), oturumu kullanarak, kullanıcının oturum açmış olup olmadığını kontrol ederiz. Değilse, kayıt ve yetkilendirme bağlantılarını gösteririz, aksi takdirde (yetki verilmişse), kayıt ve yetkilendirme bağlantıları yerine bağlantıyı gösteririz çıkış.

Dosyadan değiştirilmiş kod parçası başlık.php:

Kayıt

çıkış

Siteden çıkış linkine tıkladığınızda dosyanın içine giriyoruz. çıkış.php, oturumdaki e-posta adresi ve şifreyle hücreleri yok ettiğimiz yer. Bundan sonra, kullanıcıyı bağlantının tıklandığı sayfaya geri döndürürüz. çıkış.

dosya kodu çıkış.php:

Bu kadar. Şimdi nasıl olduğunu biliyorsun kayıt ve yetkilendirme formlarını uygulamak ve işlemek sitenizdeki kullanıcı Bu formlar hemen hemen her sitede bulunur, bu nedenle her programcının bunları nasıl oluşturacağını bilmesi gerekir.

Hem istemci tarafında (tarayıcıda, JavaScript, jQuery kullanarak) hem de sunucu tarafında (PHP dili kullanarak) girdi verilerinin nasıl doğrulanacağını da öğrendik. biz de öğrendik çıkış prosedürünü uygula.

Tüm komut dosyaları test edildi ve çalışıyor. Bu küçük sitenin dosyalarının bulunduğu arşivi bu linkten indirebilirsiniz.

Gelecekte tarif edeceğim bir makale yazacağım. Bir de (sayfayı yeniden yüklemeden) anlatacağım bir yazı yazmayı planlıyorum. Bu yüzden yeni yazılarımdan haberdar olmak için siteme abone olabilirsiniz.

Herhangi bir sorunuz varsa lütfen iletişime geçin, ayrıca makalede herhangi bir hata fark ederseniz lütfen bana bildirin.

Ders Planı (Bölüm 5):

  1. Yetkilendirme Formu için HTML Yapısı Oluşturma
  2. Alınan verileri işleriz
  3. Kullanıcının selamlamasını sitenin başlığında gösteriyoruz

Makaleyi beğendiniz mi?

Reg.ru: etki alanları ve barındırma

Rusya'daki en büyük kayıt şirketi ve barındırma sağlayıcısı.

Hizmette 2 milyondan fazla alan adı.

Promosyon, etki alanı için posta, iş için çözümler.

Dünya çapında 700 binden fazla müşteri şimdiden seçimini yaptı.

* Kaydırmayı duraklatmak için fareyle üzerine gelin.

İleri geri

PHP ve MySQL'de basit bir kullanıcı kayıt sistemi oluşturma

Bir kayıt sistemi oluşturmak çok iştir. E-posta adreslerini doğrulayan, bir kayıt onay e-postası gönderen, form alanlarının geri kalanını doğrulayan ve çok daha fazlasını yapan bir kod yazmanız gerekir.

Ve tüm bunları yazdıktan sonra bile, kullanıcılar kaydolma konusunda isteksiz olacak çünkü. onların tarafında biraz çaba gerektirir.

Bu öğreticide, hiç parola gerektirmeyen veya saklamayan çok basit bir oturum açma sistemi oluşturacağız! Sonuç, zaten var olan bir PHP sitesine değiştirmek ve eklemek için kolay olacaktır. Nasıl çalıştığını öğrenmek ister misiniz? Alttarafı oku.



İşte süper basit sistemimizin nasıl çalışacağı:

Yetkilendirme formu ile kaydı birleştireceğiz. Bu formda bir e-posta adresi girmek için bir alan ve bir kayıt düğmesi olacaktır;
- Alanı bir e-posta adresi ile doldururken, kayıt düğmesine tıklanarak yeni bir kullanıcı hakkında bir kayıt oluşturulur, ancak yalnızca girilen e-posta adresi veritabanında bulunamadıysa.

Bundan sonra, kullanıcı tarafından belirtilen postaya 10 dakika boyunca geçerli olacak bir bağlantı biçiminde gönderilen belirli bir rastgele benzersiz karakter kümesi (belirteç) oluşturulur;
- Kullanıcı, bağlantıya tıklayarak web sitemize gider. Sistem, jetonun varlığını belirler ve kullanıcıya yetki verir;

Bu yaklaşımın avantajları:

Parolaları saklamaya ve alanları doğrulamaya gerek yok;
- Şifre kurtarma, gizli sorular vb. gerek yok;
- Bir kullanıcının kaydolduğu/oturum açtığı andan itibaren, bu kullanıcının erişim bölgenizde olacağından (e-posta adresinin doğru olduğundan) her zaman emin olabilirsiniz;
- İnanılmaz derecede basit kayıt işlemi;

Kusurlar:

Kullanıcı hesabı güvenliği. Birinin kullanıcının postasına erişimi varsa, oturum açabilir.
- E-posta güvenli değildir ve ele geçirilebilir. Bu sorunun, parolanın unutulması ve geri yüklenmesi gerektiğinde veya veri aktarımı (oturum açma adı / parola) için HTTPS kullanmayan herhangi bir yetkilendirme sisteminde de geçerli olduğunu unutmayın;
- Posta sunucusunu gerektiği gibi kurduğunuz sürece, yetkilendirme bağlantılarına sahip iletilerin istenmeyen postaya düşme olasılığı vardır;

Sistemimizin avantaj ve dezavantajlarını karşılaştırdığımızda sistemin kullanılabilirliğinin yüksek (son kullanıcı için maksimum kolaylık) ve aynı zamanda güvenlik göstergesinin düşük olduğunu söyleyebiliriz.

Bu nedenle, önemli bilgilerle çalışmayan forumlara ve hizmetlere kayıt için kullanılması önerilir.

Bu sistem nasıl kullanılır?

Sistemi sadece sitenizdeki kullanıcıları yetkilendirmek için kullanmanız gerekiyorsa ve bu dersi bölmek istemiyorsanız, yapmanız gerekenler:

Derse ekli kaynak dosyaları indirmeniz gerekmektedir.
- Arşivdeki dosyayı bulun tablolar.sql PhpMyAdmin'deki içe aktarma seçeneğini kullanarak veritabanınıza aktarın. Alternatif yol: bu dosyayı bir metin düzenleyiciyle açın, SQL sorgusunu kopyalayın ve çalıştırın;
- Açık içerir/main.php ve veritabanınıza bağlanmak için ayarları doldurun (veritabanına bağlanmak için kullanıcı ve parolanın yanı sıra veritabanının ana bilgisayarını ve adını belirtin). Aynı dosyada, sistem tarafından gönderilen mesajlar için orijinal adres olarak kullanılacak bir e-posta adresi de belirtmeniz gerekir. Bazı toplantı sahipleri, form, toplantı sahibinin kontrol panelinden oluşturulmuş gerçek bir e-posta adresini gösterene kadar giden e-postaları engeller, bu nedenle gerçek adresi girin;
- Tüm dosyaları indir index.php, korumalı.php ve varlıkları ve içeren klasörleri FTP yoluyla sunucunuza;
- Yetkilendirme formu görüntülemek istediğiniz her PHP sayfasına aşağıdaki kodu ekleyin;

Require_once "içerir/main.php"; $kullanıcı = yeni Kullanıcı(); if(!$user->loggedIn())( yönlendirme("index.php"); )
- Hazır!

Her şeyin nasıl çalıştığını merak edenler için aşağıyı okuyun!

İlk adım, yetkilendirme formu için HTM kodunu yazmaktır. Bu kod dosyada bulunur. index.php. Bu dosya ayrıca form verilerini ve yetkilendirme sisteminin diğer kullanışlı özelliklerini işleyen PHP kodunu da içerir. Aşağıdaki PHP kod incelemesi bölümünde bununla ilgili daha fazla bilgi edinebilirsiniz.

index.php

Öğretici: PHP ve MySQL ile Süper Basit Kayıt Sistemi

giriş yap veya kaydol

Yukarıya e-posta adresinizi girin, gönderelim
giriş linki

Head bölümünde (etiketler arasında ve) Ana stilleri dahil ettim (bu eğitimde analiz edilmediler, böylece onları kendiniz görebilirsiniz. asset/css/style.css klasörü). kapanış etiketinden önce Aşağıda yazıp inceleyeceğimiz jQuery kütüphanesini ve script.js dosyasını ekledim.


JavaScript

jQuery, "Kaydol/Giriş Yap" düğmesinin durumunu bir işlevle takip eder e.preventDefault() ve AJAX istekleri gönderir. Sunucunun yanıtına bağlı olarak, belirli bir mesajı görüntüler ve diğer eylemleri belirler /

varlıklar/js/script.js

$(function()( var form = $("#login-register"); form.on("gönder", function(e)( if(form.is(".loading, .loggedIn"))( false döndür) ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (email: email), function (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder. text(m.message); ) )); )); $(document).ajaxStart(function()( form.addClass("yükleniyor"); )); $(document).ajaxComplete(function()( form. removeClass("yükleniyor"); )); ));

AJAX isteğinin mevcut durumunu görüntülemek için forma eklendi (bu, yöntemler sayesinde mümkün oldu) ajaxStart()) ve ajaxComplete(), dosyanın sonuna doğru bulabilirsiniz).

Bu sınıf, dönen animasyonlu bir gif dosyasını gösterir (bize isteğin işlenmekte olduğunu ima ediyormuş gibi) ve ayrıca formun yeniden gönderilmesini önleyen bir bayrak görevi görür (kayıt düğmesi zaten bir kez tıklandığında). Sınıf .giriş- bu farklı bir bayraktır - e-posta gönderildiğinde ayarlanır. Bu bayrak, formda yapılacak diğer işlemleri anında engeller.

Veritabanı Şeması

İnanılmaz derecede basit kayıt sistemimiz 2 MySQL tablosu kullanır (SQL kodu dosyadadır. tablolar.sql). İlki, kullanıcı hesaplarıyla ilgili verileri depolar. İkincisi, oturum açma denemelerinin sayısı hakkında bilgi depolar.


Kullanıcı tablosu şeması.

Sistem, şemada görülebileceği gibi parola kullanmaz. Üzerinde sütunu görebilirsiniz jeton sütuna bitişik belirteçlerle belirteç_geçerliliği. Belirteç, kullanıcı sisteme bağlanır bağlanmaz ayarlanır, e-postasını bir mesaj gönderecek şekilde ayarlar (bir sonraki blokta bununla ilgili biraz daha fazla bilgi). Konuşmacı belirteç_geçerliliği 10 dakika sonra zamanı ayarlar, bundan sonra belirteç artık geçerli değildir.


Yetkilendirme girişimlerinin sayısını sayan tablo şeması.

Her iki tabloda da IP adresi, bir tamsayı alanında ip2long işlevi kullanılarak işlenmiş bir biçimde saklanır.

Şimdi biraz PHP kodu yazabiliriz. Sistemin ana işlevselliği sınıfa atanır. user.class.php Aşağıda görebileceğiniz.

Bu sınıf aktif olarak idorm (docs) kullanır, bu kütüphaneler veritabanlarıyla çalışmak için gerekli minimum araçlardır. Veritabanı erişimini, belirteç oluşturmayı ve doğrulamayı yönetir. PHP kullanıyorsa sitenize bir kayıt sistemi bağlamayı kolaylaştıran basit bir arayüzdür.

user.class.php

Class User( // Private ORM case private $orm; /** * Belirteç ile kullanıcı bul. Yalnızca geçerli belirteçler dikkate alınır. Belirteç, oluşturulduğu andan itibaren yalnızca 10 dakika boyunca üretilir * @param string $token .Bu, aradığınız belirteçtir * @return User.Kullanıcı işlevinin değerini döndürür */ public static function findByToken($token)( // belirteci veritabanında bulun ve doğru zaman damgasının ayarlandığından emin olun $ sonuç = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one();if(!$result)( false döndür; ) yeni Kullanıcı döndür($result); ) /** * Bir kullanıcıyı yetkilendirin veya kaydedin * @param string $email.Kullanıcının e-posta adresi * @return User */ public static function loginOrRegister($email)( // Böyle bir kullanıcı varsa zaten varsa, veritabanında saklanan belirtilen e-posta adresinden Kullanıcı işlevinin değerini döndürür if(User::exists($email))( return new User($email); ) // Aksi takdirde, yeni bir kullanıcı oluşturun veritabanında tel ve belirtilen e-postadan User::create işlevinin değerini döndürür. return User::create($email); ) /** * Yeni bir kullanıcı oluşturun ve veritabanına kaydedin * @param string $email. Kullanıcı e-posta adresi * @return User */ özel statik işlev oluştur($email)( // Yeni bir kullanıcı kaydedin ve bu değerlerden Kullanıcı işlevinin sonucunu döndürün $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Veritabanında böyle bir kullanıcının var olup olmadığını kontrol edin ve boolean değerini döndürün değişken * @param string $email. Kullanıcı e-posta adresi * @return boolean */ genel statik işlev mevcut($email)( // Kullanıcı veritabanında var mı? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Yeni bir kullanıcı nesnesi oluştur * @param örneği $param ORM , id, email veya 0 * @return User */ public function __construct($param = null) ( if($param ORM örneği)( // ORM kontrolü geçti $this->orm = $param; ) else if(is_string($param))( // E-posta kontrolü geçti $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // kullanıcı kimliği $ değerini iletir param değişkeni $id = $param; ) else if(isset($_SESSION["loginid"]))( // Aksi halde oturuma bakın $id = $_SESSION["loginid"]; ) $this->orm = ORM:: for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Yeni bir SHA1 yetkilendirme belirteci oluştur, yazar veritabanına gönderir ve değerini döndürür * @return string */ public function generatorToken()( // Yetkili bir kullanıcı için bir belirteç oluştur ve onu veritabanına kaydet $token = sha1($this->email.time().rand (0, 1000000 )); // Jetonu veritabanında saklayın // Ve sadece sonraki 10 dakika için geçerli olarak işaretleyin $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); $ belirteci döndür; ) /** * Kullanıcıyı yetkilendir * @return void */ public function login()( // Kullanıcıyı oturum açmış olarak işaretle $_SESSION["loginid"] = $this->orm->id; // Değeri güncelle last_login veritabanı alanının $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Oturumu yok edin ve kullanıcının oturumunu kapatın * @return void */ genel işlev oturum kapatma ()( $_SESSION = dizi(); unset($_SESSION); ) /** * Kullanıcının oturum açıp açmadığını kontrol edin * @return boolean */ genel işlev oturum açmış()( dönüş isset($ this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Kullanıcının yönetici olup olmadığını kontrol edin * @return boolean */ public function isAdmin() ( return $this->rank() = = "administrator"; ) /** * Kullanıcı tipini bulun, yönetici veya normal olabilir * @return string */ public function rank()( if($this->orm- >rank == 1)( return "administrator"; ) return "regular"; ) /** * Özel bilgileri almanızı sağlayan bir yöntem * Kullanıcı nesnesinin özellikleri olarak * @param string $key Erişilen özelliğin adı * @return mix */ public function __get($key)( if(isset($this->orm->$key)) ( $this->orm->$key'i döndürün; ) boş dönüş; ) )

Jetonlar, SHA1 algoritması kullanılarak üretilir ve veritabanında saklanır. 10 dakikalık belirteç sona erme sınırı ayarlamak için MySQL'in zaman işlevlerini kullanıyorum.

Belirteç doğrulama prosedürünü geçtiğinde, işleyiciye doğrudan token_validity sütununda saklanan, yalnızca henüz süresi dolmamış belirteçleri düşündüğümüzü söyleriz.

Lütfen sihirli yöntemi kullandığımı unutmayın. __elde etmek Kullanıcı nesnesinin özelliklerine erişimi engellemek için dosyanın sonundaki docs kitaplığı.

Bu sayede özellikler sayesinde veritabanında saklanan bilgilere erişmek mümkün hale gelir. $user->email, $user->token vb. Aşağıdaki kod parçacığında, bu sınıfların nasıl kullanılacağına dair bir örnek ele alalım.


Korumalı sayfa

Yararlı ve gerekli işlevleri depolayan başka bir dosya, dosyadır. fonksiyonlar.php. Burada birkaç sözde yardımcı vardır - diğer dosyalarda daha temiz ve daha okunabilir kodlar oluşturmanıza izin veren yardımcı işlevler.

fonksiyonlar.php

send_email($from, $to, $subject, $message)( // E-posta gönderen yardımcı $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "İçerik türü: metin /plain; charset=utf-8" . "\r\n"; $headers .= "Kimden: ".$from . "\r\n"; iade postası($to, $subject, $message, $headers ); ) function get_page_url()( // PHP dosya URL'sini al $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://".$_SERVER [ "SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url. = $_SERVER["PATH_INFO"]; ) return $url; ) function rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Bu IP adresinde son bir saat içinde yapılan oturum açma deneme sayısı $count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00")") ->count(); // Bu IP adresinde son 10 dakikada giriş denemesi sayısı $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprint f("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new İstisna("Çok fazla giriş denemesi!"); ) ) function rate_limit_tick($ip, $email)( // Tabloda yeni bir giriş oluştur oturum açma girişimlerinin sayısı $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip) ); $login_attempt->save(); ) function yönlendirme($url)( header("Konum: $url"); çıkış; )

Fonksiyonlar oran_sınırı ve oran_limit_tick ilk denemeden bu yana geçen süre boyunca yetkilendirme denemelerinin sayısını izleyin. Oturum açma girişimi veritabanında reg_login_attempt sütununa kaydedilir. Aşağıdaki kod parçacığından da görebileceğiniz gibi, bu işlevler form verileri işlenirken ve gönderilirken çağrılır.

Aşağıdaki kod dosyadan alınmıştır. index.php ve form gönderimini yönetir. Bir dosyada jQuery tarafından işlenen bir JSON yanıtı döndürür. varlıklar/js/script.js ki zaten daha önce tartışmıştık.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Bir JSON başlık başlığı çıktısı al("Content-type: application/json"); // Bu e-posta adresi şu durumlarda geçerli midir? (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Lütfen geçerli bir e-posta girin."); ) // Kontrol Edin kullanıcının oturum açmasına izin verildi, izin verilen bağlantı sayısını aştı mı? (daha fazla bilgi için functions.php dosyası) rate_limit($_SERVER["REMOTE_ADDR"]); // Bu oturum açma girişimini kaydedin rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Kullanıcıya bir e-posta gönder $message = ""; $email = $_POST["email"]; $subject = "Giriş Bağlantınız"; if(!User:: var($email) )( $subject = "Kayıt olduğunuz için teşekkür ederiz!"; $message = "Sitemize kaydolduğunuz için teşekkür ederiz!\n\n"; ) // Bir kullanıcıyı yetkilendirme veya kaydetme girişimi $user = Kullanıcı ::loginOrRegister($_POST[ "email"]); $message.= "Bu URL'den giriş yapabilirsiniz:\n" ; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Bağlantı 10 dakika sonra otomatik olarak kapanacaktır."; $result = send_email($fromEmail, $_POST["email"], $konu, $mesaj); if(!$result)( throw new İstisna("E-postanız gönderilirken bir hata oluştu. Lütfen tekrar deneyin."); ) die(json_encode(array("message" => "Teşekkürler! Bir bağlantı gönderdik.) Spam klasörünüzü de kontrol edin."))) ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage( ) ))); )

Başarılı yetkilendirme/kayıt işleminden sonra, yukarıdaki kod kullanıcıya yetkilendirme için bir bağlantı gönderecektir. Belirteç kullanılabilir hale gelir çünkü yöntem tarafından oluşturulan bağlantıda bir değişken olarak iletilir $_GET işaretleyici tkn ile

index.php

If(isset($_GET["tkn"]))( // Bu belirteç yetkilendirme için geçerli mi? $user = User::findByToken($_GET["tkn"]); if($user)( // Evet , Korunan sayfaya yönlendirme $user->login(); yönlendirme("protected.php"); ) // Hayır, belirteç geçerli değil. Oturum açma/kayıt formuna sahip sayfaya yönlendirme yönlendirme ("index.php") php"); )

$user->login()

oturum için gerekli değişkenleri oluşturacak, böylece sitenin sonraki sayfalarını görüntüleyen kullanıcı her zaman yetkili kalacaktır.

Benzer şekilde, sistemden çıkmak için işlevin işlenmesi düzenlenir.

index.php

If(isset($_GET["logout"]))( $user = new User(); if($user->loggedIn())( $user->logout(); ) yönlendirme("index.php") ;)

Kodun sonunda tekrar index.php'ye yönlendirdim, böylece parametre ?çıkış=1 URL tarafından geçirilen gerekli değildir.

dosyamız index.php ek gerektirir koruma - sisteme daha önce giriş yapmış kişilerin kayıt formunu tekrar görmelerini istemiyoruz. Bu amaçlar için, yöntemi kullanıyoruz $user->logedIn().

index.php

$kullanıcı = yeni Kullanıcı(); if($user->loggedIn())( yönlendirme("korumalı.php"); )

Son olarak, sitenizin sayfalarını korumanıza ve yalnızca yetkilendirmeden sonra kullanılabilir hale getirmenize izin veren bir kod parçası.

korumalı.php

// Sitenizdeki her sayfayı güvenli hale getirmek için bir dosya // main.php ekleyin ve yeni bir Kullanıcı nesnesi oluşturun. İşte bu kadar kolay! require_once "içerir/main.php"; $kullanıcı = yeni Kullanıcı(); if(!$user->loggedIn())( yönlendirme("index.php"); )

Bu kontrolden sonra, kullanıcının başarıyla yetkilendirildiğinden emin olabilirsiniz. Nesne özelliklerini kullanarak veritabanında saklanan bilgilere de erişebilirsiniz. $ kullanıcı. Kullanıcının e-postasını ve durumunu görüntülemek için şu kodu kullanın:

echo "E-posta adresiniz: ".$user->email; echo "Rütbeniz: ".$user->rank();

Yöntem rütbe() burada kullanılır çünkü sayılar genellikle veritabanında saklanır (normal bir kullanıcı için 0, bir yönetici için 1) ve bu verileri ait oldukları durumlara dönüştürmemiz gerekir, bu yöntemin bize yardımcı olduğu şey budur.

Normal bir kullanıcıyı yönetici yapmak için, kullanıcı girişini phpMyAdmin (veya veritabanlarını yönetmenize izin veren başka bir program) aracılığıyla düzenlemeniz yeterlidir. Yönetici durumu herhangi bir ayrıcalık sağlamaz, bu örnekte sayfa yönetici olduğunuzu gösterecektir - hepsi bu.

Ancak bununla ne yapacağınız - kendi takdirinize bağlı olarak, yöneticiler için belirli ayrıcalıklar ve fırsatlar belirleyen kodu kendiniz yazabilir ve oluşturabilirsiniz.

Yapılmıştı!

Bu inanılmaz derecede süper yarı basit şekil ile işimiz bitti! PHP sitelerinizde kullanabilirsiniz, oldukça basit. Ayrıca kendiniz için değiştirebilir ve istediğiniz şekilde yapabilirsiniz.

Materyal, özellikle site sitesi için Denis Malyshok tarafından hazırlandı.

Not: PHP ve OOP'de uzmanlaşmada ilerlemek ister misiniz? PHP programlama da dahil olmak üzere web sitesi oluşturmanın çeşitli yönleriyle ilgili birinci sınıf eğitimlere ve OOP kullanarak PHP CMS sisteminizi sıfırdan oluşturmaya yönelik ücretsiz bir kursa göz atın:

Malzemeyi beğendiniz ve teşekkür etmek mi istiyorsunuz?
Sadece arkadaşlarınız ve iş arkadaşlarınızla paylaşın!


Bugün, Ekim sonunda internette patlayan popüler Joomla CMS'deki 1 günlük kritik bir güvenlik açığının istismarına bakacağız. Zafiyetleri rakamlarla konuşacağız CVE-2016-8869, CVE-2016-8870 ve CVE-2016-9081. Üçü de, beş uzun yıl boyunca çerçevenin bağırsaklarında çürüyen, kanatlarda serbest kalıp kaos, saldırıya uğramış siteler ve bu Joomla'nın masum kullanıcılarının gözyaşlarını getirmek için bekleyen aynı kod parçasından geliyor. Yalnızca gözleri monitörlerin ışığından kırmızı olan ve klavyeleri ekmek kırıntılarıyla dolu olan en yiğit ve cesur geliştiriciler, öfkeli kötü ruhlara meydan okuyabildi ve başlarını düzeltme sunağına koyabildi.

UYARI

Tüm bilgiler yalnızca bilgilendirme amaçlıdır. Bu makaledeki materyallerin neden olabileceği olası zararlardan ne editörler ne de yazar sorumlu değildir.

Her şey nasıl başladı

6 Ekim 2016'da Demis Palma, Stack Exchange'de şu soruyu sorduğu bir konu oluşturdu: Aslında, neden Joomla sürüm 3.6'da aynı ada sahip kullanıcıları kaydetmek için iki yöntem var register() ? İlki, UsersControllerRegistration denetleyicisinde ve ikincisi, UsersControllerUser içindedir. Damis, UsersControllerUser::register() yönteminin bir yerlerde kullanılıp kullanılmadığını veya eski mantıktan kalan evrimsel bir anakronizm olup olmadığını öğrenmek istedi. Bu yöntemin herhangi bir görünüm tarafından kullanılmasa bile, yine de oluşturulan bir istekle çağrılabileceği konusunda endişeliydi. Geliştiriciden, sorunun gerçekten var olduğunu doğrulayan itoctopus takma adıyla bir yanıt aldım. Ve Joomla geliştiricilerine bir rapor gönderdi.

Diğer olaylar en hızlı şekilde gelişti. 18 Ekim'de Joomla geliştiricileri, o zamana kadar kullanıcı kaydına izin veren bir PoC taslağı hazırlamış olan Damis'in raporunu kabul etti. Web sitesinde, bulduğu sorun ve bu konudaki düşünceleri hakkında genel hatlarıyla konuştuğu bir not yayınladı. Aynı gün, hala savunmasız kod içeren Joomla 3.6.3'ün yeni bir sürümü yayınlandı.

Bundan sonra, Davide Tampellini, hatayı basit bir kullanıcıyı değil, bir yöneticiyi kaydetme durumuna döndürür. Ve 21 Ekim'de Joomla güvenlik ekibine yeni bir vaka geldi. Zaten ayrıcalık artışından bahsediyor. Aynı gün, Joomla web sitesinde, 25 Ekim Salı günü, sistem çekirdeğindeki kritik bir güvenlik açığını gideren 3.6.3 seri numaralı bir sonraki sürümün yayınlanacağına dair bir duyuru belirir.

25 Ekim'de Joomla Güvenlik Saldırı Ekibi, Damis tarafından keşfedilen bir kod parçasının yarattığı en son sorunu bulur. Ardından, 21 Ekim'den itibaren, göze çarpmayan Hazırla 3.6.4 Kararlı Sürüm adlı bir taahhüt, talihsiz hatayı düzelten resmi Joomla deposunun ana şubesine gönderilir.

Bu açıklamanın ardından, çok sayıda ilgili kişi geliştiricilerin çetesine katılır - güvenlik açığını döndürmeye ve açıkları hazırlamaya başlarlar.

27 Ekim'de, araştırmacı Harry Roberts, Xiphos Research veri havuzuna, güvenlik açığı bulunan bir CMS'ye sahip bir sunucuya bir PHP dosyası yükleyebilen hazır bir güvenlik açığı yükler.

Detaylar

Pekala, tarih öncesi bitti, hadi en ilginç olana geçelim - güvenlik açığının analizi. Deneysel bir sürüm olarak Joomla 3.6.3'ü yükledim, bu nedenle tüm satır numaraları bu sürümle ilgili olacaktır. Ve daha sonra göreceğiniz dosyalara giden tüm yollar, kurulu CMS'nin köküne göre belirtilecektir.

Damis Palma'nın keşfi sayesinde, sistemde kullanıcı kaydı gerçekleştiren iki yöntem olduğunu biliyoruz. İlki CMS tarafından kullanılır ve /components/com_users/controllers/registration.php:108 dosyasında bulunur. İkincisi (aramamız gereken) /components/com_users/controllers/user.php:293 içinde bulunur. Daha yakından bakalım.

286: /** 287: * Bir kullanıcıyı kaydetme yöntemi. 288: * 289: * @return boolean 290: * 291: * @1.6'dan beri 292: */ 293: public function register() 294: ( 295: JSession::checkToken("post") veya jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Form verilerini alın 301: $data = $this->input->post->get("user", array(), "array"); . .. 315: $return = $model->validate($form, $data); 316: 317: // Hataları kontrol et 318: if ($return === false) 319: ( ... 345: / / Kaydı tamamlayın.346: $return = $model->register($data);

Burada sadece ilginç satırlar bıraktım. Güvenlik açığı bulunan yöntemin tam sürümü Joomla deposunda görüntülenebilir.

Normal bir kullanıcı kaydı sırasında ne olduğunu anlayalım: hangi veriler gönderilir ve nasıl işlenir. Ayarlarda kullanıcı kaydı etkinleştirildiyse, form http://joomla.local/index.php/component/users/?view=registration adresinde bulunabilir.


Meşru bir kullanıcı kayıt talebi, aşağıdaki ekran görüntüsüne benzer.


com_users bileşeni, kullanıcılarla çalışmaktan sorumludur. İstekteki görev parametresine dikkat edin. $controller.$method biçimindedir. Dosya yapısına bakalım.

Klasördeki komut dosyası adları kontrolörlerçağrılan denetleyicilerin adlarını eşleştirin. İsteğimiz artık $controller = "registration" olduğundan, dosya çağrılacak kayıt.php ve bunun register() yöntemi.

Dikkat, soru şu: kayıt işlemi koddaki savunmasız bir yere nasıl aktarılır? Muhtemelen zaten tahmin ettiniz. Savunmasız ve gerçek yöntemlerin adları aynıdır (kayıt), bu nedenle sadece çağrılan denetleyicinin adını değiştirmemiz gerekir. Ve savunmasız denetleyici nerede? Bu doğru, dosyada kullanıcı.php. Görünüşe göre $ controller = "user" . Hepsini bir araya getirerek, task = user.register elde ederiz. Şimdi kayıt talebi ihtiyacımız olan yöntemle işleniyor.


Yapmamız gereken ikinci şey, verileri doğru formatta göndermek. Burada her şey basit. Meşru register() bizden kayıt için verileri - ad, oturum açma, parola, posta - ilettiğimiz jform adlı bir dizi bekler (istek ile ekran görüntüsüne bakın).

  • /components/com_users/controllers/registration.php: 124: // Kullanıcı verilerini alın. 125: $requestData = $this->input->post->get("jform", dizi(), "dizi");

Çocuğumuz bu verileri user adlı bir diziden alıyor.

  • /components/com_users/controllers/user.php: 301: // Form verilerini alın. 302: $data = $this->input->post->get("kullanıcı", dizi(), "dizi");

Bu nedenle, istekteki tüm parametrelerin adlarını jfrom'den user olarak değiştiriyoruz.

Üçüncü adımımız, geçerli bir CSRF belirteci bulmaktır, çünkü o olmadan kayıt olmaz.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") veya jexit(JText::_("JINVALID_TOKEN"));

Bir MD5 karmasına benziyor ve örneğin /index.php/component/users/?view=login sitesindeki yetkilendirme formundan alabilirsiniz.


Artık istediğiniz yöntemle kullanıcılar oluşturabilirsiniz. Her şey yolunda gittiyse tebrikler - az önce bir güvenlik açığından yararlandınız CVE-2016-8870"Yeni kullanıcıları kaydetmek için izin kontrolü eksik."

UsersControllerRegistration denetleyicisinden "çalışan" register() yönteminde şöyle görünür:

  • /components/com_users/controllers/registration.php: 113: // Kayıt devre dışıysa - Oturum açma sayfasına yönlendir. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=) giriş", yanlış)); 117: 118: yanlış döndür; 119: )

Ve böylece savunmasız durumda:

  • /components/com_users/controllers/user.php:

Evet, mümkün değil.

İkinci, çok daha ciddi sorunu anlamak için, oluşturduğumuz request'i gönderelim ve kodun çeşitli bölümlerinde nasıl yürütüldüğünü görelim. İşte işçi yönteminde kullanıcı tarafından gönderilen verileri doğrulamaktan sorumlu olan parça:

Yalnızca üyelere açık olmaya devam ediyor

Seçenek 1. Sitedeki tüm materyalleri okumak için "site" topluluğuna katılın

Belirtilen süre boyunca topluluğa üyelik, TÜM Hacker malzemelerine erişmenizi, kişisel kümülatif indiriminizi artırmanızı ve profesyonel bir Xakep Puanı puanı kazanmanızı sağlar!

En son 23 Temmuz 2019'da Vincy tarafından değiştirilmiştir.

Kullanıcı kaydı veya kaydolma, birçok web uygulamasının ayrılmaz bir parçasıdır ve uygulamanın başarısı için bunu doğru yapmak çok önemlidir. Bu, uygulamanızla kullanıcı etkileşiminin başlangıç ​​noktasıdır.

En iyi UI / UX ile mümkün olduğunca basit olmalıdır. PHP kullanarak kullanıcı kaydı işlevini uygulamak basit bir iştir ve bu makaledeki örneklerle size adımlarda yol göstereceğim.

İçerideki ne?

Bu PHP kullanıcı kaydı örneği nasıl çalışır?

Bu örnek kod 3 bölüme ayrılabilir.

  1. Bir HTML formu aracılığıyla kullanıcı bilgilerinin alınması.
  2. Form gönderiminde kullanıcı tarafından gönderilen bilgiler doğrulanıyor.
  3. Doğrulamadan sonra kayıtlı kullanıcıyı veritabanına kaydetmek için veritabanı işleme.

Üçüncü adım, kullanıcının eklenmemiş olduğundan emin olduktan sonra yürütülecektir. Bu veri benzersizliği doğrulaması, girdikleri e-posta ve kullanıcı adına göre yapılacaktır.

Kayıt sırasında genellikle uygulamamıza kaydolmaya hazır olan kullanıcı bilgilerini topluyoruz. Bazıları zorunlu olacak ve bazıları isteğe bağlı olacak.

Bu nedenle, bu işlevsellik, kullanıcı verilerinin boş olmaması ve biçimi hakkında emin olmak için doğrulama bölümünü de içerebilir. Doğrulama, istemci tarafında veya sunucu tarafında yapılabilir.

Sunucu tarafında doğrulamaya sahip olmak her zaman daha iyidir. Kullanıcıların kullanım kolaylığı için istemci tarafında da olmasını seçebilirsiniz. Ancak sunucu tarafında bulunması isteğe bağlı değildir ve minimum gereksinimdir.

dosya yapısı

Kullanıcının kaydolmasına izin veren HTML formu

Bu örnekte, kayıt formu Kullanıcı Adı, Ad(Görünen Ad), Parola ve E-posta alanlarını içerir. Ayrıca, kullanıcının onay için parolasını yeniden girmesine izin veren Parolayı Onayla alanına da sahiptir. Bu iki parola daha sonra bir .

Bu formu göndererek, kullanıcının hüküm ve koşulları kabul etmesi beklenir. Bu nedenle, bunu sağlamak için Kayıt düğmesinin önüne bir onay kutusu alanı eklenir.

PHP Kullanıcı Kayıt Formu

üye olmak
"; } ?>
">
">
">
şartlar ve koşulları kabul ediyorum

Ve stiller

Gövde ( font-family: Arial; color: #333; font-size: 0.95em; ) .form-head ( color: #191919; font-weight: normal; font-weight: 400; margin: 0; text-align : merkez; yazı tipi boyutu: 1,8em; ) .error-message ( dolgu: 7px 10px; arka plan: #fff1f2; kenarlık: #ffd5da 1px katı; renk: #d6001c; sınır yarıçapı: 4px; kenar boşluğu: 30px 0px 10px 0px ; ) .success-message ( padding: 7px 10px; background: #cae0c4; border: #c3d0b5 1px solid; color: #027506; border-radius: 4px; margin: 30px 0px 10px 0px; ) .demo-table ( background: #ffffff; kenar boşluğu: başlangıç; kenar boşluğu: 15 piksel otomatik; kelime sonu: kelime sonu; tablo düzeni: otomatik; satır yüksekliği: 1,8em; renk: #333; sınır yarıçapı: 4 piksel; dolgu: 20 piksel 40 piksel ;width: 380px;border: 1px solid;border-color: #e5e6e9 #dfe0e4 #d0d1d5; ) .demo-table .label ( color: #888888; ) .demo-table .field-column ( padding: 15px 0px; ) .demo-input-box ( dolgu: 13px; kenarlık: #CCC 1px katı; kenarlık yarıçapı: 4px; genişlik: %100; ) .btnRegister ( dolgu: 13px; arka plan rengi: #5d9cec; renk: #f5f7fa; imleç: işaretçi; sınır yarıçapı: 4px genişlik: %100 kenarlık: #5791da 1 piksel katı; yazı tipi boyutu: 1.1em ) .response-text ( max-width: 380px; font-size: 1.5em; text-align: center; background: #fff3de; padding: 42px; border-radius: 3px; border: #f5e9d4 1px solid; font-family : arial; satır yüksekliği: 34 piksel; kenar boşluğu: 15 piksel otomatik; ) .terms ( kenar boşluğu: 5 piksel; )

Form gönderiminde kullanıcı bilgileri nasıl doğrulanır?

Kullanıcı kayıt verilerini doğrulamak için bu örneğe bir sunucu tarafı form doğrulama komut dosyası eklenir. Bu PHP doğrulama komut dosyası, kayıt formu gönderilirken çağrılacaktır.

Bu komut dosyası, her alanın boş olmadığını kontrol etmek için tüm form alanlarını doğrular. Ardından PHP'nin filter_var() işlevini kullanarak kullanıcı e-posta biçimini doğrular.

Kayıt bir şifre doğrulama özelliği içerdiğinden, şifre karşılaştırması bu örneğin bu bölümünde yapılacaktır.

Son olarak, doğrulama komut dosyası, formdaki uygun kutuyu işaretleyerek kullanıcının şart ve koşulu kabul edip etmediğini kontrol edecektir.

Boole değeri true olarak döndürülerek tüm doğrulama tamamlandıktan sonra gerçek kayıt işlemi gerçekleşir.

validMember() işlevi ( $valid = true; $errorMessage = array(); foreach ($_POST as $key => $value) ( ​​if (empty($_POST[$key])) ( $valid = false; ) ) if($valid == true) ( ​​if ($_POST["password"] != $_POST["confirm_password"]) ( $errorMessage = "Parolalar aynı olmalıdır."; $valid = false; ) if (! isset ($error_message)) ( if (! filter_var($_POST["userEmail"], FILTER_VALIDATE_EMAIL)) ( $errorMessage = "Geçersiz e-posta adresi."; $valid = false; ) ) if (! isset($) error_message)) ( if (! isset($_POST["terms"])) ( $errorMessage = "Şartları ve koşulları kabul et."; $valid = false; ) ) ) else ( $errorMessage = "Tüm alanlar zorunludur." ; ) if ( $geçerli == yanlış) ( dönüş $hataMessage; ) dönüş; )

Kayıtlı kullanıcıyı kaydetmek için veritabanına erişmek için PHP MySQL kodu

Sunucu tarafı kullanıcı formu doğrulaması

Bu, formu doğrulamak için tüm sunucu tarafı komut dosyasını işlemek ve doğrulama sonucuna göre veritabanı işlemlerini yürütmek için PHP giriş noktasıdır.

valideMember($username, $displayName, $password, $email); if (empty($errorMessage)) ( $memberCount = $member->isMemberExists($username, $email); if ($memberCount == 0) ( $insertId = $member->insertMemberRecord($username, $displayName, $ şifre, $email); if (! empty($insertId)) ( header("Konum: teşekkür ederim.php"); ) ) else ( $errorMessage = "Kullanıcı zaten var."; ) ) ) ?>

Kullanıcının zaten var olup olmadığını kontrol edin

isMemberExists() işlevi, e-postalarına ve kullanıcı adına göre kullanıcı verilerinin benzersizliğini kontrol etmek için kullanılır. Girilen kullanıcı adı veya e-posta, kullanıcı veritabanında mevcutsa, geri dönüş ve onay ile kayıt işlemi durdurulur.

Bu onay, "kullanıcının zaten var olduğunu" bildirecektir. kod,

function isMemberExists($kullaniciadi, $email) ( $query = "seç * kayitli_kullanicilardan NEREDE kullanici_adi = ? VEYA e-posta =?"; $paramType = "ss"; $paramArray = dizi($kullaniciadi, $email); $memberCount = $this->ds->numRows($query, $paramType, $paramArray); dönüş $memberCount; )

Üye verilerini veritabanına ekle

0 döndürürse, girilen e-posta veya kullanıcı adıyla böyle bir kullanıcı olmadığı anlamına gelir. Ve böylece, kayıt verileri veritabanına eklenecektir. Aşağıdaki kod, üye ekleme yöntemini gösterir.

function insertMemberRecord($username, $displayName, $password, $email) ( $passwordHash = md5($password); $query = "INSERT INTO kayıtlı_users (user_name, display_name, password, email) DEĞERLER (?, ?, ?, ? )"; $paramType = "ssss"; $paramArray = array($username, $displayName, $passwordHash, $email); $insertId = $this->ds->insert($query, $paramType, $paramArray); $insertId'i döndür; )

DataSource.php

Bu, veritabanı işlemlerini gerçekleştirmek için PHP'deki genel veri kaynağı sınıfıdır. Veritabanını bağlamak ve veritabanı sonucu, satır sayısı, yürütme eki ve daha fazlasını almak için çeşitli sorguları yürütmek için işlevler içerir.

Bu veri kaynağı sınıfı geneldir ve olabildiğince basit tutulur. Verimli ve mikro projelerimin ve eğitimlerimin çoğunda kullanıyorum. İndirip kullanmakta özgürsünüz.

önemli olan şey Hazırlanan Tabloları kullanmayı asla unutmayın. SQL enjeksiyon saldırılarından korunmanıza yardımcı olur ve bir web uygulamasında güvenliğin uygulanması açısından ilk adımdır.

conn = $this->getConnection(); ) /** * Bağlantı nesnesi gerekiyorsa bu yöntemi kullanın ve ona erişin. * Aksi takdirde, eklemek / güncellemek / vb. için aşağıdaki yöntemleri kullanın. * * @return \mysqli */ public function getConnection() ( $conn = new \mysqli(self::HOST, self::USERNAME, self::PASSWORD, self::DATABASENAME); if (mysqli_connect_errno()) ( trigger_error ("Veritabanına bağlanma sorunu."); ) $conn->set_charset("utf8"); return $conn; ) /** * Veritabanı sonuçlarını almak için * @param string $query * @param string $paramType * @ param dizisi $paramArray * @return dizisi */ public function select($query, $paramType="", $paramArray=array()) ( $stmt = $this->conn->prepare($query); if(! empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($sql, $paramType, $paramArray); ) $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) ( while ($row = $result->fetch_assoc()) ( $resultset = $row; ) ) if (! empty($resultset)) ( return $resultset; ) ) / ** * Eklemek için * @param string $query * @param string $paramType * @param array $paramArray * @return int */ public function insert($query, $paramType, $p aramArray) ( $sorgu yazdır; $stmt = $this->conn->prepare($query); $this->bindQueryParams($stmt, $paramType, $paramArray); $stmt->execute(); $insertId = $stmt->insert_id; $insertId'yi döndür; ) /** * Sorguyu yürütmek için * @param string $query * @param string $paramType * @param dizisi $paramArray */ public functionexecut($query, $paramType="", $paramArray=array()) ( $ stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType="", $paramArray= array()); ) $stmt->execute(); ) /** * 1. Parametre bağlamayı hazırlar * 2. Parametreleri sql deyimine bağlar * @param string $stmt * @param string $paramType * @param array $ paramArray */ public function bindQueryParams($stmt, $paramType, $paramArray=array()) ( $paramValueReference = & $paramType; for ($i = 0; $i)< count($paramArray); $i ++) { $paramValueReference = & $paramArray[$i]; } call_user_func_array(array($stmt, "bind_param"), $paramValueReference); } /** * To get database results * @param string $query * @param string $paramType * @param array $paramArray * @return array */ public function numRows($query, $paramType="", $paramArray=array()) { $stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType, $paramArray); ) $stmt->execute(); $stmt->store_result(); $recordCount = $stmt->sayi_sayi; $recordCount'u döndür; ) )

Veritabanı betiği

Bu veritabanı komut dosyası, register_users tablosu için create deyimine sahiptir. Bu kodu çalıştırmak için bu betiği geliştirme ortamınıza aktarın.

`registered_users` tablosu için tablo yapısı -- `registered_users` DEĞİLSE TABLO OLUŞTURUN (`id` int(8) NOT NULL AUTO_INCREMENT, `user_name` varchar(255) NOT NULL, `first_name` varchar(255) NOT NULL, ` last_name` varchar(255) NULL DEĞİL, "şifre" varchar(25) NULL DEĞİL, "email" varchar(55) NULL DEĞİL, "cinsiyet" varchar(20) NULL DEĞİL, BİRİNCİL ANAHTAR ("id"));

Kayıt formu doğrulaması başarısız olursa, kullanıcıya aşağıdaki gibi hata mesajı gösterilecektir.

"MySQL Veritabanı ile PHP Kullanıcı Kayıt Formu (Kaydolun)" için yorumlar

    Merhaba Vincy, kayıt kodunu çalıştırırken aşağıdaki hataları alıyorum, lütfen yardım edin.

    INSERT INTO kayıtlı_kullanıcılar (kullanıcı_adı, görünen_adı, parola, e-posta) DEĞERLER (?, ?, ?, ?)
    Uyarı: call_user_func_array(), parametre 1'in geçerli bir geri arama olmasını bekliyor, ilk dizi üyesi, satır 136'da C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php'de geçerli bir sınıf adı veya nesne değil

    Önemli hata: Yakalanmayan Hata: C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php:99'da boolean üzerinde bir üye işlevine çağrı yürütme() işlevi Yığın izleme: #0 C:\xampp\htdocs\PHP\JAMII -CASH\Member.php(83): Phppot\DataSource->insert('INSERT INTO reg…', 'ssss', Array) #1 C:\xampp\htdocs\PHP\JAMII-CASH\index.php(20) ): Phppot\Member->insertMemberRecord('chuki10', 'Ray', '202020', ' [e-posta korumalı]…') #2 (ana) satır 99'da C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php içinde atılır