quinta-feira, 3 de janeiro de 2008

Validação em JavaScript e Segurança

O termo "validação em JavaScript" é um pouco incorreto para descrever o processo de amparar os usuários no momento de preencher corretamente formulários. Na verdade, a linguagem server-side adotada executa a validação - JavaScript meramente provê uma assistência. Mas quando a validação e a assistência não vem da mesma origem, não faz mais do que confundir as pessoas.

Formulários web são os meios pelos quais o HTML se faz interativo - é através destes formulários que as aplicações web recebem dados dos usuários. As vezes estes dados podem não possuir restrições. Em outras ocasiões, os dados devem ser avaliados para garantir que os dados inseridos estão no formato correto, particularmente informações como endereços de e-mail, URLs e cartões de crédito. É sabido que a chave para dados bem formatados é a validação no lado do servidor, e o JavaScript apenas ajuda o usuário a saber o formato correto desejado sem ter que esperar por um processamento no lado do servidor. Desenvolvedores têm combinado funcionalidades do JavaScript com validações no lado do servidor. Contudo, a maioria das formas de validação realizam a mesma tarefa, usando tecnologias diferentes. Um sistema bem implementado e relativamente seguro implementa validações no lado do servidor e utiliza JavaScript para melhorar a interatividade com o usuário.

Estritamente falando a validação com JavaScript não é uma validação - apenas auxilia na entrada de dados. Qualquer um pode burlar o JavaScript; é uma ajuda, não a palavra final. Ele simplesmente ajuda a dar confiança para o usuário no momento de pressionar o botão para submeter as informações.

JavaScript fornece assistência quando construído separadamente à validação no lado do servidor, mas não é o ideal. Na pior das hipóteses, as duas validações irão funcionar diferentemente, e o que é válido no cliente não é válido no servidor. Na melhor das hipóteses, as validações irão trabalhar corretamente. Mas com a validação em vários locais, há uma crescente probabilidade de que apenas uma irá receber os dados atualizados quando mudanças forem requeridas, obtendo neste ponto resultados inconsistentes.

Um exemplo da obrigatoriedade do uso de validações no lado do servidor é quando da entrada de dados pelo usuário, onde tais dados interagem com o banco de dados. Dependendo de como os scripts do aplicativo web foram construídos, existe a possibilidade de tentar uma invasão indireta. Suponha que uma página tenha um campo que permite ao usuário digitar um palavra a ser buscada. Quando insere os dados e envia ao servidor, o script cria uma consulta simples:

SELECT * FROM tabela WHERE campo = 'padrao';

Como neste caso o caractere delimitador usado é o apóstrofo, pode-se enganar o sistema digitando algo como:
"padrao'; DELETE * FROM tabela;"

O resultado disto é que todos os dados da tabela "tabela" serão apagados. Ou seja, se existe apenas um mecanismo de validação em JavaScript que impessa de entrar com caracteres especiais SQL, este mecanismo pode ser facilmente burlado e a string contendo funções SQL irá para o servidor e será executada.

Finalmente, a validação no lado do servidor é requerida. JavaScript auxilia de maneira agradável. Se você busca segurança, pense primeiro em todas as possibilidades de validações no lado do servidor e só então valide com JavaScript.

Livre tradução de JavaScript: It's Just Not Validation!
Adaptado por Anderson Dias

0 comentários: