🔐 درس هفتم: امنیت پیشرفته؛ هش کردن پسورد و مقابله با حملات وب
🎯 هدف این درس: یادگیری روشهای استاندارد رمزنگاری پسورد (Password Hashing)، محافظت در برابر حملات XSS (تزریق اسکریپت) و CSRF (جعل درخواست بین سایتی) برای ساخت یک سیستم امن و غیرقابل نفوذ.
مهمان عزیز! 👋
در درسهای قبل یاد گرفتی چطور دادهها را ذخیره کنی و ساختار پروژه را مرتب نگه داری. اما اگر امنیت را نادیده بگیری، تمام زحماتت با یک حمله ساده از بین میرود.
امنیت در وب شوخی نیست. ذخیره پسوردها به صورت متن ساده (Plain Text) یا اعتماد کورکورانه به ورودیهای کاربر، بزرگترین اشتباهاتی است که یک توسعهدهنده میتواند مرتکب شود. در این درس، تکنیکهای حیاتی سال ۲۰۲۶ را بررسی میکنیم.
💡 چرا امنیت پیشرفته؟
۱. Hashing: حتی اگر دیتابیس هک شود، هکرها نتوانند پسوردها را بخوانند.
۲. XSS Protection: جلوگیری از اجرای کدهای مخرب جاوااسکریپت توسط کاربران.
۳. CSRF Protection: اطمینان از اینکه درخواستها واقعاً از طرف کاربر ارسال شدهاند.
🔑 مرحله ۱: هش کردن پسورد (Password Hashing)
هرگز، تکرار میکنم هرگز پسورد را به صورت ساده در دیتابیس ذخیره نکن. از تابع قدرتمند password_hash() استفاده کن. این تابع به صورت خودکار از الگوریتمهای قوی مثل Bcrypt یا Argon2 استفاده میکند.
register.php
PHP
8.x
<?php
$password = "MySecretPass123";
// ایجاد هش امن از پسورد
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
// ذخیره $hashedPassword در دیتابیس
echo "هش تولید شده: " . $hashedPassword;
برای بررسی صحت پسورد هنگام لاگین، از password_verify() استفاده کن:
login_check.php
PHP
8.x
<?php
if (password_verify($inputPassword, $hashedPasswordFromDB)) {
echo "رمز عبور صحیح است. خوش آمدید!";
} else {
echo "رمز عبور اشتباه است.";
}
🛡️ مرحله ۲: مقابله با XSS (Cross-Site Scripting)
اگر کاربری در بخش نظرات کد <script>alert('Hacked')</script> را وارد کند و شما آن را بدون فیلتر نمایش دهید، این کد در مرورگر همه اجرا میشود! راه حل ساده است: استفاده از htmlspecialchars().
sanitize_output.php
PHP
8.x
<?php
$userComment = $_POST['comment'];
// تبدیل کاراکترهای خاص HTML به موجودیتهای متنی
$safeComment = htmlspecialchars($userComment, ENT_QUOTES, 'UTF-8');
echo $safeComment; // حالا کدهای مخرب فقط به صورت متن نمایش داده میشوند
🔒 مرحله ۳: مقابله با CSRF (Cross-Site Request Forgery)
CSRF زمانی رخ میدهد که هکر کاربر را فریب دهد تا بدون اطلاع خودش عملیاتی (مثل حذف اکانت) انجام دهد. برای جلوگیری از این کار، از Token استفاده میکنیم.
csrf_protection.php
PHP
8.x
<?php
// ۱. تولید توکن در فرم
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['csrf_token'];
?>
<!-- ۲. قرار دادن توکن در فرم HTML -->
<form method="post">
<input type="hidden" name="csrf_token" value"<?= $token ?>">
<button type="submit">ثبت تغییرات</button>
</form>
<?php
// ۳. بررسی توکن در سمت سرور
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
echo "درخواست معتبر است.";
} else {
die("خطای امنیتی: درخواست نامعتبر.");
}
}
❌ خطاهای رایج امنیتی
🚫 اشتباه مرگبار:
استفاده از الگوریتمهای قدیمی مثل MD5 یا SHA1 برای پسورد. این الگوریتمها در چند ثانیه شکسته میشوند! فقط از password_hash استفاده کن.
- اعتماد به ورودی کاربر: هرگز به دادههای
$_GETیا$_POSTاعتماد نکن و همیشه آنها را sanitize کن. - نمایش جزئیات خطا: در محیط واقعی، پیامهای خطای دیتابیس را به کاربر نشان نده.
🏁 جمعبندی درس هفتم
مهمان عزیز، در این درس یاد گرفتی:
- ✅ چگونه با
password_hashپسوردها را غیرقابل بازگشت کنی. - ✅ چگونه با
htmlspecialcharsجلوی حملات XSS را بگیری. - ✅ چگونه با توکنهای CSRF از جعل درخواست جلوگیری کنی.
- ✅ اهمیت sanitization ورودیها قبل از پردازش.
🎓 تمرین عملی درس هفتم
فرم ثبتنام درس قبل را آپدیت کن تا پسوردها را هش کند و تمام فیلدهای متنی را در برابر XSS ایمن سازی نماید.
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | ارتباط با دیتابیس (PDO) | اتصال امن به MySQL، جلوگیری از SQL Injection |
| ۲ | مدیریت نشستها (Sessions) | ساخت سیستم لاگین/خروج، مدیریت دسترسی کاربران |
| ۳ | کار با فایلها (File Handling) | آپلود تصویر، خواندن و نوشتن در فایلها |
| ۴ | مدیریت خطاها (Error Handling) | استفاده از Try/Catch، لاگگیری خطاها |
| ۵ | مقدمهای بر شیگرایی (OOP) | کلاس، شیء، متد، ویژگیها |
| ۶ | ساختاردهی پروژه (MVC مقدماتی) | جداسازی منطق از ظاهر، فایلهای Config |
| ۷ | امنیت پیشرفته | هش کردن پسورد، محافظت در برابر XSS و CSRF |
| ۸ | کار با API (مقدماتی) | دریافت داده از API خارجی (cURL)، JSON |
| ۹ | پروژه نهایی سطح متوسط | ساخت وبلاگ کامل با قابلیت لاگین و مدیریت |



