Треки
/
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 вправ та справжнє наставництво від людей, і все це безкоштовно.