JavaScript: validação do lado do cliente vs. validação do lado do servidor

Qual é melhor para fazer a validação do lado do cliente ou do lado do servidor?

Na nossa situação estamos usando

  • jQuery e MVC.
  • Dados JSON para passar entre o nosso View e o Controller.

Muito da validação que faço é validar os dados à medida que os usuários os inserem. Por exemplo, eu uso o evento keypress para evitar letras em uma checkbox de texto, definir um número máximo de caracteres e um número com um intervalo.

Eu acho que a melhor pergunta seria: há algum benefício em fazer a validação do lado do servidor do lado do cliente?


Awesome responde a todos. O site que temos é protegido por senha e para uma pequena base de usuários (<50). Se eles não estiverem rodando JavaScript nós enviaremos ninjas. Mas se estivéssemos projetando um site para todos, eu concordaria em validar os dois lados.

Como outros já disseram, você deve fazer as duas coisas. Aqui está o porquê:

Lado do Cliente

Você deseja validar a input no lado do cliente primeiro, porque pode fornecer um feedback melhor ao usuário médio . Por exemplo, se eles inserirem um endereço de e-mail inválido e passarem para o próximo campo, você poderá exibir uma mensagem de erro imediatamente. Dessa forma, o usuário pode corrigir todos os campos antes de enviar o formulário.

Se você validar apenas no servidor, eles devem enviar o formulário, receber uma mensagem de erro e tentar localizar o problema.

(Essa dor pode ser facilitada fazendo o servidor renderizar novamente o formulário com a input original do usuário preenchida, mas a validação no lado do cliente ainda é mais rápida.)

Lado do servidor

Você deseja validar no lado do servidor porque pode proteger contra o usuário mal-intencionado , que pode facilmente ignorar seu JavaScript e enviar informações perigosas para o servidor.

É muito perigoso confiar na sua interface do usuário. Não só eles podem abusar da sua interface do usuário, mas eles podem não estar usando sua interface do usuário, ou mesmo um navegador . E se o usuário editar manualmente o URL ou executar seu próprio Javascript ou ajustar suas solicitações HTTP com outra ferramenta? E se eles enviarem solicitações HTTP personalizadas a partir de curl ou de um script, por exemplo?

( Isso não é teórico; por exemplo, trabalhei em um mecanismo de pesquisa de viagens que enviou novamente a pesquisa do usuário para muitas companhias aéreas, empresas de ônibus etc. enviando solicitações POST como se o usuário tivesse preenchido o formulário de pesquisa de cada empresa e coletado e classificado todos os resultados. O JS do formulário dessas empresas nunca foi executado, e foi crucial para nós que eles fornecessem mensagens de erro no HTML retornado. É claro que uma API teria sido legal, mas isso era o que tínhamos que fazer. )

Não permitir isso não é apenas ingênuo do ponto de vista de segurança, mas também fora do padrão: um cliente deve ter permissão para enviar HTTP por qualquer meio que desejar, e você deve responder corretamente. Isso inclui validação.

A validação do lado do servidor também é importante para a compatibilidade – nem todos os usuários, mesmo se estiverem usando um navegador, terão o JavaScript ativado.

Adenda – dezembro de 2016

Há algumas validações que nem podem ser feitas corretamente no código do aplicativo do lado do servidor e são totalmente impossíveis no código do lado do cliente , porque elas dependem do estado atual do database. Por exemplo, “ninguém mais registrou esse nome de usuário” ou “a postagem do blog que você está comentando ainda existe” ou “nenhuma reserva existente se sobrepõe às datas solicitadas” ou “o saldo da conta ainda tem o suficiente para cobrir essa compra ” Somente o database pode validar com segurança os dados que dependem dos dados relacionados. Os desenvolvedores regularmente estragam tudo isso , mas o PostgreSQL oferece algumas boas soluções .

Sim, a validação do lado do cliente pode ser totalmente ignorada, sempre. Você precisa fazer as duas coisas, do lado do cliente para fornecer uma melhor experiência do usuário, e do lado do servidor para ter certeza de que a input que você recebe é realmente validada e não apenas supostamente validada pelo cliente.

Eu vou apenas repetir, porque é muito importante:

Sempre valide no servidor

e adicione JavaScript para a capacidade de resposta do usuário.

O benefício de realizar a validação do lado do servidor sobre a validação do lado do cliente é que a validação do lado do cliente pode ser ignorada / manipulada:

  • O usuário final pode ter o javascript desativado
  • Os dados podem ser enviados diretamente para o seu servidor por alguém que não esteja usando seu site, com um aplicativo personalizado projetado para isso
  • Um erro de Javascript em sua página (causado por qualquer número de coisas) pode resultar em alguns, mas não todos, de sua validação em execução

Resumindo – sempre, sempre valide o lado do servidor e, em seguida, considere a validação do lado do cliente como um “extra” adicional para aprimorar a experiência do usuário final.

Você deve sempre validar no servidor.

Também ter validação no cliente é bom para os usuários, mas é totalmente inseguro.

Você pode fazer a validação do lado do servidor e enviar de volta um object JSON com os resultados de validação para cada campo, mantendo o JavaScript do cliente no mínimo (apenas exibindo resultados) e ainda tendo uma experiência amigável sem ter que se repetir no cliente e no servidor.

Ainda tenho espaço para responder.

Além das respostas de Rob e Nathan, gostaria de acrescentar que ter validações do lado do cliente é importante. Quando você está aplicando validações em seus webforms, você deve seguir estas diretrizes:

Lado do cliente

  1. Deve usar validações do lado do cliente para filtrar solicitações genuínas provenientes de usuários genuínos em seu website.
  2. A validação do lado do cliente deve ser usada para reduzir os erros que podem ocorrer durante o processamento no lado do servidor.
  3. A validação do lado do cliente deve ser usada para minimizar as viagens de ida do lado do servidor, para que você economize largura de banda e as solicitações por usuário.

Lado do servidor

  1. Você não deve assumir que a validação feita com sucesso no lado do cliente é 100% perfeita. Não importa, mesmo que sirva menos de 50 usuários. Você nunca sabe qual de seu usuário / empregado se transformar em um “mal” e fazer alguma atividade prejudicial sabendo que você não tem validações adequadas no lugar.
  2. Mesmo que seja perfeito em termos de validação de endereço de e-mail, números de telefone ou verificação de alguns insumos válidos, ele pode conter dados muito prejudiciais. Que precisa ser filtrado no lado do servidor, não importa se está correto ou incorreto.
  3. Se a validação do lado do cliente for ignorada, suas validações do lado do servidor serão usadas para resgatá-lo de qualquer dano potencial ao processamento no lado do servidor. Nos últimos tempos, já ouvimos muitas histórias de Injeções SQL e outras técnicas que podem ser aplicadas para obter alguns benefícios malignos.

Ambos os tipos de validações desempenham papéis importantes em seu respectivo escopo, mas o mais forte é o lado do servidor. Se você receber 10k usuários em um único ponto do tempo, você definitivamente acabará filtrando o número de solicitações que chegam ao seu servidor. Se você descobrir que houve um único erro, como endereço de e-mail inválido, eles retornarão o formulário novamente e solicitarão ao usuário que corrija os resources do servidor e a largura de banda. Então é melhor você aplicar validação de javascript. Se o javascript estiver desabilitado, a validação do lado do servidor virá para resgatar e eu aposto que apenas alguns usuários podem desativá-lo acidentalmente, já que 99,99% dos sites usam javascript e já estão ativados por padrão em todos os navegadores modernos.

O lado do cliente deve usar uma validação básica via tipos de input HTML5 e atributos de padrão e como eles são usados ​​somente para aprimoramentos progressivos para uma melhor experiência do usuário (mesmo que eles não sejam suportados no

JavaScript pode ser modificado em tempo de execução.

Sugiro um padrão de criação de uma estrutura de validação no servidor e compartilhamento com o cliente.

Você precisará de uma lógica de validação separada nas duas extremidades, ex:

Atributos "required" nas inputs do lado do cliente

field.length > 0 no lado do servidor.

Mas usar a mesma especificação de validação eliminará alguma redundância (e erros) de validação de espelhamento em ambas as extremidades.

Vou sugerir que implemente a validação tanto do cliente quanto do servidor para manter o projeto mais seguro …… se eu tiver que escolher um, eu irei com a validação do lado do servidor.

Atualização Jul 23 2018: o seguinte link não está mais acessível:

Você pode encontrar algumas informações relevantes aqui http://www.webexpertlabs.com/server-side-form-validation-using-regular-expression/

Eu me deparei com um link interessante que faz uma distinção entre erros grosseiros, sistemáticos e randoms.

Client-Side validation adequada para evitar erros grosseiros e randoms. Normalmente, um tamanho máximo para textura e input. Não imite a regra de validação do lado do servidor; forneça sua própria regra de validação bruta, regra geral (ex. 200 caracteres no lado do cliente; n no lado do servidor ditados por uma regra de negócios forte).

Server-side validation adequada para evitar erros sistemáticos; aplicará regras comerciais.

Em um projeto em que estou envolvido, a validação é feita no servidor por meio de solicitações ajax. No cliente, exibo as mensagens de erro de acordo.

Leitura adicional: erros grosseiros, sistemáticos e randoms:

https://answers.yahoo.com/question/index?qid=20080918203131AAEt6GO

Se você estiver fazendo uma validação leve, é melhor fazê-lo no cliente. Ele salvará o tráfego da rede, o que ajudará seu servidor a ter um melhor desempenho. Se se complicar a validação que envolve a extração de dados de um database ou algo do tipo, como senhas, é melhor fazê-lo no servidor onde os dados podem ser verificados com segurança.