شرح صفوف ومحتوى الفقرة
إذا أظهر نموذج الدخول رسالة "البريد غير موجود" منفصلة عن "كلمة المرور خاطئة"، سيتمكن المهاجم من اكتشاف عناوين البريد المسجلة؛ لذا أرجع دائماً رسالة خطأ موحدة للحالتين.
- استخدم نفس الرسالة الموحدة:
"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";