كيفية تأمين طلبات الويب باستخدام Nonces
المشكلة
وجد مستخدم طريقة لاستغلال نظام التحقق من صحة الطلب لنظام تسجيل موقع الويب من خلال تكرار طلبات HTTP عالية القيمة. هذا يعرض سلامة وموثوقية النظام للخطر.
الحل: تنفيذ نظام Nonce
Nonces (الرقم المستخدم مرة واحدة) هي قيم تمنع هجمات إعادة تشغيل الطلب عن طريق التأكد من عدم تنفيذ طلب معين. صنع من قبل. فيما يلي طريقة شائعة وآمنة لتنفيذ نظام nonce:
إنشاء والتحقق من جانب الخادم
وظيفة getNonce()
يحدد العميل الذي يقدم الطلب (على سبيل المثال، من خلال اسم المستخدم، الجلسة).- ينشئ رقمًا عشوائيًا باستخدام وظيفة تجزئة آمنة (على سبيل المثال، SHA512).
- يخزن الرقم في قاعدة بيانات مرتبطة بـ معرف العميل.
- إرجاع الرقم إلى العميل.
verifyNonce() وظيفة
جلب الرقم المخزن مسبقًا لمعرف العميل.- يزيل الرقم nonce من قاعدة البيانات (لمنع إعادة استخدامه).
- ينشئ تجزئة مع الرقم nonce المقدم من العميل (cnonce)، وبيانات الطلب، و ملح سري.
- يقارن التجزئة التي تم إنشاؤها بالتجزئة المقدمة من قبل العميل.
- يرجع صحيحًا إذا كانت التجزئة متطابقة، مما يشير إلى رقم صالح.
العميل -استخدام الجانب Nonce
وظيفة sendData ()
يسترد الرقم من الخادم باستخدام وظيفة getNonce (). -
ينشئ nonce الخاص بالعميل (cnonce) باستخدام وظيفة التجزئة الآمنة.- يقوم بربط رقم الخادم ورقم العميل وبيانات الطلب.
- ينشئ تجزئة من القيمة المتسلسلة.
- يرسل الطلب إلى الخادم، بما في ذلك البيانات والبيانات والتجزئة.
اعتبارات الأمان
- إنشاء عشوائي: The makeRandomString( ) يجب أن تولد الدالة أرقامًا عشوائية لا يمكن التنبؤ بها إلى حد كبير لتعزيز الأمان.
- وظيفة التجزئة الآمنة: استخدم وظيفة تجزئة قوية مثل SHA512 أو bcrypt لحسابات التجزئة غير المرتبطة.
- الاستخدام الفردي لكل طلب: يجب استخدام Nonces مرة واحدة فقط وإزالتها من التخزين لمنع هجمات إعادة التشغيل.