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

179

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

Na nossa situação, estamos usando

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

Muita validação que faço é validar dados à medida que os usuários os inserem. Por exemplo, eu uso o keypressevento para impedir letras em uma caixa de texto, defina um número máximo de caracteres e com um número em um intervalo.

Acho que a melhor pergunta seria: existem benefícios em fazer a validação do servidor no lado do cliente?


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

Brad8118
fonte
2
o javascript pode ser desativado
Enrico Murru 2/08/08
Não há como garantir a segurança dos usuários que desativam o JavaScript. Se o usuário chegar à sua página com o JS ativado e depois desabilitá-lo, não há nada que você possa fazer. (OK, você poderia usar JS para implementar o controle de submissão, de modo que ele vai parar de trabalhar neste cenário, mas isso pode ser contornado como tudo o resto.)
Stewart

Respostas:

347

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

Lado do Cliente

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

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

(Esse problema pode ser aliviado com a renderização do formulário no servidor com a entrada original do usuário preenchida, mas a validação do lado do cliente ainda é mais rápida.)

Lado do servidor

Você deseja validar no lado do servidor porque pode se proteger contra o usuário mal-intencionado , que pode ignorar facilmente o JavaScript e enviar entradas perigosas ao servidor.

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

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

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

A validação no servidor também é importante para compatibilidade - nem todos os usuários, mesmo que estejam usando um navegador, terão o JavaScript ativado.

Adenda - dezembro de 2016

Existem algumas validações que nem sequer 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 dependem do estado atual do banco de dados. Por exemplo, "ninguém mais registrou esse nome de usuário" ou "a postagem do blog em que você está comentando ainda existe" ou "nenhuma reserva existente se sobrepõe às datas solicitadas" ou "o saldo da sua conta ainda tem o suficiente para cobrir essa compra . " Somente o banco de dados pode validar dados de maneira confiável, que depende de dados relacionados. Os desenvolvedores estragam isso regularmente , mas o PostgreSQL fornece algumas boas soluções .

Nathan Long
fonte
30
Esta deve ser a resposta aceita, mesmo 6 anos depois: P
Jacob McKay
17
Sim, eu queria esperar quase 10 anos para ter certeza.
Brad8118
2
@kidmosey "é uma violação óbvia dos princípios DRY" Sim, o que significa sofrimento para programadores como nós. Mas imagine um formulário de inscrição. Se duplicar o conhecimento "um endereço de e-mail deve conter um @" no código do cliente significa que os usuários recebem feedback mais rápido e mais deles se registram, resultando em uma receita extra de US $ 100 mil por ano, mais do que paga pelos custos extras de manutenção. O DRY é um princípio muito bom, mas não é a única consideração. A qualidade do código é realmente medida em quão bem atende aos usuários e a uma organização em uma análise de custo / benefício.
Nathan Long
1
@ArunRaaj Sim, e você encontrará a maioria dos problemas dessa maneira, mas não é 100% confiável. Se dois usuários estiverem preenchendo o formulário ao mesmo tempo, ambos poderão ser informados de que esse user1é um nome de usuário disponível. Quando eles enviam, os dois recebem o mesmo nome de usuário, a menos que você verifique novamente o lado do servidor. E mesmo uma verificação no código do aplicativo do servidor pode ter o mesmo problema: duas solicitações são recebidas, a primeira verifica o banco de dados e é informada de OK, a segunda verifica o banco de dados e é informada de OK, a primeira é salva e a segunda é salva como uma duplicata. Somente uma restrição exclusiva de banco de dados garante exclusividade.
Nathan Long
1
As validações @NathanLong em dados sensíveis às condições de corrida não são tão intratáveis ​​quanto esta frase os faz soar. É uma tarefa difícil de fazer corretamente, mas crie um mecanismo de reserva que use um recurso sincronizado para solicitar. Portanto, se o usuário digitar "nome de usuário A", uma verificação de exclusividade no servidor que não permite várias chamadas simultâneas para verificar se é única; se exclusivo, reserve-o também com um token temporário atribuído ao cliente que também será liberado se um nome de usuário diferente for testado pelo mesmo ID de sessão. O token deve expirar após um tempo razoável. Exemplo: reserva de assento TicketMaster.
Elaskanator /
79

Sim, a validação do lado do cliente pode ser totalmente ignorada, sempre. Você precisa fazer as duas coisas: lado do cliente para fornecer uma melhor experiência do usuário e lado do servidor para garantir que a entrada recebida seja realmente validada e não apenas supostamente validada pelo cliente.

Vinko Vrsalovic
fonte
43

Vou apenas repetir, porque é muito importante:

Validar sempre no servidor

e adicione JavaScript para responder ao usuário.

Toby Hede
fonte
31

O benefício de realizar a validação do lado do servidor sobre a 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 ao seu servidor por alguém que nem está usando o site, com um aplicativo personalizado projetado para isso
  • Um erro de Javascript na sua página (causado por várias coisas) pode resultar em parte, mas não toda, da sua validação em execução

Em resumo - sempre, sempre valide do lado do servidor e considere a validação do lado do cliente como um "extra" adicionado para aprimorar a experiência do usuário final.

Roubar
fonte
18

Você sempre deve validar no servidor.

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

Peter Boughton
fonte
9

Ainda encontro espaço para responder.

Além das respostas de Rob e Nathan, eu acrescentaria que ter validações do lado do cliente é importante. Ao aplicar validações em seus formulários da web, você deve seguir estas diretrizes:

Lado do Cliente

  1. É necessário usar validações do lado do cliente para filtrar solicitações genuínas provenientes de usuários genuínos no seu site.
  2. A validação do lado do cliente deve ser usada para reduzir os erros que podem ocorrer durante o processamento do lado do servidor.
  3. A validação do lado do cliente deve ser usada para minimizar as viagens de ida e volta 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 realizada com êxito no lado do cliente é 100% perfeita. Não importa, mesmo que atenda a menos de 50 usuários. Você nunca sabe qual usuário / funcionário se torna um "mal" e realiza alguma atividade prejudicial sabendo que não possui validações adequadas.
  2. Mesmo sendo perfeito em termos de validação de endereço de e-mail, números de telefone ou verificação de algumas entradas válidas, pode conter dados muito prejudiciais. O qual precisa ser filtrado no lado do servidor, independentemente de estar correto ou incorreto.
  3. Se a validação do lado do cliente for ignorada, as validações do lado do servidor servirão para resgatá-lo de qualquer dano potencial ao processamento do lado do servidor. Nos últimos tempos, já ouvimos muitas histórias de injeções de SQL e outros tipos de técnicas que podem ser aplicadas para obter alguns benefícios negativos.

Ambos os tipos de validações desempenham papéis importantes em seus respectivos escopos, mas o mais forte é o lado do servidor. Se você receber 10 mil usuários em um único momento, você definitivamente filtrará o número de solicitações que chegam ao seu servidor da web. Se você achar que houve um único erro, como endereço de e-mail inválido, eles enviam o formulário novamente e pedem ao usuário para corrigi-lo, o que definitivamente consumirá os recursos e a largura de banda do servidor. Então é melhor você aplicar a validação javascript. Se o javascript estiver desativado, a validação no lado do servidor será resgatada e aposto que apenas alguns usuários podem desativá-lo acidentalmente, pois 99,99% dos sites usam javascript e já está ativado por padrão em todos os navegadores modernos.

KMX
fonte
Vi pessoas negligenciarem totalmente a proteção contra a injeção de código, não importa fazer apenas no lado do cliente. E nenhuma referência a injeção de código é completa sem um link para isso: xkcd.com/327 :)
Stewart
8

Você pode fazer a validação no servidor e enviar de volta um objeto JSON com os resultados da 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 precisar se repetir no cliente e no servidor.

Jonathan
fonte
3
Amigo do usuário? Talvez. Quase instantâneo e amanteigado? Provavelmente não.
Quadrupleslap
4

O lado do cliente deve usar uma validação básica via tipos de entrada HTML5 e atributos de padrão, pois eles são usados ​​apenas para aprimoramentos progressivos para uma melhor experiência do usuário (mesmo que não sejam suportados no <IE9 e safari, mas não confiamos neles). Mas a validação principal deve acontecer no lado do servidor.

adardesign
fonte
"Mas a validação principal deve acontecer no lado do servidor." Não deve, deve.
Stewart
2

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

Sugiro um padrão para criar uma estrutura de validação no servidor e compartilhá-la com o cliente.

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

"required"atributos no inputslado do cliente

field.length > 0 do lado do servidor.

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

TaylorMac
fonte
2

A validação de dados do lado do cliente pode ser útil para uma melhor experiência do usuário: por exemplo, um usuário que digita incorretamente seu endereço de email, não deve esperar até que sua solicitação seja processada por um servidor remoto para aprender sobre o erro de digitação que ele fez.

No entanto, como um invasor pode ignorar a validação do lado do cliente (e pode até não usar o navegador), a validação do lado do servidor é necessária e deve ser a porta real para proteger seu back-end de usuários nefastos.

Billal Begueradj
fonte
1

Encontrei um link interessante que faz uma distinção entre erros brutos, sistemáticos e aleatórios.

Client-Side validationserve perfeitamente para evitar erros grosseiros e aleatórios. Normalmente, um comprimento máximo para textura e entrada. Não imite a regra de validação do lado do servidor; forneça sua própria regra geral de validação de regra de ouro (por exemplo, 200 caracteres no lado do cliente; nno lado do servidor ditado por uma forte regra comercial).

Server-side validationserve perfeitamente para evitar erros sistemáticos; aplicará regras de negócios.

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

Leitura adicional: erros grosseiros, sistemáticos e aleatórios:

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

Roland
fonte
-2

Se você estiver fazendo validação leve, é melhor fazê-lo no cliente. Isso salvará o tráfego de rede, o que ajudará seu servidor a ter um melhor desempenho. Se a validação complicada envolve a extração de dados de um banco de dados ou algo assim, como senhas, é melhor fazê-lo no servidor em que os dados podem ser verificados com segurança.

Tom
fonte
2
O que você está obtendo não é a melhor ideia. O usuário sempre pode ignorar a validação do lado do cliente e enviar o que quiser ao banco de dados.
precisa saber é o seguinte