مسیرها
/
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. مطمئن شوید که کلاس پس از ساخته‌شدن قابل تغییر نیست

برای هر ویژگی مناسب در کلاس Authenticator یا ساختار Identity، دسترس‌گر set را حذف کنید یا آن را private کنید.

4. مطمئن شوید که نمی‌توان ادمین را دست‌کاری کرد

در حال حاضر، فیلد هویتِ ادمین با فراخوانی Admin برگردانده می‌شود. این ایده‌آل نیست، چون فراخواننده می‌تواند فیلد را تغییر دهد. راهی پیدا کنید که فراخواننده نتواند جزئیات ادمین را روی شیء Authenticator تغییر دهد.

5. مطمئن شوید که نمی‌توان توسعه‌دهندگان را دست‌کاری کرد

در حال حاضر، دیکشنری‌ای که هویت‌های هاردکدشده‌ی توسعه‌دهندگان ممتاز را نگه می‌دارد، با فراخوانی GetDevelopers() برگردانده می‌شود. این ایده‌آل نیست، چون فراخواننده می‌تواند دیکشنری را تغییر دهد. راهی پیدا کنید که فراخواننده نتواند جزئیات توسعه‌دهندگان را روی شیء Authenticator تغییر دهد.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
C# Exercism

آماده‌اید سیستم احراز هویت را شروع کنید؟

در Exercism ثبت‌نام کنید تا C# را همراه با 62 مفهوم178 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.