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 .