Esse artigo faz parte da revista .NET Magazine edição 64. Clique aqui para ler todos os artigos desta edição

Boas Práticas

Validation Application Block

Boas Práticas na construção de validações – Parte 1

 

 

Do que trata o artigo

Boas práticas, encapsulamento das validações de um determinado objeto.


Para que serve

Validação de objetos de forma a permitir reusabilidade entre componentes de uma aplicação e também suporte para validar entrada de informações em variados tipos de front-end.


Em que situação o tema é útil

Aplicações que necessitem validar objetos através de suas camadas mantendo um ponto único para configuração das regras de validação através de técnicas simples e de fácil manutenção.

 

Resumo do DevMan

         Este artigo, dividido em duas partes, apresentará o Validation Application Block, disponibilizado juntamente com a Enterprise Library e exemplos para criação de validações a partir das opções básicas do bloco ou estendendo suas classes para desenvolver validações mais complexas, veremos também as facilidades que este bloco oferece para tratar o input através de várias opções de front-end.

 

Desenvolver aplicações confiáveis e seguras requer um considerável esforço, sob o ponto de vista do usuário, esses requisitos são indispensáveis e na maioria dos casos determinantes para a utilização de uma aplicação. Entende-se por “confiável” a capacidade de um software realizar e manter seu funcionamento em circunstâncias de rotina, incluindo circunstâncias hostis e inesperadas, sendo assim, na medida em que aumentamos a confiabilidade de uma aplicação reduzimos a superfície de ataques e vulnerabilidades de segurança.

Grande parte das aplicações desenvolvidas tem por objetivo final armazenar informações relacionadas a um determinado negócio para posterior consulta. Não é difícil compreendermos rapidamente que uma informação armazenada de maneira distorcida ou imprópria para negócio constitui um grande problema. Um conjunto de regras de validação para a entrada e transporte de dados se faz necessário para garantirmos a consistência do armazenamento final, contudo a manutenção dessas regras de validação pode gerar uma sobrecarga de esforço além de abrir a possibilidade de discrepâncias entre as diversas camadas que o dado precisa percorrer do front-end até o banco de dados.

Felizmente, conciliar os aspectos de confiabilidade e segurança na entrada de dados de uma aplicação com facilidade de desenvolvimento e manutenção é um problema resolvido por alguns frameworks e bibliotecas disponíveis no mercado, que, aliado a boas práticas de codificação, destacam os bons softwares dos ruins.

Problemas intrínsecos ao input de dados das aplicações

Veremos a seguir alguns riscos inerentes à entrada de dados das aplicações bem como seu contexto:

·         Injeção de código Falando sobre segurança, quando uma aplicação permite que um usuário mal intencionado utilize técnicas (como injeção de código SQL, por exemplo) para realizar operações indevidas, as informações são expostas a danos muitas vezes irreversíveis ou de difícil reparação. A entrada de dados com validações eficazes seja por formulários Web, aplicações Windows Forms, Web Services, WCF, entre outros, é a primeira barreira contra distorções das informações ou ataques maliciosos;

·         HTML Embedding Este tipo de técnica de ataque consiste em informar tags de HTML nos inputs de formulários Web para que haja o acréscimo de informações no momento do browser renderizar uma página, podendo expor alguma falha de segurança;

·         Distorção da informação Imagine se um sistema Web que faz a inscrição de atletas da terceira idade para uma corrida permite que um adolescente de 14 anos consiga finalizar um cadastro sem que seja aplicada alguma regra para verificação de sua faixa etária. Bem, basta criar essas validações no formulário Web, certo? E se esse cadastro também estiver disponível através de uma aplicação Windows Forms num quiosque de um shopping ou ainda por um Web Services cujo front-end que o acessará será desenvolvido por terceiros? Replicamos as regras de validação? Colocamos tudo nos componentes de negócio permitindo que algumas camadas internas da aplicação recebam injeção de código?

·          

Combinar um conjunto de boas práticas com uma biblioteca de validação eficaz e extensível com suporte a diversos tipos de front-end é o objetivo do Validation Application Block, como veremos a seguir.

Apresentando o Validation Application Block

Disponibilizado a partir da versão 3.0 da Enterprise Library, em abril de 2007, o Validation Application Block oferece mecanismos para encapsulamento de validações de objetos e suporte para diversos tipos de front-end, através de facilidades como:

·         Definição das validações através de atributos nos membros de uma classe ou em arquivos de configuração semelhante aos demais blocos da Enterprise Library;

·         Conjunto de validações predefinidas para situações comuns, tais como: verificação de preenchimento de campo, tipo de dado, conjunto de valores possíveis, uso de regular expression entre outros;

·         Composição de validadores criando validações complexas, inclusive com associações entre membros de uma classe;

·         Organização das validações em grupos, permitindo acionamento de um conjunto de regras específico quando necessário;

·         Suporte nativo para integração com ASP.NET, Windows Forms e WCF;

 

As validações predefinidas disponibilizadas cobrem os itens descritos na Tabela 1.

 

Elemento

Descrição

Not Null Validator

Esse validador checa se o valor é diferente de nulo, usado quando queremos garantir a passagem de algum valor obrigatoriamente.

Contains Characters Validator

Valida se uma string contém determinados caracteres.

Date Time Range Validator

Verifica se uma data está contida em uma faixa predeterminada de variação.

Domain Validator

Valida a entrada contra um conjunto de valores possíveis predeterminados.

Enum Conversion Validator

Deve ser usado quando desejamos checar se um valor pode ser convertido para algum tipo de uma enumeração.

Object Collection Validator

Esse validador verifica se um objeto possui algum atributo definido por outro objeto com suas validações próprias e invoca a validação de cada elemento da cadeia de relacionamento.

Property Comparison Validator

Compara o valor a ser checado com o valor de uma propriedade do objeto.

Range Validator

Verifica se o valor está dentro de uma faixa predeterminada.

Regular Expression Validator

Checa se o valor corresponde ao padrão definido por uma regular expression.

Relative Date Time Validator

Realiza uma checagem sobre uma data para verificar se ela atende os critérios predefinidos.

String Length Validator

Esse validador verifica se uma string possui um tamanho mínimo e/ou máximo predefinido.

Type Conversion Validator

Checa se uma string pode ser convertida para um tipo específico.

And Composite Validator

Cria uma composição entre validadores de forma que todos devem ser verdadeiros, pode ser usado quando é necessário utilizar validações mais sofisticadas.

Or Composite Validator

Cria uma composição entre validadores de forma que se um deles for verdadeiro toda a composição será verdadeira.

Tabela 1. Validadores padrão disponíveis no Validation Application Block

 

Neste artigo utilizei a versão 4.1 da Enterprise Library, de outubro de 2008, disponível no link http://msdn.microsoft.com/entlib por ser a versão mais atualizada até então.

 

Nota do DevMan

As “expressões regulares” (regular expressions, ou apenas regex) fornecem um meio conciso e flexível para identificação de cadeias de caracteres em um dado texto, como padrões de caracteres, palavras ou caracteres especiais. São escritas em uma linguagem formal que pode ser interpretada por um processador de expressões regulares. No site http://www.regexlib.com/ você encontra uma extensa biblioteca de expressões regulares disponíveis para uso.

 

Cenário

Para execução do cenário apresentado neste artigo, utilizei o Visual Studio 2008 (com o Service Pack 1 instalado), onde foram criados dois projetos: um do tipo Class Library com o nome NetMag.Validation.Entidades e o outro do tipo Web Application, nomeado como NetMag.Validation.Web. No primeiro projeto guardaremos as classes que desejamos validar com o Validation Application Block (VAB) e no segundo veremos como fica a integração com o ASP.NET.

Nosso objetivo é disponibilizar um formulário de inscrição para um treinamento, inicialmente na plataforma Web, com os seguintes requisitos:

 

1.    O participante deverá ter no mínimo 16 anos de idade;

2.    O participante deverá informar um e-mail válido;

3.    A data de inscrição será válida por um período predeterminado;

4.    A inscrição será aberta em outros períodos durante o ano, por isso algumas configurações de validação devem ser criadas de forma a permitir uma fácil manutenção e flexíveis o suficiente para que sejam alteradas administrativamente, sem recodificação;

5.    O participante poderá informar um número de voucher para ganhar um desconto na inscrição, este número precisará ser validado;

6.    Futuramente a inscrição será disponibilizada em Windows Forms, e para tal, deseja-se manter as regras de validação centralizadas para fácil distribuição para interfaces de usuário distintas;

 

Criaremos uma classe chamada Participante dentro do projeto NetMag.Validation.Entidades, exatamente como descrito na Listagem 1.

 

Listagem 1. Código da classe que será validada pelo VAB

    1 using System;

    2 using NetMag.Validation.Entidades.Enumeradores;

    3 

    4 namespace NetMag.Validation.Entidades

    5 {

    6     public class Participante

    7     {

    8         #region Propriedades

    9         public string Nome { get; private set; }

   10         public string Email { get; private set; }

   11         public DateTime DataNascimento { get; private set; }       

   12         public DateTime DataInscricao { get; private set; }       

   13         public string MeioComunicacao { get; private set; }

   14         public string Voucher { get; private set; }

   15         public string Comentarios { get; private set; }

   16         #endregion

   17 

   18         #region Construtores

   19         public Participante() { }

   20 

   21         public Participante( ...

Quer ler esse conteúdo completo? Tenha acesso completo