انتقل إلى محتوى الدرس

Preventing User Enumeration in Errors منع كشف وجود البريد عبر رسائل الخطأ الموحدة

نفّذ نظام تسجيل دخول آمن والتحقق من الهوية وتجديد الجلسة وحراس حماية الصفحات وميزة تذكرني وتسجيل الخروج النظيف في PHP 8.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

إذا أظهر نموذج الدخول رسالة "البريد غير موجود" منفصلة عن "كلمة المرور خاطئة"، سيتمكن المهاجم من اكتشاف عناوين البريد المسجلة؛ لذا أرجع دائماً رسالة خطأ موحدة للحالتين.

  • استخدم نفس الرسالة الموحدة: "Invalid email or password." سواء لم يوجد البريد أو فشلت دالة password_verify().
  • نفّذ فحص password_verify() وهمياً عند عدم وجود البريد لتوحيد زمن الاستجابة ومنع هجمات التوقيت.
  • قيّد عدد محاولات الدخول الفاشلة المتتالية لنفس العنوان أو البريد.

حتى عندما لا يوجد السجل، فإن استدعاء password_verify() مع تجزئة ثابتة يمنع كشف وجود الحساب عبر فرق زمن الاستجابة.

PHP
<?php

$dummyHash = '$2y$10$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG';
$userRow = false; // Email not found in DB
$inputPass = 'guess123';

$hashToCheck = $userRow ? $userRow['password_hash'] : $dummyHash;
$isValid = password_verify($inputPass, $hashToCheck) && $userRow !== false;

echo $isValid ? "Welcome\n" : "Invalid email or password.\n";