آموزش رایگان PHP

آموزش گام به گام ساخت سیستم لاگین و لاگ‌اوت در PHP به صورت ایمن

1405/05/14 22:13 محراب حسن زاده
آموزش گام به گام ساخت سیستم لاگین و لاگ‌اوت در PHP به صورت ایمن

مقدمه؛ چرا امنیت در سیستم لاگین اهمیت دارد؟

سیستم ورود و خروج کاربران، دروازه اصلی ورود به بخش‌های حساس وب‌سایت شماست. پیاده‌سازی غیراصولی این سیستم می‌تواند وب‌سایت و اطلاعات کاربران شما را در معرض خطر قرار دهد. بر اساس استانداردهای گوگل و اصول نوین امنیت وب، رمزهای عبور هرگز نباید به صورت متنی (Plain Text) ذخیره شوند؛ همچنین ورودی‌های کاربر باید همواره فیلتر و اعتبارسنجی شوند تا جلوی حملاتی مثل SQL Injection گرفته شود.

گام اول: ساخت پایگاه داده برای کاربران

ابتدا باید یک جدول برای ذخیره اطلاعات کاربران در دیتابیس MySQL ایجاد کنیم. فیلد مربوط به پسورد را با طول مناسب (مثلاً ۲۵۵ کاراکتر) در نظر می‌گیریم تا پاسخگوی الگوریتم‌های قوی هش باشد.


CREATE DATABASE IF NOT EXISTS secure_db;
USE secure_db;

CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

گام دوم: اتصال به دیتابیس با PDO

استفاده از PDO در PHP به دلیل پشتیبانی از Prepared Statements امن‌ترین راه برای تعامل با پایگاه داده است. فایلی به نام config.php می‌سازیم:



define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'secure_db');

try {
    $pdo = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USERNAME, DB_PASSWORD);
    $pdo--->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("خطا در اتصال به پایگاه داده: " . $e->getMessage());
}

گام سوم: طراحی فرم ورود به زبان HTML

در این بخش فرمی ساده و شکیل برای دریافت نام کاربری و رمز عبور طراحی می‌کنیم.


< div class="login-container" >
    < h2 >ورود به حساب کاربری< /h2 >
    < form action="login.php" method="post" >
        < div class="form-group" >
            < label >نام کاربری< /label >
            < input type="text" name="username" required >
        < /div >
        < div class="form-group" >
            < label >رمز عبور< /label >
            < input type="password" name="password" required >
        < /div >
        < button type="submit" >ورود< /button >
    < /form >
< /div >

گام چهارم: پردازش اطلاعات و احراز هویت در PHP

حالا بخش اصلی یعنی بررسی اطلاعات ارسالی از فرم، مقایسه هش رمز عبور با استفاده از تابع password_verify و مدیریت نشست (Session) را پیاده‌سازی می‌کنیم:



session_start();
require_once "config.php";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = trim($_POST["username"]);
    $password = trim($_POST["password"]);

    if (!empty($username) && !empty($password)) {
        $sql = "SELECT id, username, password FROM users WHERE username = :username";
        if ($stmt = $pdo--->prepare($sql)) {
            $stmt->bindParam(":username", $param_username, PDO::PARAM_STR);
            $param_username = $username;
            
            if ($stmt->execute()) {
                if ($stmt->rowCount() == 1) {
                    if ($row = $stmt->fetch()) {
                        $id = $row["id"];
                        $username = $row["username"];
                        $hashed_password = $row["password"];
                        
                        if (password_verify($password, $hashed_password)) {
                            // احراز هویت با موفقیت انجام شد؛ سشن‌ها مقداردهی می‌شوند
                            session_regenerate_id();
                            $_SESSION["loggedin"] = true;
                            $_SESSION["id"] = $id;
                            $_SESSION["username"] = $username;
                            
                            header("location: dashboard.php");
                            exit;
                        } else {
                            echo "رمز عبور وارد شده صحیح نیست.";
                        }
                    }
                } else {
                    echo "کاربری با این نام کاربری یافت نشد.";
                }
            } else {
                echo "مشکلی در پردازش پیش آمد. دوباره تلاش کنید.";
            }
            unset($stmt);
        }
    }
    unset($pdo);
}

گام پنجم: ایجاد پنل کاربری ایمن (dashboard.php)

بخش داشبورد باید طوری طراحی شود که فقط کاربران وارد شده به آن دسترسی داشته باشند. در غیر این صورت، کاربر به صفحه لاگین هدایت می‌شود:



session_start();

if (!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true) {
    header("location: login.php");
    exit;


< h1 >خوش آمدید، < /h1 >
< p >این یک پنل کاربری امن در PHP است.< /p >
< a href="logout.php" >خروج از حساب کاربری< /a >

گام ششم: ساخت فرآیند خروج ایمن (logout.php)

برای خارج کردن کاربر، باید تمام داده‌های سشن را پاک کرده و در نهایت سشن را به طور کامل تخریب (Destroy) کنیم:



session_start();

// خالی کردن آرایه سشن
$_SESSION = array();

// تخریب کوکی سشن در صورت وجود
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// تخریب سشن
session_destroy();

// انتقال کاربر به صفحه لاگین
header("location: login.php");
exit;

نکات امنیتی نهایی بر اساس استانداردهای گوگل

  • استفاده از HTTPS: همیشه سیستم لاگین خود را روی بستر امن HTTPS اجرا کنید تا اطلاعات کاربران در حین انتقال رمزنگاری شوند.
  • فعال‌سازی HttpOnly: کوکی‌های سشن را به صورت HttpOnly تنظیم کنید تا از طریق اسکریپت‌های مخرب جاوااسکریپت (حملات XSS) قابل سرقت نباشند.
  • استفاده از session_regenerate_id: پس از ورود موفق، شناسه سشن را تغییر دهید تا از حملات Session Fixation جلوگیری شود.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آموزش ایجاد یک پروژه ساده React: شروع کار و ساختاردهی کامپوننت‌ها
1402/06/28 23:04

آموزش ایجاد یک پروژه ساده React: شروع کار و ساختاردهی کامپوننت‌ها

مطالعه بیشتر
آموزش استفاده از position در CSS: نحوه موقعیت‌دهی عناصر در صفحات وب
1403/08/09 20:59

آموزش استفاده از position در CSS: نحوه موقعیت‌دهی عناصر در صفحات وب

مطالعه بیشتر
معرفی MySQL و phpMyAdmin: راهنمای جامع مدیریت پایگاه داده برای توسعه‌دهندگان وب
1405/05/04 23:32

معرفی MySQL و phpMyAdmin: راهنمای جامع مدیریت پایگاه داده برای توسعه‌دهندگان وب

مطالعه بیشتر
آموزش جامع پارامترها و مقادیر بازگشتی در PHP (بر اساس استانداردهای مدرن)
1405/04/16 01:14

آموزش جامع پارامترها و مقادیر بازگشتی در PHP (بر اساس استانداردهای مدرن)

مطالعه بیشتر
استفاده از Flexbox در CSS برای چیدمان‌های مدرن: راهنمای جامع و کاربردی
1403/08/10 21:59

استفاده از Flexbox در CSS برای چیدمان‌های مدرن: راهنمای جامع و کاربردی

مطالعه بیشتر
آشنایی با Emit در Vue.js | انتقال رویدادها از کامپوننت فرزند به والد
1404/09/24 20:52

آشنایی با Emit در Vue.js | انتقال رویدادها از کامپوننت فرزند به والد

مطالعه بیشتر
تفاوت Data و Computed Properties در Vue.js | آموزش کاربردی و مثال‌محور
1404/09/21 23:58

تفاوت Data و Computed Properties در Vue.js | آموزش کاربردی و مثال‌محور

مطالعه بیشتر
مقایسه کامل و جامع MySQLi و PDO در PHP: کدام یک برای پروژه شما مناسب‌تر است؟
1405/05/04 23:45

مقایسه کامل و جامع MySQLi و PDO در PHP: کدام یک برای پروژه شما مناسب‌تر است؟

مطالعه بیشتر
آموزش جامع اتصال به دیتابیس با PDO در PHP
1405/05/04 23:42

آموزش جامع اتصال به دیتابیس با PDO در PHP

مطالعه بیشتر
آموزش صفحه‌بندی اطلاعات در PHP به صورت اصولی و مطابق استانداردهای سئو گوگل
1405/05/13 21:21

آموزش صفحه‌بندی اطلاعات در PHP به صورت اصولی و مطابق استانداردهای سئو گوگل

مطالعه بیشتر
آموزش کامل Super Global ها در PHP (متغیرهای سراسری)
1405/04/27 22:29

آموزش کامل Super Global ها در PHP (متغیرهای سراسری)

مطالعه بیشتر
آموزش فیلتر کردن داده‌ها در PHP با توابع filter_var و preg_match
1405/05/13 21:29

آموزش فیلتر کردن داده‌ها در PHP با توابع filter_var و preg_match

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد