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 keypress
evento 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.
javascript
security
validation
Brad8118
fonte
fonte
Respostas:
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
curl
ou 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
POST
solicitaçõ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 .
fonte
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.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.
fonte
Vou apenas repetir, porque é muito importante:
e adicione JavaScript para responder ao usuário.
fonte
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:
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.
fonte
Você sempre deve validar no servidor.
Também ter validação no cliente é bom para os usuários, mas é totalmente inseguro.
fonte
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
Lado do servidor
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.
fonte
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.
fonte
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.
fonte
Sugiro implementar a validação do cliente e do servidor, para manter o projeto mais seguro ...... se eu tiver que escolher um, irei com a validação do lado do servidor.
Você pode encontrar algumas informações relevantes aqui https://web.archive.org/web/20131210085944/http://www.webexpertlabs.com/server-side-form-validation-using-regular-expression/
fonte
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 noinputs
lado do clientefield.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.
fonte
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.
fonte
Encontrei um link interessante que faz uma distinção entre erros brutos, sistemáticos e aleatórios.
Client-Side validation
serve 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;n
no lado do servidor ditado por uma forte regra comercial).Server-side validation
serve 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
fonte
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.
fonte