Membuat Sistem Pendaftaran Dengan PHP Dan Mysql – Menulis sistem pendaftaran adalah pekerjaan yang berat. Anda harus menulis kode untuk memverifikasi alamat email, mengirim email konfirmasi, menyediakan fungsi kata sandi yang terlupa, menyimpan kata sandi dengan aman, memverifikasi formulir masukan, dan banyak lagi. Sekalipun sudah menyelesaikan semua operasi tersebut, pengguna masih enggan mendaftar karena juga membutuhkan banyak tenaga.

Membuat Sistem Pendaftaran Dengan PHP Dan Mysql
Source : surabaya.proxsisgroup

Dalam tutorial ini, javascriptoo akan membuat sistem registrasi yang sangat sederhana yang tidak memerlukan atau perlu menyimpan kata sandi sama sekali! Hasilnya akan mudah dimodifikasi dan disematkan ke dalam situs web PHP yang sudah ada. Teruskan membaca untuk memahami cara kerjanya.

Beginilah cara kerja sistem pendaftaran super sederhana kami:

  • Akan ada formulir login / registrasi gabungan di mana pengguna dapat mengisi email dan mengklik kirim;
  • Setelah pengiriman, jika alamat email tidak ditemukan di database, catatan pengguna baru akan dibuat. Buat token acak dan kirimkan ke pengguna sebagai tautan yang dapat diklik melalui email, tautan tersebut hanya berlaku selama 10 menit;
  • Mengklik link di kotak masuk mereka akan mengarahkan mereka ke situs web kami. Sistem akan mendeteksi keberadaan token dan masuk ke orang tersebut.

Inilah keuntungan dari metode ini:

  • Tidak perlu menyimpan dan memverifikasi kata sandi;
  • Tidak perlu fungsi pemulihan kata sandi, pertanyaan rahasia, dll.;
  • Anda dapat yakin bahwa mereka dapat menghubungi orang tersebut melalui alamat email yang diberikan sejak pertama kali mereka masuk;
  • Proses pendaftarannya sangat sederhana dan sangat menarik.

Kerugiannya adalah sebagai berikut:

  • Ini seaman akun email pengguna. Jika seseorang dapat mengakses email orang itu, mereka dapat masuk. Ini adalah kasus untuk fungsi kata sandi yang terlupa, tetapi itu perlu dipertimbangkan.
  • Email tidak aman dan dapat diblokir. Ingat, hal yang sama berlaku untuk fungsi apa pun yang lupa kata sandi atau sistem login biasa yang tidak menggunakan HTTPS untuk mengirimkan informasi nama pengguna / kata sandi.
  • Kecuali Anda meluangkan waktu untuk mengkonfigurasi email keluar dengan benar, email dengan link login dapat masuk ke kotak spam.

Mengingat kelebihan / kekurangan di atas, sistem login kami sangat berguna, tetapi tidak terlalu tinggi dalam hal keamanan, jadi sebaiknya Anda hanya menggunakannya untuk pendaftaran forum, keanggotaan situs web, dan layanan yang tidak menangani informasi sensitif.

Baca Juga : 20 PHP Libraries Terbaik Di Awal 2021

Gunakan Sistem Registrasi

Jika Anda hanya ingin menggunakan sistem login di situs dan tidak ingin mengikuti tutorial ini, Anda perlu melakukan hal berikut:

  • Pertama, Anda perlu mengunduh file zip di atas;
  • Di file terkompresi, temukan tables.sql. Gunakan opsi impor phpMyAdmin untuk mengimpornya ke database. Atau, Anda dapat membuka file di editor teks, menyalin SQL, dan menjalankannya.
  • Buka include / main.php dan isi detail koneksi database Anda dan kombinasi username / password. Dalam file yang sama, email juga harus ditambahkan, yang akan digunakan sebagai alamat asli untuk pesan yang dikirim oleh sistem. Beberapa host web akan memblokir email keluar kecuali email tersebut berasal dari alamat email asli yang dibuat di panel kontrol mereka, jadi harap masukkan alamat asli di dalamnya;
  • Unggah semua file melalui FTP atau metode lain;
  • Tambahkan kode ini ke setiap halaman PHP yang ingin Anda gunakan hanya setelah masuk;
  • Selamat bersenang-senang!

Bagi orang lain yang ingin memahami cara kerja sistem login, silakan lanjutkan membaca!

HTML

Langkah pertama adalah menulis HTML untuk form login. Kode HTML berikut terletak di index.php. File ini juga berisi kode PHP untuk menangani pengiriman formulir dan fungsi berguna lainnya dari sistem login. Anda akan mempelajari lebih lanjut tentang ini di bagian PHP.

index.php

<!DOCTYPE html>
<html>

<head>
<meta charset=“utf-8”/>
<title>Tutorial: Super Simple Registration System With PHP &amp; MySQL</title>

<!– The main CSS file –>
<link href=“assets/css/style.css” rel=“stylesheet” />

<!–[if lt IE 9]>
<scripts src=”http://html5shiv.googlecodes.com/svn/trunks/html5.js”></script>
<![endif]–>

</head>

<body>

<form id=“login-register” method=“post” action=“index.php”>

<h1>Login or Register</h1>

<input type=“text” placeholder=“your@email.com” name=“email” autofocus />
<p>Enter your email address above and we will send <br />you a login link.</p>

<button type=“submit”>Login / Register</button>

<span></span>

</form>

<!– JavaScript Includes –>
<script src=“http://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js”></script>
<script src=“assets/js/script.js”></script>

</body>
</html>

Di bagian header, saya menyertakan style sheet utama (tidak disediakan dalam tutorial ini, jadi Anda harus membukanya di editor kode untuk melihatnya). Sebelum menutup tag body, saya menyertakan library jQuery dan file script.js, yang akan kita tulis di bagian selanjutnya.

login_form
Source : tutorialzine

Sekarang mari kita menulis beberapa jQuery!

The JavaScript

jQuery mendengarkan event Submit di formulir, memanggil e.preventDefault() di formulir, dan kemudian mengirim permintaan AJAX. Berdasarkan respon server, itu akan menampilkan pesan dan memblokir pengiriman lebih lanjut.

assets/js/script.js

$(function(){

    var form = $('#login-register');

    form.on('submit', function(e){

        if(form.is('.loading, .loggedIn')){
            return false;
        }

        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('loading');
    });

    $(document).ajaxComplete(function(){
        form.removeClass('loading');
    });
});

Pada awal permintaan AJAX, kelas CSS .loading akan ditambahkan ke formulir (fitur ini dapat dicapai melalui metode ajaxStart() dan ajaxComplete() yang terlihat di akhir file). Kelas CSS ini menampilkan indikator gif yang berputar dan juga berfungsi sebagai bendera untuk mencegah pengiriman duplikat (mengirimkan formulir saat permintaan menunggu keputusan). Kelas .loggedIn adalah tanda lain yang disetel setelah mengirim email. Ini akan secara permanen memblokir semua pengiriman formulir lebih lanjut.

Baca Juga : Belajar JavaScript Async/Await Dalam 10 Menit

Database Schema

Sistem registrasi sederhana kami menggunakan dua tabel MySQL (Anda dapat menemukan kode SQL di table.sql di zip yang dapat diunduh). Tabel pertama menampung akun pengguna, dan tabel kedua menampung upaya login.

reg_users_schema

Sistem tidak menggunakan kata sandi, yang tercermin dari tidak adanya bidang kata sandi pada arsitektur. Ada kolom token dengan kolom token_validity. Setel token ketika pengguna masuk ke sistem dan mengirimkannya ke pengguna melalui email (lebih lanjut tentang itu di bagian selanjutnya). Kemudian setel token_validity menjadi 10 menit di masa mendatang, setelah itu token menjadi tidak valid.

Setiap kali seseorang mencoba masuk, rekor baru ditulis ke tabel kedua. Seperti yang akan Anda lihat di kode PHP kami, karena alasan ini, kami dapat menerapkan pembatasan laju berdasarkan alamat IP. Batasannya adalah 10 upaya masuk setiap 10 menit dan 20 upaya masuk per jam. Melebihi batas ini akan menyebabkan alamat IP diblokir sampai batas ini terpenuhi.

Di kedua tabel, gunakan fungsi PHP ip2long untuk menyimpan alamat IP sebagai integer.

PHP

Sekarang kita siap untuk menulis beberapa kode PHP. Fungsi utama dari sistem registrasi disediakan oleh kelas User, yang dapat Anda lihat di bawah. Kelas ini banyak menggunakan Itorm (docs), yang merupakan pustaka terkecil untuk memproses database yang kita gunakan dalam tutorial. Kelas User menangani akses database, pembuatan token login, dan verifikasi. Ini memperlihatkan antarmuka sederhana untuk dengan mudah memasukkan sistem pendaftaran ke situs web Anda yang digerakkan oleh PHP.

Users.class.php

class Users{

    // Privates ORM instance
    private $orm;

    /**
     * Find a user by a token string. Only valid tokens are taken into
     * consideration. A token is valid for 10 minutes after it has been generated.
     * @param string $token The token to search for
     * @return User
     */

    public static function findByToken($token){

        // find it in the database and make sure the timestamp is correct

        $result = ORM::for_tables('regs_users')
                        ->where('token', $token)
                        ->where_raws('token_validity > NOW()')
                        ->find_one();

        if(!$result){
            return false;
        }

        return new User($result);
    }

    /**
     * Either login or register a user.
     * @param string $email The user's email address
     * @return User
     */

    public static function loginOrRegister($email){

        // If such a user already exists, return it

        if(User::exists($email)){
            return new User($email);
        }

        // Otherwise, create it and return it

        return User::create($email);
    }

    /**
     * Create a new user and save it to the database
     * @param string $email The user's email address
     * @return User
     */

    private static function create($email){

        // Write a new user to the database and return it

        $result = ORM::for_table('reg_users')->create();
        $result->email = $email;
        $result->save();

        return new User($result);
    }

    /**
     * Check whether such a user exists in the database and return a boolean.
     * @param string $email The user's email address
     * @return boolean
     */

    public static function exists($email){

        // Does the user exist in the database?
        $result = ORM::for_table('reg_users')
                    ->where('email', $email)
                    ->count();

        return $result == 1;
    }

    /**
     * Create a new user object
     * @param $param ORM instance, id, email or null
     * @return User
     */

    public function __construct($param = null){

        if($param instanceof ORM){

            // An ORM instance was passed
            $this->orm = $param;
        }
        else if(is_string($param)){

            // An email was passed
            $this->orm = ORM::for_table('reg_users')
                            ->where('email', $param)
                            ->find_one();
        }
        else{

            $id = 0;

            if(is_numeric($param)){
                // A user id was passed as a parameter
                $id = $param;
            }
            else if(isset($_SESSION['loginid'])){

                // No user ID was passed, look into the sesion
                $id = $_SESSION['loginid'];
            }

            $this->orm = ORM::for_table('reg_users')
                            ->where('id', $id)
                            ->find_one();
        }

    }

    /**
     * Generates a new SHA1 login token, writes it to the database and returns it.
     * @return string
     */

    public function generateToken(){
        // generate a token for the logged in user. Save it to the database.

        $token = sha1($this->email.time().rand(0, 1000000));

        // Save the token to the database, 
        // and mark it as valid for the next 10 minutes only

        $this->orm->set('token', $token);
        $this->orm->set_expr('token_validity', "ADDTIME(NOW(),'0:10')");
        $this->orm->save();

        return $token;
    }

    /**
     * Login this user
     * @return void
     */

    public function login(){

        // Mark the user as logged in
        $_SESSION['loginid'] = $this->orm->id;

        // Update the last_login db field
        $this->orm->set_expr('last_login', 'NOW()');
        $this->orm->save();
    }

    /**
     * Destroy the session and logout the user.
     * @return void
     */

    public function logout(){
        $_SESSION = array();
        unset($_SESSION);
    }

    /**
     * Check whether the user is logged in.
     * @return boolean
     */

    public function loggedIn(){
        return isset($this->orm->id) && $_SESSION['loginid'] == $this->orm->id;
    }

    /**
     * Check whether the user is an administrator
     * @return boolean
     */

    public function isAdmin(){
        return $this->rank() == 'administrator';
    }

    /**
     * Find the type of user. It can be either admin or regular.
     * @return string
     */

    public function rank(){
        if($this->orm->rank == 1){
            return 'administrator';
        }

        return 'regular';
    }

    /**
     * Magic method for accessing the elements of the private
     * $orm instance as properties of the user object
     * @param string $key The accessed property's name 
     * @return mixed
     */

    public function __get($key){
        if(isset($this->orm->$key)){
            return $this->orm->$key;
        }

        return null;
    }
}

Token dibuat menggunakan algoritma SHA1 dan disimpan di database. Saya menggunakan fungsi tanggal dan waktu MySQL untuk mengatur nilai kolom token_validity menjadi 10 menit di masa mendatang. Saat memvalidasi token, kami secara eksplisit memberi tahu mesin bahwa kami sedang mencari token, dan bidang token_validity belum kedaluwarsa. Dengan cara ini, kami dapat membatasi waktu selama token login dianggap valid.

Baca Juga : 5 Teknologi Flexbox Yang Perlu Anda Ketahui

Perhatikan bahwa saya menggunakan metode ajaib __get (docs) di dekat akhir file untuk menangkap akses atribut ke objek pengguna. Dengan cara ini, data yang disimpan dalam database dapat diakses sebagai atribut: $ user-> email, $ user-> token, dll. Contoh cara menggunakan kelas ini di cuplikan kode berikut.

File lain yang berisi fungsi berguna adalah functions.php. Di sana, kami memiliki banyak fungsi pembantu yang dapat membuat kode lainnya lebih jelas.

functions.php

function send_email($from, $to, $subject, $message){

    // Helper function for sending email

    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/plain; charset=utf-8' . "\r\n";
    $headers .= 'From: '.$from . "\r\n";

    return mail($to, $subject, $message, $headers);
}

function get_page_url(){

    // Find out the URL of a PHP file

    $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){

    // The number of login attempts for the last hour by this IP address

    $count_hour = ORM::for_table('reg_login_attempt')
                    ->where('ip', sprintf("%u", ip2long($ip)))
                    ->where_raw("ts > SUBTIME(NOW(),'1:00')")
                    ->count();

    // The number of login attempts for the last 10 minutes by this IP address

    $count_10_min =  ORM::for_table('reg_login_attempt')
                    ->where('ip', sprintf("%u", ip2long($ip)))
                    ->where_raw("ts > SUBTIME(NOW(),'0:10')")
                    ->count();

    if($count_hour > $limit_hour || $count_10_min > $limit_10_min){
        throw new Exception('Too many login attempts!');
    }
}

function rate_limit_tick($ip, $email){

    // Create a new record in the login attempt table

    $login_attempt = ORM::for_table('reg_login_attempt')->create();

    $login_attempt->email = $email;
    $login_attempt->ip = sprintf("%u", ip2long($ip));

    $login_attempt->save();
}

function redirect($url){
    header("Location: $url");
    exit;
}

rate_limit dan rate_limit_tick (jumlah upaya login maksimum dalam periode waktu tertentu). Upaya login akan ditulis ke database reg_login_attempt. Seperti yang Anda lihat dari potongan berikutnya, fungsi-fungsi ini akan dipanggil saat memproses pengiriman formulir login.

Kode di bawah ini berasal dari index.php, yang menangani pengiriman formulir login. Ini mengembalikan respons JSON, yang diproses oleh kode jQuery yang kita lihat di assets/js/script.js.

index.php

try{

    if(!empty($_POST) && isset($_SERVER['HTTP_X_REQUESTED_WITH'])){

        // Output a JSON header

        header('Content-type: application/json');

        // Is the email address valid?

        if(!isset($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
            throw new Exception('Please enter a valid email.');
        }

        // This will throw an exception if the person is above 
        // the allowed login attempt limits (see functions.php for more):
        rate_limit($_SERVER['REMOTE_ADDR']);

        // Record this login attempt
        rate_limit_tick($_SERVER['REMOTE_ADDR'], $_POST['email']);

        // Send the message to the user

        $message = '';
        $email = $_POST['email'];
        $subject = 'Your Login Link';

        if(!User::exists($email)){
            $subject = "Thank You For Registering!";
            $message = "Thank you for registering at our site!\n\n";
        }

        // Attempt to login or register the person
        $user = User::loginOrRegister($_POST['email']);

        $message.= "You can login from this URL:\n";
        $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

        $message.= "The link is going expire automatically after 10 minutes.";

        $result = send_email($fromEmail, $_POST['email'], $subject, $message);

        if(!$result){
            throw new Exception("There was an error sending your email. Please try again.");
        }

        die(json_encode(array(
            'message' => 'Thank you! We\'ve sent a link to your inbox. Check your spam folder as well.'
        )));
    }
}
catch(Exception $e){

    die(json_encode(array(
        'error'=>1,
        'message' => $e->getMessage()
    )));
}

Setelah berhasil login atau registrasi, kode diatas akan mengirimkan email ke orang yang memiliki link login. Token tersedia sebagai variabel tkn $ _GET di URL yang dihasilkan.

Mengunjungi tautan masuk akan memicu kode berikut:

index.php

if(isset($_GET['tkn'])){

    // Is this a valid login token?
    $user = User::findByToken($_GET['tkn']);

    if($user){

        // Yes! Login the user and redirect to the protected page.

        $user->login();
        redirect('protected.php');
    }

    // Invalid token. Redirect back to the login form.
    redirect('index.php');
}

Memanggil $user->login() akan membuat variabel sesi yang diperlukan sehingga tampilan selanjutnya dari setiap halaman situs akan membuat orang tersebut tetap login.

Cara untuk keluar dari sistem serupa:

index.php

if(isset($_GET['logout'])){

    $user = new User();

    if($user->loggedIn()){
        $user->logout();
    }

    redirect('index.php');
}

Di akhir kode, saya dialihkan ke index.php lagi untuk menghapus? Di URL? Keluar = 1 parameter.

Baca Juga : 10 Tools Dan Perangkat Lunak Online DDoS Attack Terbaik

File index.php kami membutuhkan perlindungan lain-kami tidak ingin orang yang sudah masuk melihat formulir. Untuk ini, kita akan menggunakan metode $user->loggedIn() :

index.php

$user = new User();

if($user->loggedIn()){
    redirect('protected.php');
}

Terakhir, berikut adalah cara melindungi halaman situs Anda dan membuatnya tersedia hanya setelah login:

protected.php

// To protect any php page on your site, include main.php
// and create a new User object. It's that simple!

require_once 'includes/main.php';

$user = new User();

if(!$user->loggedIn()){
    redirect('index.php');
}

Setelah menyelesaikan pemeriksaan ini, Anda dapat memastikan bahwa pengguna telah berhasil masuk. Anda juga dapat mengakses data yang disimpan dalam database sebagai atribut dari objek $ user. Untuk mengeluarkan email pengguna dan peringkatnya, gunakan kode berikut:

echo 'Your email: '.$user->email;
echo 'Your rank: '.$user->rank();

rank() adalah metode di sini, karena kolom peringkat dalam database biasanya berisi angka (0 untuk pengguna biasa dan 1 untuk administrator), kita perlu mengubahnya menjadi nama peringkat, yang dilakukan dengan metode ini. Untuk mengubah pengguna biasa menjadi administrator, cukup edit catatannya dari phpMyAdmin (atau program manajemen basis data pilihan Anda). Menjadi administrator tidak akan memberinya laporan khusus fungsi lainnya. Ini ditentukan oleh kode untuk memberi administrator kekuasaan khusus.

We’re Done!

Dengan ini, sistem pendaftaran super sederhana kami selesai! Anda dapat dengan mudah menggunakannya di situs web PHP yang sudah ada dan memodifikasinya sesuka Anda.