تقریباً هر برنامهنویس وب یه روزی باید فرم لاگین بسازه. به ظاهر دو تا فیلد سادهست، ولی در عمل دروازه ورود به دادههای حساس و امنیت کل سایته؛ اگه درست طراحی نشه، میتونه به بزرگترین حفره امنیتی تبدیل بشه.
پس اگه این بخش رو ساده بگیری، کل امنیت سایتت رو به خطر انداختی. توی این مقاله فرم لاگین رو می سازیم، در مورد بهترین شیوه های امنیتی و نکاتی که کمتر بهشون توجه میشه هم صحبت می کنیم.
اولین بار که فرم لاگین نوشتم، پسوردها رو با MD5 ذخیره کردم؛ اشتباهی که بعداً فهمیدم میتونه کل امنیت سیستم رو به خطر بندازه. چند ماه بعد یکی روی همون پروژه Brute_Force زد و تقریباً کل دیتابیس لو رفت. بعد از اون تجربه، یاد گرفتم که حتی در پروژههای تمرینی هم باید از password_hash() استفاده کنم.
توی یک پروژه دیگه برای یک فروشگاه آنلاین، چون Session ID بعد از ورود دوباره تولید نمیشد، یک هکر تونست نشست کاربر رو بدزده (Session Hijacking). بعد از اون ما session_regenerate_id(true)_رو بلافاصله بعد از لاگین اجباری کردیم.
همینطور در یک پروژه سازمانی دیگه، وقتی HTTPS فعال نبود، رمز عبور کاربر توی شبکه لو رفت. اونجا با فعال کردن SSL و HSTS جلوی تکرار این حمله رو گرفتیم.

چرا PHP برای ساخت فرم لاگین انتخاب خوبی است؟
دلیل انتخاب PHP برای فرم لاگین طبق تجربه چندین پروژه واقعی نشون داده که:
روی ۹۰٪ هاستهای اشتراکی بدون دردسر نصب میشه.
ابزار امنیتی داخلی مثل password_hash()، password_verify() و session management داره که در زبانهای دیگه باید دستی پیاده بشن.
جامعه بزرگی از توسعهدهندگان داره؛ پس اگر به مشکلی برخورد کنی، احتمال زیاد جوابش قبلاً در انجمنهای معتبر مثل StackOverflow یا مستندات رسمی PHP وجود داره.
بر اساس مستندات رسمی PHP درباره Password Hashing، بهترین روش ذخیره رمز عبور همین تابع هست که بهطور پیشفرض از bcrypt یا Argon2 استفاده میکنه. همچنین راهنمای Session Management در PHP نکات مهمی درباره ایمنسازی نشستها آورده. اگه میخوای بیشتر وارد جزئیات بشی، OWASP _یه Authentication_Cheat_Sheet داره که به عنوان یه مرجع جهانی تو زمینه امنیت شناخته میشه.

آموزش ساخت فرم لاگین با PHP (راهنمای کامل و ساده)
اگه تازه وارد دنیای برنامه نویسی وب شدی، احتمالا یکی از اولین چیزایی که میخوای یاد بگیری، ساخت فرم لاگین با PHP هست. این فرم ساده هم برای تمرین خیلی خوبه و هم بهت یاد میده چطور ورود و خروج کاربرا رو مدیریت کنی:
مرحله اول: آماده سازی ساختار پروژه
اول یک پوشه به اسم پروژه درست کن و فایل های زیر رو توش بذار:
📂 login-demo/ ┣ 📄 _index.php → صفحه اصلی بعد از ورود موفق ┣ 📄 login.php. → پردازش لاگین و اعتبارسنجی ┣ 📄 logout.php → خروج از سیستم ┗ 🎨 style.css → استایل فرم
index.php: همون صفحه اصلی بعد از ورود موفق.
login.php: شامل فرم ورود و کدهای لاگین.
style.css: برای خوشگل کردن فرم.
نکته: از همین اول ساختار پروژه رو تمیز نگه دار؛ این عادت کوچیک توی پروژه های بزرگ خیلی به کارت میاد.
مرحله دوم: طراحی فرم لاگین
یه فرم خیلی ساده بساز که فقط شامل فیلد نام کاربری و رمز عبور باشه:
<?php session_start(); $_SESSION['csrf'] = bin2hex(random_bytes(32)); ?> <form method="post" action="login.php" accept-charset="UTF-8"> <h2>Login</h2> <label>Username:</label> <input type="text" name="username" required> <label>Password:</label> <input type="password" name="password" required> <input type="hidden" name="csrf" value="<?php echo $_SESSION['csrf']; ?>"> <button type="submit">Login</button> </form>
🔑 نکته: فیلد های ورودی رو اعتبارسنجی کن. این اولین خط دفاعی در برابر حملات XSS_و SQL Injection_هست.
مرحله سوم: نوشتن منطق لاگین در PHP
حالا وقتشه اطلاعات کاربر رو بررسی کنیم. برای تست، یه نام کاربری و پسورد ثابت می ذاریم. ولی توی پروژه واقعی باید اطلاعات توی دیتابیس ذخیره بشه:
<?php
session_start();
if ($_SERVER[“REQUEST_METHOD”] == “POST”) {
if (!hash_equals($_SESSION[‘csrf’] ?? ”, $_POST[‘csrf’] ?? ”)) {
exit(“Invalid request”);
}
$username = trim($_POST[“username”]);
$password = $_POST[“password”];
$pdo = new PDO(“mysql:host=localhost;dbname=demo;charset=utf8mb4″,”user”,”pass”,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$stmt = $pdo->prepare(“SELECT id, username, password_hash FROM users WHERE username = ? LIMIT 1”);
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user[“password_hash”])) {
session_regenerate_id(true);
$_SESSION[“username”] = $user[“username”];
header(“Location: index.php”);
exit();
} else {
echo “Login failed. Please check your credentials.”;
}
}
?>
یک نکته حرفهای: اگر کاربر رمز قدیمی داره، بهتره با password_needs_rehash() هش جدید براش تولید بشه:
if (password_needs_rehash($user[‘password_hash’], PASSWORD_DEFAULT)) {
$newHash = password_hash($password, PASSWORD_DEFAULT);
// ذخیره هش جدید در دیتابیس
}
همینطور بهتره توی فایل_php.ini_ این تنظیمات رو فعال کنی:
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Strict
این کار جلوی حملات XSS و CSRF رو تا حد زیادی میگیره.
نکات حرفه ای:
توی پروژههای واقعی دیگه نباید از داده ثابت استفاده کنی، بهتره اطلاعات کاربر رو از پایگاه داده بخونی.
هیچ وقت پسورد رو به صورت متن ساده ذخیره نکن.
همیشه از کوئری های آماده برای کار با MySQL استفاده کن.
مرحله چهارم: ساخت صفحه اصلی بعد از ورود
اگه کاربر وارد شد، یک پیام خوشامد براش نشون میدیم:
<?php
session_start();
if (!isset($_SESSION["username"])) {
header("Location: login.php");
exit();
}
?>
<?php
session_start();
if (!isset($_SESSION["username"])) {
header("Location: login.php");
exit();
}
?>
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<title>صفحه کاربری</title>
<meta name="description" content="آموزش ساخت فرم لاگین امن با PHP همراه با نکات امنیتی و نمونه کد کامل">
</head>
<body>
<h1>خوش اومدی</h1>
<p>سلام، <?php echo htmlspecialchars($_SESSION["username"], ENT_QUOTES, 'UTF-8'); ?>!</p>
<a href="logout.php">خروج از حساب</a>
</body>
</html>
مرحله پنجم: اضافه کردن خروج (logout.php)
با این کد کاربر میتونه از حسابش خارج بشه:
<?php
session_start();
$_SESSION = [];
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();
?>
نکات امنیتی برای ساخت فرم لاگین با PHP
🚨 خیلی از تازهکارها یک اشتباه بزرگ میکنن: پسورد رو توی لاگهای خطا یا حتی ایمیل ادمین ذخیره میکنن. این کار عملاً مثل اینه که کلید گاوصندوق رو روی در بذاری.
➕ پیشنهاد: ورودهای ناموفق رو در یک جدول دیتابیس لاگ کن تا بتونی IPهای مشکوک رو شناسایی و بلاک کنی (مثلاً با Fail2Ban).
➕ یادت باشه همیشه PHP رو روی آخرین نسخه (مثلاً ۸.۲ یا بالاتر) نگه داری چون وصلههای امنیتی مرتب منتشر میشه.
سخن آخر
ساخت یک فرم لاگین امن، فقط تمرین نیست؛ بلکه قدمی ست که تقریباً در هر پروژه واقعی وب بهش برمیخوری. اگر همین حالا عادتهای درست مثل استفاده از Prepared Statements، رمزنگاری مدرن و مدیریت ایمن نشست رو در کارهات وارد کنی، در پروژههای بزرگتر زمان و هزینه زیادی رو ذخیره خواهی کرد.
اگر میخوای عمیقتر وارد بحث بشی، پیشنهاد میکنم مستندات رسمی PHP درباره Sessions و Password Hashing رو مطالعه کنی.