Trilhas
/
C#
C#
/
Exercícios
/
Sistema de autenticação
Sistema de autenticação

Sistema de autenticação

Exercício de aprendizagem

Introdução

Constantes

O modificador const pode ser (e em geral deve ser) aplicado a qualquer campo cujo valor seja conhecido em tempo de compilação e não mude durante o tempo de vida do programa.

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

O modificador readonly pode ser (e em geral deve ser) aplicado a qualquer campo que não possa ser declarado const, cujo valor não mude durante o tempo de vida do programa e que seja definido por um inicializador embutido ou durante a instanciação (pelo construtor ou por um método chamado pelo construtor).

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

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

Cópia defensiva

Em situações sensíveis à segurança (ou até simplesmente em uma base de código grande, onde as pessoas desenvolvedoras têm prioridades e objetivos diferentes), você deve evitar que a API pública de uma classe seja contornada ao aceitar e armazenar parâmetros mutáveis de um método ou ao expor um membro mutável de uma classe por meio de um valor de retorno ou como parâmetro out.

Coleções somente leitura

Embora o modificador readonly impeça que o valor ou a referência de um campo seja sobrescrito, ele não oferece nenhuma proteção para os membros de um tipo de referência.

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

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

Para garantir que todos os membros de um tipo de referência fiquem protegidos, os campos podem ser declarados readonly e propriedades automáticas podem ser definidas sem um acessador set.

A Base Class Library (BCL) oferece algumas versões somente leitura de coleções para quando é preciso impedir que os membros de uma coleção sejam atualizados. Elas vêm na forma de wrappers:

  • ReadOnlyDictionary<T> expõe um Dictionary<T> como somente leitura.
  • ReadOnlyCollection<T> expõe um List<T> como somente leitura.

Instruções

O sistema de autenticação que você viu pela última vez em developer-privileges precisa de atenção. Sua tarefa é fazer uma limpeza no código. Um projeto de limpeza como esse não só vai facilitar a vida de quem for manter o código no futuro, como também vai revelar e corrigir algumas vulnerabilidades de segurança.

1. Definir campos e propriedades apropriados como const

Esta é uma tarefa de refatoração. Adicione o modificador const a qualquer membro de Authenticator ou Identity que você considere apropriado.

2. Definir campos apropriados como readonly

Esta é uma tarefa de refatoração. Adicione o modificador readonly a qualquer campo da classe Authenticator ou da struct Identity que você considere apropriado.

3. Garanta que a classe não possa ser alterada depois de criada

Remova o acessador set ou torne-o private em qualquer propriedade apropriada da classe Authenticator ou da struct Identity.

4. Garanta que não seja possível adulterar o admin

No momento, o campo de identidade do admin é retornado por uma chamada a Admin. Isso não é ideal, pois quem chama pode modificar o campo. Encontre uma forma de impedir que quem chama modifique os detalhes do admin no objeto Authenticator.

5. Garanta que não seja possível adulterar os desenvolvedores

No momento, o dicionário que contém as identidades privilegiadas de desenvolvedores definidas diretamente no código é retornado por uma chamada a GetDevelopers(). Isso não é ideal, pois quem chama pode modificar o dicionário. Encontre uma forma de impedir que quem chama modifique os detalhes dos desenvolvedores no objeto Authenticator.

Editar via GitHub O link abre em uma nova janela ou aba
C# Exercism

Tudo pronto para começar Sistema de autenticação?

Crie sua conta no Exercism para aprender e dominar C# com 62 conceitos178 exercícios e mentoria humana de verdade, tudo de graça.