خیلی از پروژههای PHP هنوز از md5 یا sha1 برای ذخیره پسورد استفاده میکنن و این یعنی دردسر امنیتی 😅
بیایم یه لاگین ساده ولی استاندارد بسازیم که روی password_hash و password_verify سوار باشه؛ همون چیزی که توی داک رسمی PHP هم پیشنهاد شده:
php.net/manual/en/function.password-hash.php
ایده کلی اینه:
• سمت دیتابیس فقط hash پسورد ذخیره میشه، نه خود پسورد.
• برای ساخت یوزر جدید از password_hash استفاده میکنیم.
• برای لاگین از password_verify کمک میگیریم.
• بعد از لاگین موفق، یه session امن راه میندازیم.
این یه مثال خیلی مینیمال و قابلاستفاده توی پروژههای کوچیکه 👇
<?php
// config.php
$pdo = new PDO(
'mysql:host=localhost;dbname=test;charset=utf8mb4',
'db_user',
'db_pass',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
// register.php - ساخت یوزر جدید
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit('ایمیل نامعتبر است');
}
if (strlen($password) < 8) {
exit('پسورد باید حداقل 8 کاراکتر باشد');
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare('INSERT INTO users (email, password_hash) VALUES (:email, :hash)');
$stmt->execute([
':email' => $email,
':hash' => $hash,
]);
echo 'ثبتنام با موفقیت انجام شد ✅';
}
// login.php - لاگین یوزر
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';
$stmt = $pdo->prepare('SELECT id, password_hash FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user || !password_verify($password, $user['password_hash'])) {
exit('ایمیل یا پسورد اشتباه است');
}
session_regenerate_id(true);
$_SESSION['user_id'] = $user['id'];
echo 'خوش اومدی! 🎉';
}
نکتهها و ترفندهای کوچیک ولی مهم:
• الگوریتم داخلی PASSWORD_DEFAULT ممکنه در آینده عوض بشه، ولی همون برای اکثر سناریوها عالیه.
• با password_needs_rehash میتونی موقع لاگین، hashهای قدیمی رو خودکار به نسخهی جدیدتر migrate کنی (مثلاً وقتی cost رو عوض کردی).
• حتماً روی ستون پسورد توی دیتابیس حداقل طول 255 بگذار تا با تغییر الگوریتمهای آینده مشکل نداشته باشی.
• از PDO prepared statement استفاده کن که جلوی SQL Injection رو بگیره، مثل همین نمونه.
• بعد لاگین، session_regenerate_id رو فراموش نکن تا Session Fixation اتفاق نیفته.
این الگو پایهی خیلی از سیستمهای auth امروزی توی PHP ـه و راحت میشه بعداً روش چیزهایی مثل remember me، محدودیت تلاش لاگین، و لاگ آدیت اضافه کرد.
امتحانش کن روی یه پروژه کوچیک، اگر جواب داد همون رو تمیزتر کن و بذار توی پروژههای اصلیات 💻
🔖 #PHP #پی_اچ_پی #PHP #Authentication #Security #Password_Hashing #Login #PDO
👤 Developix
💎 Channel: @DevelopixPHP