المسارات
/
C#
C#
/
التمارين
/
نظام المصادقة
نظام المصادقة

نظام المصادقة

تمرين تعلّمي

مقدمة

الثوابت

يمكن تطبيق المُعدِّل const (ويُستحسن عمومًا ذلك) على أي حقل تكون قيمته معروفة وقت الترجمة ولن تتغير خلال عمر البرنامج.

private const int num = 1729;
public const string title = "Grand" + " Master";

يمكن تطبيق المُعدِّل readonly (ويُستحسن عمومًا ذلك) على أي حقل لا يمكن جعله const، حيث لن تتغير قيمته خلال عمر البرنامج، ويُضبط إما بواسطة مهيّئ مضمّن أو أثناء الإنشاء (بواسطة المنشئ أو طريقة يستدعيها المنشئ).

private readonly int num;
private readonly System.Random rand = new System.Random();

public MyClass(int num)
{
    this.num = num;
}

النسخ الدفاعي

في المواقف الحساسة أمنيًا (أو حتى ببساطة في قاعدة كود كبيرة حيث يكون للمطورين أولويات وأجندات مختلفة)، ينبغي أن تتجنب السماح بالتحايل على واجهة API العامة لأي صنف عبر قبول وتخزين معاملات قابلة للتغيير لإحدى الطرق، أو عبر كشف عضو قابل للتغيير في صنف من خلال قيمة مُرجعة أو كمعامل out.

المجموعات للقراءة فقط

بينما يمنع المُعدِّل readonly الكتابة فوق القيمة أو المرجع في حقل ما، فإنه لا يوفر أي حماية لأعضاء نوع مرجعي.

readonly List<int> ints = new List<int>();

void Foo()
{
    ints.Add(1);    // ok
    ints = new List<int>(); // fails to compile
}

لضمان حماية جميع أعضاء نوع مرجعي، يمكن جعل الحقول readonly، ويمكن تعريف خصائص تلقائية بدون مُوصِّل set.

توفر مكتبة الصنف الأساسية (BCL) بعض الإصدارات للقراءة فقط من المجموعات عندما تكون هناك حاجة إلى منع تحديث أعضاء المجموعة. وتأتي هذه في شكل أغلفة:

  • يتيح ReadOnlyDictionary<T> استخدام Dictionary<T> للقراءة فقط.
  • يتيح ReadOnlyCollection<T> استخدام List<T> للقراءة فقط.

التعليمات

نظام المصادقة الذي رأيته آخر مرة في developer-privileges يحتاج إلى بعض العناية. وقد أُوكلت إليك مهمة تنظيف الكود. ولن يقتصر مشروع التنظيف هذا على تسهيل الحياة على القائمين على صيانته مستقبلًا، بل سيكشف عن بعض الثغرات الأمنية ويصلحها.

1. اضبط الحقول والخصائص المناسبة على const

هذه مهمة إعادة هيكلة. أضف المُعدِّل const إلى أي أعضاء في Authenticator أو Identity تراها مناسبة.

2. اضبط الحقول المناسبة على readonly

هذه مهمة إعادة هيكلة. أضف المُعدِّل readonly إلى أي حقول في صنف Authenticator أو بنية Identity تراها مناسبة.

3. تأكّد من أنه لا يمكن تغيير الصنف بعد إنشائه

أزل مُوصِّل set أو اجعله private لأي خاصية مناسبة في صنف Authenticator أو بنية Identity.

4. تأكّد من أنه لا يمكن التلاعب بالمدير

في الوقت الحالي، يُرجع استدعاء Admin حقل هوية المدير. وهذا ليس مثاليًا لأن المستدعي يمكنه تعديل الحقل. ابحث عن طريقة تمنع المستدعي من تعديل تفاصيل المدير على كائن Authenticator.

5. تأكّد من أنه لا يمكن التلاعب بالمطوّرين

في الوقت الحالي، يُرجع استدعاء GetDevelopers() القاموس الذي يحتوي على هويات المطوّرين ذوي الامتيازات المضمّنة بشكل ثابت. وهذا ليس مثاليًا لأن المستدعي يمكنه تعديل القاموس. ابحث عن طريقة تمنع المستدعي من تعديل تفاصيل المطوّرين على كائن Authenticator.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
C# Exercism

مستعد لبدء نظام المصادقة؟

سجّل في Exercism لتتعلّم وتتقن C# عبر 62 مفهومًا178 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.