محتويات الدورة

Node.js / المتوسط: حدود التطبيق / الدرس 12

مفاهيم التحقق من الهوية والصلاحيات

افصل الهوية عن الإذن واحم الاعتمادات وافهم الجلسات دون اختراع بروتوكول هوية للإنتاج.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اشرح المفاهيم والمفاضلات المتعلقة بموضوع «مفاهيم التحقق من الهوية والصلاحيات».
  • توقع المثالين وتحقق من مخرجاتهما وسلوك تنظيف الموارد فيهما.
  • شخّص الإخفاقات الثلاثة الشائعة وطبق الحلول المشروحة على مدخلات مشابهة.

الهوية لا تعني الإذن

يثبت التحقق من الهوية الفاعل، وتقرر الصلاحيات جواز عملية محددة على مورد محدد. لا تمنح الجلسة الصحيحة صاحبها كل السجلات. ابدأ بالمنع وافحص الوصول على الخادم لكل عملية محمية. يعرض المثال الأول سياسة صغيرة للمالك أو المدير على كائنات اصطناعية، مستقلة عن HTTP لاختبار قاعدة العمل مباشرة. لا تثق بدور أو معرف مالك لمجرد أن المتصفح أرسله في حقل مخفي.

معاملة الاعتمادات كبيانات حساسة

تحقق من كلمات المرور بمخطط تجزئة مناسب وأملاح فريدة ومعاملات عمل مدروسة، عبر مكتبة مراجعة أو خدمة هوية. ليست التجزئة السريعة البسيطة استراتيجية لتخزينها. الرموز ومعرفات الجلسات اعتمادات أيضا؛ فلا تسجلها أو تضعها في الروابط أو تكشفها للتحليلات. انقلها عبر TLS وحدد التدوير والإلغاء. ينبغي ألا يكشف فشل الهوية وجود الحساب دون حاجة، وتحتاج المحاولات المتكررة إلى ضوابط تراعي إساءة الحساب والشبكة.

فهم خيارات الجلسات

يشير معرف جلسة معتم إلى حالة على الخادم، ويحمل الرمز الموقّع ادعاءات تُفحص سلامتها، لكن التوقيع لا يشفرها. يحتاج الخياران إلى انتهاء صلاحية وسياسة جهة إصدار وجمهور عند اللزوم وخطة للاعتمادات المخترقة. تقلل خصائص HttpOnly وSecure وSameSite المناسبة مخاطر معينة في ملفات الارتباط، ولا تستبدل حماية CSRF أو منع XSS. وتختلف صلاحية الأصل عن الهوية؛ إذ تضبط CORS وصول المتصفح إلى الاستجابات ولا تمنح إذن خادم.

javascript مثال كامل: فهم خيارات الجلسات
function mayEdit(actor, resource) {
  return Boolean(actor && (actor.role === 'admin' || actor.id === resource.ownerId));
}
const resource = { ownerId: 7 };
console.log(mayEdit(null, resource));
console.log(mayEdit({ id: 7, role: 'user' }, resource));
console.log(mayEdit({ id: 8, role: 'user' }, resource));
console.log(mayEdit({ id: 8, role: 'admin' }, resource));
الناتج المتوقع
false
true
false
true

تمنع السياسة المجهول والمستخدم غير المرتبط وتسمح للمالك ولدور مدير موثوق من مصدر مستقل.

مقارنة الأسرار بالأدوات الصحيحة

يستخدم المثال الثاني timingSafeEqual على مخازن بايتات اصطناعية متساوية الطول. تتطلب الواجهة تساوي الطول، وقد يسرب التحليل أو البحث المحيط معلومات زمنية. لا ينفذ العرض تحقق كلمة مرور أو مدقق رموز كاملا. استخدم مكتبات بروتوكول معروفة وافحص الادعاءات المطلوبة بدلا من فك النص فقط. أبق المفاتيح خارج الشيفرة وارفض الخوارزميات غير المدعومة في إعداد المكتبة وافصل اعتمادات التطوير عن الأسرار المنشورة. يأتي الأمان من المسار الكامل لا دالة تشفير واحدة.

javascript مثال كامل: مقارنة الأسرار بالأدوات الصحيحة
import { timingSafeEqual } from 'node:crypto';
function sameBytes(candidate, expected) {
  const a = Buffer.from(candidate, 'utf8');
  const b = Buffer.from(expected, 'utf8');
  return a.length === b.length && timingSafeEqual(a, b);
}
console.log(sameBytes('lab-token-a', 'lab-token-a'));
console.log(sameBytes('lab-token-b', 'lab-token-a'));
console.log(sameBytes('short', 'lab-token-a'));
الناتج المتوقع
true
false
false

توضح النصوص الاصطناعية العامة مقارنة بايتات متساوية الطول فقط. ليست اعتمادات ولا يجوز تحويلها إلى أسرار نشر.

اختبار الصلاحيات كمصفوفة

احصر الفاعلين والعمليات والملكية والحالة ذات الصلة. اختبر المجهول والمالك ومستخدما آخر والمدير والاعتمادات المنتهية أو الملغاة. قد تعتمد القاعدة على عضوية المؤسسة وحالة المورد مع الدور. طبّق شرط الملكية قرب التخزين كي لا يتجاوزه بحث لاحق غير مفحوص. سجّل تغييرات الامتيازات بمعرفات آمنة للفاعل والمورد دون أسرار. وعند تعقد المتطلبات اجمع القواعد وراجعها بعناية تضاهي أذونات قاعدة البيانات.

الأخطاء الشائعة وإصلاحها

يكشف رمز موقّع ادعاءات خاصة

لماذا يحدث؟
اعتُبر التوقيع تشفيرا.
كيف تصلحه؟
احذف الادعاءات الحساسة أو اختر تصميما مراجعا للسرية.
كيف تتجنب تكراره؟
راجع ما يستطيع كل حامل رمز فكّه.

يعدل مستخدم سجل مستخدم آخر

لماذا يحدث؟
فحص الخادم الدخول دون صلاحية المورد.
كيف تصلحه؟
طبّق الملكية أو الإذن على العملية الفعلية.
كيف تتجنب تكراره؟
اختبر المستخدم غير المرتبط لكل مسار محمي.

ترمي timingSafeEqual خطأ طول

لماذا يحدث؟
اختلف طول مخزني البايتات.
كيف تصلحه؟
تحقق من الطولين قبل الاستدعاء.
كيف تتجنب تكراره؟
فضّل مكونات هوية مراجعة على بروتوكولات مخصصة.

اختبر فهمك

1. يخفي المتصفح زر الإدارة. هل يحمي ذلك نقطة الخادم؟

اعرض الحل المشروح

لا. يستطيع المستدعي إرسال الطلب مباشرة. تحقق من هوية الفاعل وطبق الصلاحيات على الخادم للنقطة والمورد. يفيد إخفاء الزر العرض فقط. اختبر طلب مستخدم عادي مباشرة واشترط الرفض الموثق.

2. حدد نتائج المجهول والمالك والمستخدم الآخر والمدير في السياسة.

اعرض الحل المشروح

النتائج false وtrue وfalse وtrue. اجعل مصدر الدور موثوقا واقرأ الملكية من التخزين. إذا أمكن تغيير الملكية بالتزامن فاربط شرط الإذن بالتحديث بدلا من فحص سابق قديم.

أهم ما تعلمته

  • يثبت التحقق من الهوية الفاعل، وتقرر الصلاحيات جواز عملية محددة على مورد محدد.
  • تحقق من كلمات المرور بمخطط تجزئة مناسب وأملاح فريدة ومعاملات عمل مدروسة، عبر مكتبة مراجعة أو خدمة هوية.
  • احصر الفاعلين والعمليات والملكية والحالة ذات الصلة.

المراجع الرسمية