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

آموزش کامل کار با تابع password_verify در PHP (امنیت رمز عبور)

1405/05/14 22:09 محراب حسن زاده
آموزش کامل کار با تابع password_verify در PHP (امنیت رمز عبور)

مقدمه‌ای بر امنیت رمز عبور و هشینگ در PHP

هنگام طراحی هر سیستم کاربری، امنیت رمزهای عبور کاربران اولویت شماره یک شما است. در گذشته، توسعه‌دهندگان از الگوریتم‌هایی مانند MD5 یا SHA1 برای هش کردن استفاده می‌کردند. امروزه این الگوریتم‌ها در برابر حملات Brute-force و جداول Rainbow کاملاً آسیب‌پذیر هستند. طبق استانداردهای امنیتی گوگل، شما باید از الگوریتم‌های قوی و پویایی مثل bcrypt یا Argon2 استفاده کنید.

پی‌اچ‌پی با معرفی تابع‌های پیشرفته‌ی password_hash() و password_verify()، فرآیند رمزنگاری و اعتبارسنجی را به ساده‌ترین شکل و در عین حال با بالاترین استانداردهای امنیتی فراهم کرده است.

تابع password_hash چیست؟ (پیش‌نیاز بررسی رمز)

قبل از اینکه بتوانیم رمزی را با password_verify() تایید کنیم، ابتدا باید آن را به صورت امن هش و در دیتابیس ذخیره کنیم. تابع password_hash() این کار را به همراه تولید خودکار یک نمک (Salt) تصادفی و منحصر‌به‌فرد برای هر پسورد انجام می‌دهد.


// تعریف رمز عبور کاربر در مرحله ثبت‌نام
$userPassword = "MySafePassword123";

// هش کردن رمز عبور با استفاده از الگوریتم ایمن BCRYPT
$hashedPassword = password_hash($userPassword, PASSWORD_DEFAULT);

// خروجی یک رشته امن ۶۰ کاراکتری خواهد بود که باید در دیتابیس ذخیره شود
echo $hashedPassword;

آشنایی با تابع password_verify در PHP

وقتی کاربر تلاش می‌کند وارد حساب خود شود، رمز عبور خام خود را در فرم لاگین وارد می‌سازد. در این مرحله، ما نباید رمز ورودی را مجدداً با تابع password_hash هش کنیم و با هش قبلی مقایسه کنیم؛ چرا که الگوریتم‌های مدرن در هر بار اجرا، هش کاملاً متفاوتی به دلیل وجود Salt تصادفی تولید می‌کنند.

به جای این کار، پی‌اچ‌پی تابع شگفت‌انگیز password_verify() را در اختیار ما قرار داده است. این تابع به صورت خودکار Salt و الگوریتم استفاده شده را از دل هش ذخیره شده بیرون می‌کشد، رمز خام ورودی را با آن پردازش می‌کند و نتیجه مطابقت را به صورت یک مقدار Boolean (true یا false) بازمی‌گرداند.

ساختار نحوی (Syntax) تابع


password_verify(string $password, string $hash): bool
  • $password: رمز عبور خام که کاربر در فرم لاگین وارد کرده است.
  • $hash: رشته هش شده‌ای که در دیتابیس ذخیره شده بود.
  • خروجی: اگر مطابقت داشت true و در غیر این صورت false برمی‌گرداند.

پیاده‌سازی عملی سیستم تایید رمز عبور در PHP

در نمونه کد زیر، یک سناریوی واقعی از نحوه بررسی اطلاعات کاربر و اعتبارسنجی پسورد در یک وب‌سایت واقعی را مشاهده می‌کنید:



// فرضیه: اطلاعاتی که کاربر در فرم ورود وارد کرده است
$emailInput = "user@example.com";
$passwordInput = "MySafePassword123";

// ۱. اتصال به دیتابیس و پیدا کردن کاربر بر اساس ایمیل (کد فرضی)
// $user = $db--->findUserByEmail($emailInput);
// فرض می‌کنیم هش ذخیره شده در دیتابیس برای این کاربر به شکل زیر است:
$dbHashedPassword = '$2y$10$8u4nKkR8gXm6Jq2Wf4sY1.9wz3pY4x9u8u8u8u8u8u8u8u8u8u8u8u'; 

// ۲. بررسی صحت رمز عبور وارد شده
if (password_verify($passwordInput, $dbHashedPassword)) {
    echo "ورود با موفقیت انجام شد! به سیستم خوش آمدید.";
    // در این بخش می‌توانید سشن کاربر را فعال کنید
    session_start();
    $_SESSION['user_logged_in'] = true;
} else {
    echo "خطا! نام کاربری یا رمز عبور اشتباه است.";
}

نکات طلایی گوگل برای ارتقای امنیت رمزها در PHP

طبق داکیومنت‌های توسعه‌دهندگان گوگل، برای داشتن یک احراز هویت بی‌نقص باید موارد زیر را رعایت کنید:

  1. هرگز از الگوریتم‌های منسوخ استفاده نکنید: توابعی مثل md5()، sha1() و crypt() بدون Salt دستی به راحتی قابل شکستن هستند.
  2. استفاده از الگوریتم‌های قوی‌تر: ثابت PASSWORD_DEFAULT به مرور زمان با پیشرفت امنیت PHP به الگوریتم‌های قوی‌تر آپدیت می‌شود. همچنین می‌توانید به صورت مستقیم از PASSWORD_ARGON2I یا PASSWORD_ARGON2ID استفاده کنید.
  3. طول فیلد دیتابیس: همواره ستون رمز عبور در دیتابیس خود را حداقل با طول ۲۵۵ کاراکتر (VARCHAR) در نظر بگیرید تا در صورت تغییر الگوریتم‌های هش در آینده و بزرگتر شدن هش‌ها، داده‌ها بریده نشوند.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

مدیریت خطاها در Async/Await و Promises در جاوا اسکریپت: راهنمای کامل با مثال‌های عملی
1403/07/30 20:59

مدیریت خطاها در Async/Await و Promises در جاوا اسکریپت: راهنمای کامل با مثال‌های عملی

مطالعه بیشتر
آموزش CSS Blend Modes: ادغام رنگ‌ها و تصاویر برای طراحی وب جذاب
1403/08/09 20:29

آموزش CSS Blend Modes: ادغام رنگ‌ها و تصاویر برای طراحی وب جذاب

مطالعه بیشتر
آموزش ایجاد تگ‌های صفحه‌بندی در HTML و CSS: طراحی و استایل‌دهی pagination
1402/05/29 21:27

آموزش ایجاد تگ‌های صفحه‌بندی در HTML و CSS: طراحی و استایل‌دهی pagination

مطالعه بیشتر
آموزش کامل include و require در PHP + تفاوت‌های کلیدی و کاربردی
1405/05/01 20:28

آموزش کامل include و require در PHP + تفاوت‌های کلیدی و کاربردی

مطالعه بیشتر
آموزش طراحی و استایل‌دهی جدول‌ها در CSS: راهنمای ساده و کاربردی
1402/06/10 18:00

آموزش طراحی و استایل‌دهی جدول‌ها در CSS: راهنمای ساده و کاربردی

مطالعه بیشتر
آموزش کامل حلقه foreach در PHP برای پیمایش آرایه‌ها (به زبان ساده)
1405/04/04 00:22

آموزش کامل حلقه foreach در PHP برای پیمایش آرایه‌ها (به زبان ساده)

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

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

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

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

مطالعه بیشتر
نصب Node.js و Create React App: شروع پروژه‌های React.js به‌صورت آسان
1402/06/28 01:09

نصب Node.js و Create React App: شروع پروژه‌های React.js به‌صورت آسان

مطالعه بیشتر
آموزش کامل حلقه foreach در PHP برای پیمایش آرایه‌ها (به زبان ساده)
1405/04/16 00:37

آموزش کامل حلقه foreach در PHP برای پیمایش آرایه‌ها (به زبان ساده)

مطالعه بیشتر
آموزش جامع ساخت فرم ورود کاربر در PHP (براساس استانداردهای گوگل و امنیت بالا)
1405/05/14 22:03

آموزش جامع ساخت فرم ورود کاربر در PHP (براساس استانداردهای گوگل و امنیت بالا)

مطالعه بیشتر
آموزش کامل $_SERVER در PHP: راهنمای جامع متغیرهای سوپرگلوبال سرور
1405/05/01 20:04

آموزش کامل $_SERVER در PHP: راهنمای جامع متغیرهای سوپرگلوبال سرور

مطالعه بیشتر

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