التفويض والمصادقة في PHP: كيفية حماية موقعك
الأمان هو أحد الجوانب الرئيسية لأي تطبيق ويب. في PHP، يتم تنفيذ المصادقة (التحقق من هوية المستخدم) والتفويض (تحديد صلاحيات الوصول) باستخدام أدوات مدمجة: الجلسات، الكوكيز، تجزئة كلمات المرور، والعمل مع قواعد البيانات. في هذه المقالة، سنستعرض الدورة الكاملة لإنشاء نظام تسجيل الدخول والتسجيل وتحديد الصلاحيات في PHP.
1. المفاهيم الأساسية
- المصادقة — عملية التحقق مما إذا كان المستخدم هو من يدّعي (عادةً باستخدام اسم المستخدم وكلمة المرور).
- التفويض — التحقق مما إذا كان المستخدم المُصادَق عليه لديه الحق في تنفيذ إجراء معين (مثل الوصول إلى لوحة التحكم).
- الجلسة — مخزن بيانات مؤقت على الخادم، مرتبط بزائر معين عبر معرف فريد (session ID).
- تجزئة كلمات المرور — تحويل كلمة المرور إلى سلسلة غير قابلة للعكس لتخزين آمن في قاعدة البيانات.
2. تسجيل المستخدم
الخطوة الأولى — إنشاء نموذج التسجيل ومعالج البيانات. لا يتم تخزين كلمة المرور أبدًا في شكل نصي صريح — نستخدم الدالة password_hash().
2.1. نموذج التسجيل (register.php)
<form method="post" action="register_handler.php"> <input type="text" name="username" placeholder="اسم المستخدم" required> <input type="email" name="email" placeholder="البريد الإلكتروني" required> <input type="password" name="password" placeholder="كلمة المرور" required> <button type="submit">تسجيل</button></form>2.2. معالج التسجيل (register_handler.php)
<?php// الاتصال بقاعدة البيانات (PDO)$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$username = $_POST['username'];$email = $_POST['email'];$password = password_hash($_POST['password'], PASSWORD_BCRYPT); // نقوم بالتجزئة
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");$stmt->execute([$username, $email, $password]);
header('Location: login.php');?>استخدم
PASSWORD_BCRYPT— فهو يُنشئ تلقائيًا ملحًا (salt) ويعتبر آمنًا بما فيه الكفاية.
3. المصادقة (تسجيل الدخول)
عند تسجيل الدخول، نقوم بمقارنة كلمة المرور المُدخلة مع التجزئة من قاعدة البيانات باستخدام password_verify() وننشئ جلسة.
3.1. نموذج تسجيل الدخول (login.php)
<form method="post" action="login_handler.php"> <input type="text" name="username" placeholder="اسم المستخدم" required> <input type="password" name="password" placeholder="كلمة المرور" required> <button type="submit">دخول</button></form>3.2. معالج تسجيل الدخول (login_handler.php)
<?phpsession_start();$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$username = $_POST['username'];$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");$stmt->execute([$username]);$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) { // المصادقة ناجحة $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; $_SESSION['role'] = $user['role']; // للتفويض header('Location: dashboard.php');} else { echo "اسم المستخدم أو كلمة المرور غير صحيحة";}?>4. التفويض (تحديد الصلاحيات)
بعد المصادقة، يحصل المستخدم على دور (مثل 'user', 'admin', 'moderator'). يتحقق التفويض من هذا الدور قبل تنفيذ الإجراءات.
4.1. التحقق البسيط من الدور
<?phpsession_start();
// نتحقق مما إذا كان المستخدم