Desenvolvimento

13 ago, 2014

10 boas práticas para tornar seus aplicativos mais seguros – Parte 03

Publicidade

Esta é terceira parte de uma série de artigos sobre as Top 10 boas práticas proativas da OWASP para desenvolvimento de aplicativos seguros.

Sua primeira linha de defesa contra ataques deve iniciar pela conferência de todos os dados que sejam provenientes de fontes não confiáveis. A validação da entrada de dados é fundamental para a segurança do aplicativo, e é também uma parte básica da programação defensiva.
Isso é simples e parece óbvio – mas muitas vezes é feito de forma errada.

Não confie em validação feita no lado cliente

Um erro comum é contar com a validação do lado cliente para detectar potenciais problemas. A validação no lado cliente é útil para fornecer feedback imediato sobre a utilização da interface do usuário, mas não vai proteger seu sistema, especialmente em aplicativos web. Um invasor pode encontrar uma maneira de inserir-se entre o navegador e o aplicativo, o que pode ser feito usando um proxy, que pode trabalhar com qualquer um dos dados, incluindo os campos de cabeçalho, outros dados ocultos e também após a edição dos dados no lado cliente. Os dados de um cliente, especialmente um cliente fora da sua rede, nunca devem ser confiáveis.

Outro erro comum é contar com a verificação ou validação através de uma “lista negra” para tentar pegar dados conhecidos que estejam incorretos. Essa é uma técnica fraca: você não pode ter certeza de que realmente vai pegar todas as incongruências ou dados maliciosos, e as verificações de dados em lista negra podem ser subvertidas através de codificação (dupla) e outros truques.

Lista branca de validação

A OWASP recomenda que sejam utilizadas sempre restrições positivas – como a validação através de uma lista branca – em que são definidos o tipo e o tamanho aceitável do dado, todos os valores permitidos e o uso de expressões regulares (regex). Um exemplo dos controles proativos – a expressão regular para um campo de senha pode ser:

^(?=.*[a-z])(?=.*[A-Z]) (?=.*\d) (?=.*[@#$%]).{10,64}$

Essa expressão regular garante que uma senha possui de 10 a 64 caracteres de comprimento e inclui pelo menos uma letra maiúscula, uma letra minúscula, um número e um caractere especial (um ou mais usos de @, #, $, ou %).

Validação por meio de uma lista branca é trivial para dados enumerados: dias da semana, meses do ano… qualquer coisa que você ache que cabe em uma lista definida. Para outros tipos de dados comuns (como as datas e os fusos horários, tipos numéricos, moedas, endereços de e-mail, endereços IP, URLs, nomes de domínio e números de cartão de crédito), uma opção seria utilizar a biblioteca Apache Commons Validator.

A validação de campos de formato de texto livre (nomes de pessoas, campos de comentários etc.) deve ser especialmente formatada como campos de texto puro, o que pode ser mais difícil ou então que contenham caracteres especiais, como forma de marcação:

“Se o seu aplicativo lida com marcação – a entrada de dados não confiáveis pode conter HTML, supostamente -, pode ser muito difícil validar. A codificação também é difícil, uma vez que iria quebrar todos os códigos que deveriam ser verificados na entrada dos dados. Portanto, será preciso utilizar uma biblioteca que possa analisar o código HTML limpo formatado com a biblioteca OWASP Java HTML Sanitizer. Uma expressão regular não é a ferramenta certa para analisar e higienizar HTML não confiável”.

Você pode testar o quão sólida está a sua validação de entrada de dados com diferentes ferramentas, como fuzzers ou análise de verificação estática de código (utilizando ferramentas que percorrem e analisam todos os caminhos da execução do código e identificam quando estão sendo feitas referências de dados que não foram validados) e, em última análise, por meio de testes exploratórios manuais.

No próximo artigo, vou abordar os controles de acesso. Como fazer e como não fazer.

Confira a segunda parte aqui.

***

Artigo traduzido pela Redação iMasters com autorização do autor. Publicado originalmente em http://swreflections.blogspot.com.br/2014/06/10-things-you-can-do-to-make-your-app_11.html