التفويض والمصادقة في PHP: من الأساسيات إلى الحماية
تبدأ أمان تطبيقات الويب بالتنفيذ الصحيح للمصادقة (التحقق من هوية المستخدم) والتفويض (التحقق من صلاحيات الوصول الخاصة به). في PHP، يمكن تنفيذ هذه الآليات باستخدام الدوال المدمجة أو باستخدام مكتبات متخصصة. في هذه المقالة، سنشرح المفاهيم الأساسية، ونكتب أمثلة على الكود، ونستعرض أفضل ممارسات الحماية.
1. المفاهيم الأساسية: المصادقة مقابل التفويض
قبل كتابة الكود، من المهم التمييز بوضوح بين المصطلحين:
- المصادقة — عملية التحقق من أن المستخدم هو من يدّعي (عادةً من خلال اسم المستخدم وكلمة المرور).
- التفويض — عملية تحديد الموارد أو الإجراءات المتاحة للمستخدم الموثّق (مثل دور "admin" أو "user").
يمكن أن تؤدي الأخطاء في تنفيذ أي من هذه المراحل إلى تسرب البيانات أو الوصول غير المصرح به.
2. المصادقة الأساسية عبر الجلسات (PHP الأصلي)
الطريقة الأكثر شيوعًا هي استخدام الجلسات. يوفر PHP آلية مدمجة $_SESSION. دعنا نلقي نظرة على مثال بسيط.
الخطوة 1: نموذج تسجيل الدخول (login.php)
<?phpsession_start();?><!DOCTYPE html><html><head> <title>تسجيل الدخول إلى الموقع</title></head><body> <form method="POST" action="login.php"> <label>اسم المستخدم:</label> <input type="text" name="username" required> <label>كلمة المرور:</label> <input type="password" name="password" required> <button type="submit" name="login">تسجيل الدخول</button> </form></body></html>الخطوة 2: معالجة تسجيل الدخول (نفس login.php)
<?phpsession_start();require_once 'db.php'; // الاتصال بقاعدة البيانات
if (isset($_POST['login'])) { $username = trim($_POST['username']); $password = $_POST['password'];
// 1. استعلام مُعد للحماية من حقن SQL $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch();
// 2. التحقق من كلمة المرور عبر password_verify if ($user && password_verify($password, $user['password_hash'])) { // المصادقة ناجحة $_SESSION['user_id'] = $user['id']; $_SESSION['logged_in'] = true; header("Location: dashboard.php"); exit; } else { $error = "اسم المستخدم أو كلمة المرور غير صحيحة"; }}?>الخطوة 3: التحقق من التفويض في الصفحة المحمية
<?phpsession_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { header("Location: login.php"); exit;}// تم السماح بالوصولecho "مرحبًا، المستخدم #" . htmlspecialchars($_SESSION['user_id']);?>3. تجزئة كلمات المرور: لا تخزن كلمات المرور أبدًا بنص واضح
يوفر PHP دوال آمنة للعمل مع كلمات المرور:
password_hash($password, PASSWORD_BCRYPT)— ينشئ تجزئة مع ملح تلقائيًا.password_verify($password, $hash)— يتحقق من كلمة المرور مقابل التجزئة.
مثال على تسجيل مستخدم جديد:
<?php$password = "user123";$hash = password_hash($password, PASSWORD_BCRYPT);// حفظ $hash في قاعدة البيانات$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");$stmt->execute([$username, $hash]);?>هام: لا تستخدم أبدًا md5() أو sha1() لكلمات المرور — فهي قديمة ويسهل اختراقها.
4. التفويض القائم على الأدوار (Role-Based Access Control)
لتحديد الصلاحيات