Pular para o conteúdo
9 min de leitura

Validação de formulários: no cliente para UX, no servidor para segurança

Por Equipe Tech do Sonne ·

Por que validar no cliente e no servidor não é redundância: um cuida da experiência, o outro da segurança. A mecânica e a divisão correta de papéis.

Neste artigo

Todo formulário na web faz a mesma pergunta implícita: os dados que o usuário digitou são aceitáveis? Um e-mail está no formato certo? Um campo obrigatório foi preenchido? Uma senha atende às regras? Responder a essa pergunta é o que chamamos de validação, e ela acontece em dois lugares muito diferentes — no navegador do usuário e no servidor — por dois motivos completamente distintos. Confundir esses dois lugares, ou pior, achar que fazer nos dois é redundância desnecessária, é uma das raízes mais comuns de aplicações inseguras.

A frase que resume tudo é direta: valida-se no cliente pela experiência, valida-se no servidor pela segurança. Não são a mesma validação feita duas vezes por desconfiança; são duas validações com propósitos diferentes que se complementam. A do cliente existe para ajudar o usuário a acertar, dando resposta imediata e evitando a frustração de descobrir um erro só depois de enviar. A do servidor existe porque nada que vem do cliente pode ser confiado, e é a única linha de defesa real contra dados maliciosos ou inválidos. Entender por que ambas são necessárias, e o que cada uma pode e não pode garantir, é essencial.

Neste artigo vamos separar com clareza esses dois papéis. Veremos o que a validação no cliente entrega e por que ela nunca é suficiente sozinha, por que a validação no servidor é inegociável e como ela é a verdadeira guardiã, e como as duas se encaixam em um formulário bem construído. É um tema em que a intuição engana, e onde a divisão correta de responsabilidades faz diferença entre um sistema robusto e um cheio de brechas.

A validação no cliente: serviço ao usuário#

A validação no cliente acontece no navegador, enquanto o usuário preenche o formulário, antes de qualquer coisa ser enviada. Seu propósito é ajudar a pessoa a preencher corretamente, com resposta imediata. Quando o usuário deixa um campo obrigatório em branco e tenta avançar, ele vê o aviso na hora; quando digita um e-mail malformado, o campo sinaliza antes do envio; quando uma senha não atende às regras, o retorno é instantâneo. Tudo isso melhora enormemente a experiência, porque transforma o preenchimento em um diálogo, em vez de um tiro no escuro que só revela os erros depois de enviar e esperar.

O ganho é concreto e mensurável em satisfação. Sem validação no cliente, o usuário preenche o formulário inteiro, envia, espera a ida e volta à rede e só então descobre que errou um campo lá no começo — e muitas vezes precisa preencher tudo de novo. Com validação no cliente, os erros são apontados no momento em que acontecem, junto do campo, com orientação clara. É a diferença entre um formulário que colabora e um que pune. Por isso, mesmo não sendo uma barreira de segurança, a validação no cliente é parte essencial de qualquer formulário bem-feito.

O que o navegador já oferece de graça#

Muita validação no cliente nem exige código elaborado, porque o próprio navegador oferece recursos nativos. Marcar um campo como obrigatório, declarar que ele espera um e-mail ou um número, definir um comprimento mínimo ou máximo, especificar um padrão que o valor deve seguir — tudo isso o navegador entende e aplica sozinho, mostrando mensagens e impedindo o envio quando as regras não são atendidas. Usar esses recursos nativos antes de partir para validação personalizada é bom senso: eles são acessíveis, funcionam de forma consistente e não custam manutenção de código. A validação personalizada entra para as regras que o navegador não conhece, como conferir se duas senhas coincidem ou se uma data faz sentido no contexto.

Por que o cliente nunca basta#

Aqui está o ponto que separa quem entende segurança de quem não entende: toda validação no cliente pode ser burlada, trivialmente. O código que roda no navegador está inteiramente sob o controle do usuário. Ele pode desativar o JavaScript, pode alterar o comportamento da página, pode modificar os campos, e — o mais importante — pode simplesmente ignorar o formulário por completo e enviar uma requisição diretamente ao servidor, sem passar por nenhuma das verificações que você programou no cliente.

Essa última possibilidade é a que muitos desenvolvedores esquecem. O formulário na página é apenas uma interface conveniente para produzir uma requisição HTTP. Qualquer pessoa consegue fabricar essa mesma requisição por conta própria, com quaisquer dados que quiser, e mandá-la ao servidor. Nesse caminho, nenhuma linha da sua validação no cliente é executada — ela simplesmente não existe do ponto de vista de quem monta a requisição na mão. Portanto, confiar na validação no cliente para garantir a integridade dos dados é construir uma porta trancada ao lado de uma parede que não existe.

O cliente valida para o usuário honesto#

A forma correta de enxergar a validação no cliente é esta: ela serve ao usuário honesto que está usando o formulário como previsto, ajudando-o a acertar. Ela não faz absolutamente nada contra quem quer contornar as regras, porque essa pessoa não passa por ela. É uma ferramenta de experiência, não de defesa. Tratá-la como defesa é o erro conceitual que abre a porta para dados inválidos e ataques chegarem ao servidor como se fossem legítimos. A validação no cliente é uma cortesia, não uma trava.

A validação no servidor: a guardiã real#

A validação no servidor acontece depois que a requisição chega, no ambiente que o usuário não controla. Ela é a única validação que realmente conta para a integridade e a segurança do sistema, porque é a única que não pode ser burlada pelo cliente. Todo dado que chega ao servidor precisa ser tratado como potencialmente malicioso, malformado ou inconsistente, e verificado antes de qualquer uso — independentemente do que a validação no cliente supostamente já checou.

Essa validação vai além de conferir formato. Ela verifica se os campos obrigatórios vieram, se os tipos estão corretos, se os valores estão dentro de faixas aceitáveis, mas também aplica regras que só o servidor conhece: se o e-mail já está cadastrado, se o usuário tem permissão para aquela operação, se o valor de um campo é coerente com o estado atual dos dados. O servidor tem acesso à verdade — ao banco, às regras de negócio, ao contexto completo — que o cliente não tem. É por isso que certas validações só podem acontecer aqui.

Validar não é só rejeitar formato#

Um aspecto crucial da validação no servidor é que ela é a fronteira onde os dados hostis são barrados antes de tocarem em partes sensíveis do sistema. Um valor que deveria ser um número mas veio como texto, um campo de texto absurdamente longo tentando estourar limites, caracteres especiais tentando se infiltrar em consultas ou em saídas — tudo isso precisa ser detectado e recusado no servidor. A validação, aqui, é a primeira camada de uma postura defensiva: nunca confiar na entrada, sempre verificar antes de processar. Um servidor que valida bem devolve erros claros para dados inválidos em vez de quebrar, e nunca deixa um dado malformado seguir adiante para causar estrago em uma consulta ao banco ou na tela de outro usuário.

Como as duas se encaixam#

Com os papéis claros, o desenho correto de um formulário emerge naturalmente. A validação no cliente vem primeiro, na interface, para dar ao usuário honesto retorno imediato e evitar idas e voltas desnecessárias ao servidor — um erro pego no cliente poupa uma requisição. A validação no servidor vem depois, sempre, sem exceção, tratando cada requisição como se a validação no cliente não tivesse existido, porque do ponto de vista da segurança ela realmente pode não ter existido.

Repare que não há redundância desperdiçada nisso. As duas validações fazem coisas parcialmente sobrepostas mas com propósitos distintos. A do cliente otimiza a experiência; a do servidor garante a correção. Mesmo que verifiquem a mesma regra de formato de e-mail, elas o fazem por razões diferentes: uma para avisar o usuário rápido, outra para nunca deixar um e-mail inválido entrar no sistema. Remover a do cliente piora a experiência; remover a do servidor abre um buraco de segurança. Nenhuma substitui a outra.

O retorno de erro também importa#

Um detalhe que fecha o ciclo é como o servidor comunica os erros de volta. Quando a validação no servidor rejeita algo — inclusive algo que passou pelo cliente porque veio de uma requisição fabricada —, ele precisa devolver uma resposta clara, indicando o que estava errado, para que a interface possa mostrar isso ao usuário legítimo de forma útil. Assim, o formulário lida bem tanto com o usuário honesto que, por algum motivo, escapou da validação do cliente, quanto mantém a barreira firme contra requisições maliciosas. O erro devolvido pelo servidor precisa ser informativo o bastante para orientar, mas cuidadoso para não revelar detalhes internos que ajudem um atacante.

Fechando#

A validação de formulários é um caso exemplar de como a mesma tarefa aparente — conferir se os dados são aceitáveis — esconde dois propósitos que não podem ser confundidos. No cliente, a validação é um serviço ao usuário: rápida, imediata, orientadora, feita para quem usa o formulário do jeito previsto e quer acertar. No servidor, a validação é a defesa: inegociável, desconfiada, aplicada a toda requisição sem exceção, porque é a única que o usuário não consegue contornar.

O erro que arruína aplicações é achar que uma dispensa a outra. Confiar só no cliente é deixar a porta aberta para qualquer requisição fabricada. Validar só no servidor funciona para a segurança, mas entrega uma experiência pobre, cheia de idas e voltas frustrantes. A engenharia correta usa as duas, com consciência do que cada uma faz: o cliente para o usuário, o servidor para o sistema. Quando você internaliza que a validação no cliente é uma cortesia que qualquer um pode ignorar, e que a validação no servidor é a única verdade, você para de tratar formulários como formalidade e passa a construí-los como o que eles são — a fronteira por onde dados de origem desconhecida entram no seu sistema, e onde essa entrada precisa ser ao mesmo tempo amigável para os honestos e implacável para o resto.

Leituras relacionadas

Nenhum comentário ainda

Seja o primeiro a comentar.

Deixe seu comentário

Entre com sua conta Canverly para comentar. Você pode usar a mesma conta em qualquer site da rede.

Entrar com Canverly