Comme d'autres l'ont dit, vous devriez faire les deux. Voici pourquoi:
Côté client
Vous souhaitez d'abord valider les entrées côté client, car vous pouvez donner de meilleurs commentaires à l'utilisateur moyen . Par exemple, s'ils entrent une adresse e-mail non valide et passent au champ suivant, vous pouvez afficher un message d'erreur immédiatement. De cette façon, l'utilisateur peut corriger chaque champ avant d' envoyer le formulaire.
Si vous validez uniquement sur le serveur, ils doivent soumettre le formulaire, obtenir un message d'erreur et essayer de rechercher le problème.
(Cette douleur peut être atténuée en demandant au serveur de restituer le formulaire avec l'entrée d'origine de l'utilisateur remplie, mais la validation côté client est encore plus rapide.)
Du côté serveur
Vous souhaitez valider côté serveur car vous pouvez vous protéger contre l'utilisateur malveillant , qui peut facilement contourner votre JavaScript et soumettre des entrées dangereuses au serveur.
Il est très dangereux de faire confiance à votre interface utilisateur. Non seulement ils peuvent abuser de votre interface utilisateur, mais ils peuvent ne pas utiliser du tout votre interface utilisateur, ni même un navigateur . Que faire si l'utilisateur modifie manuellement l'URL, ou exécute son propre Javascript, ou modifie ses requêtes HTTP avec un autre outil? Et s'ils envoient des requêtes HTTP personnalisées à partir curl
ou à partir d'un script, par exemple?
( Ce n'est pas théorique; par exemple, j'ai travaillé sur un moteur de recherche de voyages qui a renvoyé la recherche de l'utilisateur à de nombreuses compagnies aériennes partenaires, compagnies de bus, etc., en envoyant des POST
demandes comme si l'utilisateur avait rempli le formulaire de recherche de chaque entreprise, puis rassemblé et trié tous les résultats. Le formulaire JS de ces entreprises n'a jamais été exécuté, et il était crucial pour nous qu'ils fournissent des messages d'erreur dans le code HTML renvoyé. Bien sûr, une API aurait été bien, mais c'était ce que nous devions faire. )
Ne pas autoriser cela est non seulement naïf du point de vue de la sécurité, mais aussi non standard: un client doit être autorisé à envoyer HTTP par tous les moyens qu'il souhaite, et vous devez répondre correctement. Cela inclut la validation.
La validation côté serveur est également importante pour la compatibilité - tous les utilisateurs, même s'ils utilisent un navigateur, n'auront pas activé JavaScript.
Addendum - décembre 2016
Certaines validations ne peuvent même pas être correctement effectuées dans le code d'application côté serveur et sont totalement impossibles dans le code côté client , car elles dépendent de l'état actuel de la base de données. Par exemple, "personne d'autre n'a enregistré ce nom d'utilisateur", ou "le billet de blog sur lequel vous commentez existe toujours", ou "aucune réservation existante ne chevauche les dates que vous avez demandées", ou "le solde de votre compte est encore suffisant pour couvrir cet achat . " Seule la base de données peut valider de manière fiable les données qui dépendent des données associées. Les développeurs gâchent régulièrement cela , mais PostgreSQL fournit de bonnes solutions .