آموزش رایگان 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) در نظر بگیرید تا در صورت تغییر الگوریتم‌های هش در آینده و بزرگتر شدن هش‌ها، داده‌ها بریده نشوند.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

مدیریت ترتیب نمایش با z-index در CSS: آموزش کامل و کاربردی
1403/08/11 21:28

مدیریت ترتیب نمایش با z-index در CSS: آموزش کامل و کاربردی

مطالعه بیشتر
آموزش تکنیک‌های پیشرفته CSS Grid: طراحی ساختارهای پیچیده و واکنش‌گرا
1402/06/18 23:16

آموزش تکنیک‌های پیشرفته CSS Grid: طراحی ساختارهای پیچیده و واکنش‌گرا

مطالعه بیشتر
آموزش جامع برنامه‌نویسی شی‌گرا (OOP) در PHP بر اساس استانداردهای گوگل
1405/05/15 00:33

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

مطالعه بیشتر
آموزش جامع عملگرهای مقایسه‌ای در PHP؛ بررسی تفاوت == و ===
1405/04/03 23:47

آموزش جامع عملگرهای مقایسه‌ای در PHP؛ بررسی تفاوت == و ===

مطالعه بیشتر
کار با تصاویر SVG در CSS: کنترل استایل و استفاده از گرافیک‌های مقیاس‌پذیر
1403/08/16 22:45

کار با تصاویر SVG در CSS: کنترل استایل و استفاده از گرافیک‌های مقیاس‌پذیر

مطالعه بیشتر
آموزش Directive‌ های Vue.js | استفاده از v-model، v-bind و v-show با مثال
1404/09/23 21:10

آموزش Directive‌ های Vue.js | استفاده از v-model، v-bind و v-show با مثال

مطالعه بیشتر
آموزش کامل و امن آپلود فایل در PHP (مطابق استاندارد گوگل)
1405/05/01 20:17

آموزش کامل و امن آپلود فایل در PHP (مطابق استاندارد گوگل)

مطالعه بیشتر
آموزش ارتباط با سرور و ارسال درخواست‌های HTTP با Fetch API در جاوا اسکریپت: راهنمای جامع با مثال‌ها
1403/08/01 19:55

آموزش ارتباط با سرور و ارسال درخواست‌های HTTP با Fetch API در جاوا اسکریپت: راهنمای جامع با مثال‌ها

مطالعه بیشتر
آموزش گام به گام اتصال به دیتابیس با MySQLi در PHP (امن و استاندارد)
1405/05/04 23:40

آموزش گام به گام اتصال به دیتابیس با MySQLi در PHP (امن و استاندارد)

مطالعه بیشتر
معرفی Vue.js و ویژگی‌های کلیدی آن: فریمورک مدرن برای توسعه وب تعاملی
1402/06/28 00:33

معرفی Vue.js و ویژگی‌های کلیدی آن: فریمورک مدرن برای توسعه وب تعاملی

مطالعه بیشتر
تفاوت Session و Cookie در PHP؛ راهنمای جامع و کاربردی طبق استاندارد گوگل
1405/05/01 20:14

تفاوت Session و Cookie در PHP؛ راهنمای جامع و کاربردی طبق استاندارد گوگل

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

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

مطالعه بیشتر

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