التفويض والمصادقة في PHP: من الأساسيات إلى الأمان
في تطوير الويب الحديث، تعتبر المصادقة (التحقق من هوية المستخدم) والتفويض (التحقق من صلاحيات الوصول) آليتين أساسيتين للأمان. في PHP، يتم تنفيذ هذه العمليات من خلال العمل مع الجلسات، ملفات تعريف الارتباط، تجزئة كلمات المرور والرموز المميزة. في هذه المقالة، سنشرح جميع الجوانب الرئيسية اللازمة لإنشاء نظام دخول آمن على الموقع التعليمي pythonlib.ru.
1. المفاهيم الأساسية: المصادقة مقابل التفويض
قبل كتابة الكود، من المهم التمييز بوضوح بين المصطلحين:
- المصادقة — عملية التحقق من أن المستخدم هو من يدّعي (اسم المستخدم + كلمة المرور، القياسات الحيوية، الرمز المميز).
- التفويض — تحديد الموارد والإجراءات المتاحة للمستخدم المُصادق عليه (الأدوار: مشرف، مشرف محتوى، مستخدم).
في PHP، يتم تنفيذ المصادقة عادةً من خلال الجلسات أو JWT، بينما يتم التفويض من خلال التحقق من الأدوار في قاعدة البيانات.
2. تجزئة كلمات المرور: لا تخزن كلمات المرور أبدًا كنص عادي
توفر PHP دوالًا مدمجة لتجزئة كلمات المرور بشكل آمن. استخدم password_hash() و password_verify() — هذا هو المعيار الحديث.
// تسجيل مستخدم جديد$password = $_POST['password'];$hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// نقوم بحفظ $hashedPassword في قاعدة البيانات$sql = "INSERT INTO users (email, password_hash) VALUES (?, ?)";$stmt = $pdo->prepare($sql);$stmt->execute([$_POST['email'], $hashedPassword]);// التحقق عند تسجيل الدخول$inputPassword = $_POST['password'];$storedHash = $user['password_hash']; // من قاعدة البيانات
if (password_verify($inputPassword, $storedHash)) { // المصادقة ناجحة $_SESSION['user_id'] = $user['id'];} else { // كلمة مرور خاطئة}3. إدارة الجلسات في PHP
الجلسات هي الطريقة الأكثر شيوعًا لتتبع المستخدمين المُصادق عليهم. يقوم PHP تلقائيًا بإنشاء معرف جلسة فريد وحفظه في ملف تعريف الارتباط.
// بدء الجلسة (دائمًا في بداية السكربت)session_start();
// بعد تسجيل الدخول بنجاح$_SESSION['user_id'] = $user['id'];$_SESSION['user_role'] = $user['role']; // للتفويض$_SESSION['logged_in'] = true;
// التحقق من المصادقة في الصفحات المحميةfunction requireAuth() { if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { header('Location: /login.php'); exit; }}
// تسجيل الخروجsession_destroy();setcookie(session_name(), '', time() - 3600, '/');4. أمان الجلسات: الحماية من الهجمات
لمنع اختطاف الجلسات (Session Hijacking) وتثبيت الجلسات (Session Fixation)، استخدم الإجراءات التالية:
- إعادة توليد معرف الجلسة بعد تسجيل الدخول:
session_regenerate_id(true); // يحذف الجلسة القديمة- التحقق من User-Agent و IP (اختياري ولكنه يزيد الأمان):
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
// عند كل طلبif ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) { session_destroy(); die('نشاط مشبوه');}- تعيين علامات لملف تعريف ارتباط الجلسة في
php.iniأو عبرsession_set_cookie_params():
session_set_cookie_params([ 'lifetime' => 0, // حتى إغلاق المتصفح 'secure' => true, // HTTPS فقط 'httponly' => true, // غير متاح من JavaScript 'samesite' => 'Strict' // حماية من CSRF]);session_start();