آموزش گام به گام ساخت سیستم لاگین و لاگاوت در 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 جلوگیری شود.
پرسش و پاسخ
نظری یافت نشد
برای ارسال نظر ابتدا وارد شوید