شاشة تحقق في الغربان تطلب رمزا من رقمين ولا تضع أي حد لعدد المحاولات فتقدر تجرب كل الاحتمالات حتى يقبل الرمز
شاشة تحقق برمز من رقمين وزر تحقق الخادم يقبل أو يرفض ولا يحسب المحاولات إطلاقا فمئة محاولة تكفي لتغطية كل الاحتمالات
لماذا نجح الحل
غياب حد المحاولات يحول رمزا قصيرا إلى حماية بلا قيمة لأن المهاجم يجرب الفضاء كله بسرعة الحل حد للمحاولات لكل حساب وتأخير متصاعد وقفل مؤقت ورمز أطول
السبب الجذري
لا حد ولا تأخير ولا قفل على المحاولات الجذر غياب أي ضبط لمعدل المحاولات
كيف يصلح الكود
افرض حدا لكل حساب وتأخيرا متصاعدا وقفلا مؤقتا ورمزا أطول
الكود المصاب
app.post('/verify', (req, res) => {
res.json({ ok: req.body.code === otp }); // unlimited guesses
});
الكود الآمن
app.post('/verify', rateLimitPerAccount({ max: 5, window: '15m', lockAfter: 10 }), (req, res) => {
res.json({ ok: req.body.code === otp });
});
الأثر في الواقع
غياب حد المعدل يسمح بتخمين الرموز وكلمات المرور والرموز لمرة واحدة وهو سبب شائع لاختراق الحسابات
كيف يكتشفها المدافعون
المدافع يرصد كثرة المحاولات الفاشلة على حساب واحد ويفرض حدا وتأخيرا وقفلا