La validation de la saisie des données a toujours été une lutte interne pour moi.
Sur le point d'ajouter un véritable cadre et code de sécurité à notre projet de réécriture d'applications héritées (qui jusqu'à présent conserve à peu près le code de sécurité hérité de la carte fort et la validation des données), je me demande à nouveau combien dois-je valider, où, etc.
Au cours de mes 5 années en tant que développeur Java professionnel, j'ai créé et affiné mes règles personnelles pour la validation de la saisie des données et les mesures de sécurité. Comme j'aime améliorer mes méthodes, j'aimerais que certains entendent des idées de vous. Les règles et procédures générales sont correctes, et celles spécifiques à Java aussi.
Résumées, voici mes directives (exposées sur un style d'application Web à 3 niveaux), avec de brèves explications:
Côté client 1er niveau (navigateur): validation minimale, seules les règles invariables (champ email obligatoire, doivent sélectionner un élément, etc.); utilisation d'une validation supplémentaire comme "entre 6 et 20 caractères" moins fréquente, car cela augmente le travail de maintenance sur les modifications (peut être ajouté une fois que le code d'entreprise est stable);
Côté serveur 1er niveau (gestion des communications web, "contrôleurs"): je n'ai pas de règle pour celui-ci, mais je pense que seules les erreurs de manipulation de données et d'assemblage / analyse doivent être gérées ici (le champ anniversaire n'est pas une date valide); ajouter ici une validation supplémentaire en fait facilement un processus vraiment ennuyeux;
2e niveau (couche métier): validation solide comme le roc, rien de moins; format de données d'entrée, plages, valeurs, vérification de l'état interne si la méthode ne peut pas être appelée à tout moment, rôles / autorisations utilisateur, etc. utilisez le moins de données d'entrée utilisateur possible, récupérez-les à nouveau dans la base de données si nécessaire; si nous considérons également les données de base de données récupérées comme des entrées, je ne les validerais que si certaines données spécifiques sont connues pour ne pas être suffisamment fiables ou corrompues sur la base de données - le typage fort fait la plupart du travail ici, à mon humble avis;
3ème niveau (couche de données / DAL / DAO): jamais pensé que beaucoup de validation était nécessaire ici, car seule la couche métier est censée accéder aux données (valider peut-être dans certains cas comme "param2 ne doit pas être nul si param1 est vrai"); notez cependant que lorsque je veux dire "ici", je veux dire "code qui accède à la base de données" ou "méthodes d'exécution SQL", la base de données elle-même est complètement le contraire;
la base de données (modèle de données): doit être aussi bien pensée, solide et auto-exécutoire que pour éviter autant que possible les données incorrectes et corrompues sur la base de données, avec de bonnes clés primaires, clés étrangères, contraintes, type de données / longueur / taille / precision et ainsi de suite - je laisse de côté les déclencheurs, car ils ont leur propre discussion privée.
Je sais que la validation précoce des données est agréable et performante, mais la validation répétée des données est un processus ennuyeux, et j'avoue que la validation des données elle-même est assez ennuyeuse. C'est pourquoi tant de codeurs l'ignorent ou le font à mi-chemin. De plus, chaque validation dupliquée est un bug possible si elles ne sont pas synchronisées en permanence. Ce sont les principales raisons pour lesquelles je préfère aujourd'hui laisser la plupart des validations à la couche métier, au détriment du temps, de la bande passante et du processeur, les exceptions étant gérées au cas par cas.
Alors, qu'est-ce que tu en penses? Opinions opposées? Avez-vous d'autres procédures? Une référence à un tel sujet? Toute contribution est valable.
Remarque: si vous envisagez la façon de faire Java, notre application est basée sur Spring avec Spring MVC et MyBatis (les performances et le mauvais modèle de base de données excluent les solutions ORM); Je prévois d'ajouter Spring Security en tant que notre fournisseur de sécurité plus JSR 303 (Hibernate Validator?)
Merci!
Edit: quelques précisions supplémentaires sur la 3ème couche.