Percursos
/
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 aplicado (e, em geral, deve ser) 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 aplicado (e, em geral, deve ser) a qualquer campo que não possa ser declarado const, cujo valor não mude durante o tempo de vida do programa e seja definido por um inicializador inline 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 do ponto de vista da segurança (ou até simplesmente numa base de código grande, onde os programadores têm prioridades e objetivos diferentes) deves evitar que a API pública de uma classe seja contornada, aceitando e guardando parâmetros mutáveis de um método ou expondo um membro mutável de uma classe através de um valor devolvido ou como parâmetro out.

Coleções só de leitura

Embora o modificador readonly impeça que o valor ou a referência de um campo seja substituído, não oferece qualquer 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 ficam protegidos, os campos podem ser declarados readonly e as propriedades automáticas podem ser definidas sem um acessor set.

A Base Class Library (BCL) fornece algumas versões só de leitura de coleções para quando é preciso impedir que os membros de uma coleção sejam atualizados. Surgem na forma de wrappers:

  • ReadOnlyDictionary<T> expõe um Dictionary<T> como só de leitura.
  • ReadOnlyCollection<T> expõe uma List<T> como só de leitura.

Instruções

O sistema de autenticação que viste pela última vez em developer-privileges precisa de alguma atenção. Foi-te atribuída a tarefa de limpar o código. Um projeto de limpeza destes não só facilita a vida aos futuros responsáveis pela manutenção, como também revela e corrige algumas vulnerabilidades de segurança.

1. Define como const os campos e as propriedades adequados

Esta é uma tarefa de refatoração. Adiciona o modificador const a todos os membros de Authenticator ou Identity que consideres adequados.

2. Define os campos adequados como readonly

Esta é uma tarefa de refatoração. Adiciona o modificador readonly a todos os campos da classe Authenticator ou da estrutura Identity que consideres adequados.

3. Garante que a classe não pode ser alterada depois de criada

Remove o acessor set ou torna-o private em qualquer propriedade adequada da classe Authenticator ou da estrutura Identity.

4. Garante que não é possível adulterar o administrador

Neste momento, o campo de identidade do administrador é devolvido por uma chamada a Admin. Isto não é o ideal, pois quem chama pode modificar o campo. Encontra uma forma de impedir que quem chama modifique os dados do administrador no objeto Authenticator.

5. Garante que não é possível adulterar os programadores

Neste momento, o dicionário que contém as identidades de programadores privilegiados codificadas diretamente é devolvido por uma chamada a GetDevelopers(). Isto não é o ideal, pois quem chama pode modificar o dicionário. Encontra uma forma de impedir que quem chama modifique os dados dos programadores no objeto Authenticator.

Editar via GitHub A ligação abre numa nova janela ou separador
C# Exercism

Estás pronto para começar Sistema de autenticação?

Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.