Die Validierung von Dateneingaben war für mich immer ein ziemlicher interner Kampf.
Kurz vor dem Hinzufügen eines echten Sicherheitsrahmens und -codes zu unserem Umschreibprojekt für Legacy-Anwendungen (bei dem der kartenschlossstarke Legacy-Sicherheitscode und die Datenvalidierung so gut wie erhalten bleiben), frage ich mich erneut, wie viel ich validieren soll. wo usw.
In meinen 5 Jahren als professioneller Java-Entwickler habe ich meine persönlichen Regeln für die Validierung von Dateneingaben und Sicherheitsmaßnahmen erstellt und verfeinert. Da ich meine Methoden verbessern möchte, möchte ich einige Ideen von euch hören. Allgemeine Regeln und Prozeduren sind in Ordnung und auch Java-spezifische.
Zusammengefasst sind dies meine Richtlinien (dargestellt in einem dreistufigen Webanwendungsstil) mit kurzen Erklärungen:
1st Tier Client-Seite (Browser): minimale Validierung, nur unveränderliche Regeln (obligatorisches E-Mail-Feld, muss einen Artikel auswählen und dergleichen); Verwendung einer zusätzlichen Validierung wie "zwischen 6 und 20 Zeichen" weniger häufig, da dies den Wartungsaufwand für Änderungen erhöht (kann hinzugefügt werden, sobald der Geschäftscode stabil ist);
Serverseite der ersten Ebene (Handhabung der Webkommunikation, "Controller"): Ich habe keine Regel für diese, bin jedoch der Meinung, dass hier nur Datenmanipulations- und Assembly- / Parsing-Fehler behandelt werden sollten (Geburtstagsfeld ist kein gültiges Datum). Das Hinzufügen weiterer Validierungen hier macht es leicht zu einem wirklich langweiligen Prozess.
2nd Tier (Business Layer): Absolute Validierung, nicht weniger; Eingabedatenformat, Bereiche, Werte, interne Statusprüfung, ob die Methode jederzeit aufgerufen werden kann, Benutzerrollen / -berechtigungen usw. Verwenden Sie so wenig Benutzereingabedaten wie möglich und rufen Sie diese bei Bedarf erneut aus der Datenbank ab. Wenn wir abgerufene Datenbankdaten auch als Eingabe betrachten, würde ich sie nur dann validieren, wenn bekannt ist, dass einige bestimmte Daten auf der DB unzuverlässig oder verfälscht genug sind - starke Typisierung erledigt den größten Teil der Arbeit hier, IMHO;
3. Schicht (Datenschicht / DAL / DAO): Ich habe nie geglaubt, dass hier viel Validierung erforderlich ist, da nur die Geschäftsschicht auf die Daten zugreifen soll (validieren Sie möglicherweise in einigen Fällen wie "param2 darf nicht null sein, wenn param1 wahr ist"); Beachten Sie jedoch, dass, wenn ich "hier" meine, "Code, der auf die Datenbank zugreift" oder "SQL-ausführende Methoden", die Datenbank selbst genau das Gegenteil ist.
Die Datenbank (Datenmodell): muss so durchdacht, stark und selbstsicher sein, dass falsche und beschädigte Daten in der Datenbank mit guten Primärschlüsseln, Fremdschlüsseln, Einschränkungen, Datentyp / Länge / Größe so weit wie möglich vermieden werden / Präzision und so weiter - ich lasse Auslöser aus, da sie ihre eigene private Diskussion haben.
Ich weiß, dass eine frühe Datenvalidierung in Bezug auf die Leistung nett ist, aber eine wiederholte Datenvalidierung ist ein langweiliger Prozess, und ich gebe zu, dass die Datenvalidierung selbst ziemlich ärgerlich ist. Deshalb überspringen so viele Programmierer es oder machen es auf halbem Weg. Außerdem ist jede doppelte Überprüfung ein möglicher Fehler, wenn sie nicht immer synchronisiert werden. Das sind die Hauptgründe, aus denen ich es heutzutage bevorzuge, die meisten Validierungen auf Kosten von Zeit, Bandbreite und CPU bis zur Business-Ebene zu überlassen. Ausnahmen werden von Fall zu Fall behandelt.
Sag mal, wie findest du das? Gegensätzliche Meinungen? Haben Sie andere Verfahren? Ein Verweis auf ein solches Thema? Jeder Beitrag ist gültig.
Hinweis: Wenn Sie an Java denken, basiert unsere App auf Spring MVC und MyBatis (Leistung und schlechtes Datenbankmodell schließen ORM-Lösungen aus). Ich plane, Spring Security als Sicherheitsanbieter und JSR 303 (Hibernate Validator?) Hinzuzufügen.
Vielen Dank!
Bearbeiten: einige zusätzliche Klarstellung auf der 3. Ebene.