Was ist besser für die clientseitige oder serverseitige Validierung?
In unserer Situation verwenden wir
- jQuery und MVC.
- JSON-Daten, die zwischen unserer Ansicht und dem Controller übertragen werden sollen.
Ein Großteil meiner Validierung besteht darin, Daten zu validieren, wenn Benutzer sie eingeben. Zum Beispiel verwende ich das keypress
Ereignis, um Buchstaben in einem Textfeld zu verhindern, eine maximale Anzahl von Zeichen festzulegen und dass eine Zahl mit in einem Bereich liegt.
Ich denke, die bessere Frage wäre: Gibt es Vorteile bei der serverseitigen Validierung gegenüber der Clientseite?
Genial antwortet allen. Die Website, die wir haben, ist passwortgeschützt und für eine kleine Benutzerbasis (<50). Wenn sie kein JavaScript ausführen, senden wir Ninjas. Aber wenn wir eine Site für alle entwerfen würden, würde ich zustimmen, auf beiden Seiten eine Validierung durchzuführen.
quelle
Antworten:
Wie andere gesagt haben, sollten Sie beides tun. Hier ist der Grund:
Client-Seite
Sie möchten zuerst die Eingabe auf der Clientseite überprüfen, da Sie dem durchschnittlichen Benutzer ein besseres Feedback geben können . Wenn sie beispielsweise eine ungültige E-Mail-Adresse eingeben und zum nächsten Feld wechseln, können Sie sofort eine Fehlermeldung anzeigen. Auf diese Weise kann der Benutzer jedes Feld korrigieren, bevor er das Formular sendet.
Wenn Sie nur auf dem Server validieren, müssen sie das Formular senden, eine Fehlermeldung erhalten und versuchen, das Problem zu beheben.
(Dieser Schmerz kann gelindert werden, indem der Server das Formular mit der ursprünglichen Eingabe des Benutzers erneut rendert. Die clientseitige Validierung ist jedoch immer noch schneller.)
Serverseite
Sie möchten auf der Serverseite validieren, da Sie sich vor böswilligen Benutzern schützen können , die Ihr JavaScript leicht umgehen und gefährliche Eingaben an den Server senden können.
Es ist sehr gefährlich, Ihrer Benutzeroberfläche zu vertrauen. Sie können nicht nur Ihre Benutzeroberfläche missbrauchen, sondern auch Ihre Benutzeroberfläche oder sogar einen Browser überhaupt nicht verwenden . Was passiert, wenn der Benutzer die URL manuell bearbeitet, sein eigenes Javascript ausführt oder seine HTTP-Anforderungen mit einem anderen Tool optimiert? Was ist, wenn sie beispielsweise benutzerdefinierte HTTP-Anforderungen von
curl
oder aus einem Skript senden ?( Dies ist nicht theoretisch. Ich habe beispielsweise an einer Reisesuchmaschine gearbeitet, bei der die Suche des Benutzers erneut an viele Partnerfluggesellschaften, Busunternehmen usw. gesendet wurde, indem
POST
Anfragen gesendet wurden, als hätte der Benutzer das Suchformular jedes Unternehmens ausgefüllt, dann gesammelt und sortiert Alle Ergebnisse. Das Formular JS dieser Unternehmen wurde nie ausgeführt, und es war für uns von entscheidender Bedeutung, dass sie Fehlermeldungen im zurückgegebenen HTML-Code bereitstellen. Natürlich wäre eine API nett gewesen, aber das mussten wir tun. )Dies nicht zu berücksichtigen ist nicht nur aus Sicherheitsgründen naiv, sondern auch nicht standardisiert: Ein Client sollte HTTP mit allen gewünschten Mitteln senden dürfen, und Sie sollten korrekt reagieren. Das schließt die Validierung ein.
Die serverseitige Validierung ist auch wichtig für die Kompatibilität. Nicht für alle Benutzer, auch wenn sie einen Browser verwenden, ist JavaScript aktiviert.
Nachtrag - Dezember 2016
Es gibt einige Überprüfungen, die im serverseitigen Anwendungscode nicht einmal ordnungsgemäß durchgeführt werden können und im clientseitigen Code überhaupt nicht möglich sind , da sie vom aktuellen Status der Datenbank abhängen. Beispiel: "Niemand hat diesen Benutzernamen registriert" oder "Der Blog-Beitrag, den Sie kommentieren, ist noch vorhanden" oder "Keine vorhandene Reservierung überschneidet sich mit den von Ihnen angeforderten Daten" oder "Ihr Kontostand reicht noch aus, um diesen Kauf abzudecken . " Nur die Datenbank kann Daten zuverlässig validieren, die von verwandten Daten abhängen. Entwickler vermasseln dies regelmäßig , aber PostgreSQL bietet einige gute Lösungen .
quelle
user1
es sich um einen verfügbaren Benutzernamen handelt. Wenn sie senden, erhalten beide denselben Benutzernamen, es sei denn, Sie überprüfen die Serverseite erneut. Und selbst eine Überprüfung des Serveranwendungscodes kann das gleiche Problem haben: Es gehen zwei Anforderungen ein, die erste überprüft die Datenbank und wird mit OK, die zweite mit der Datenbank und mit OK, die erste wird gespeichert, die zweite wird gespeichert als Duplikat. Nur eine eindeutige DB-Einschränkung garantiert die Eindeutigkeit.Ja, die clientseitige Validierung kann immer vollständig umgangen werden. Sie müssen beides tun, clientseitig, um eine bessere Benutzererfahrung zu erzielen, und serverseitig, um sicherzustellen, dass die Eingabe, die Sie erhalten, tatsächlich validiert wird und nicht nur angeblich vom Client validiert wird.
quelle
Ich werde es nur wiederholen, weil es ziemlich wichtig ist:
und fügen Sie JavaScript für die Reaktionsfähigkeit des Benutzers hinzu.
quelle
Der Vorteil der serverseitigen Validierung gegenüber der clientseitigen Validierung besteht darin, dass die clientseitige Validierung umgangen / manipuliert werden kann:
Kurz gesagt - immer immer serverseitig validieren und dann clientseitige Validierung als zusätzliches "Extra" betrachten, um die Endbenutzererfahrung zu verbessern.
quelle
Sie müssen immer auf dem Server validieren.
Auch eine Validierung auf dem Client ist für Benutzer hilfreich, aber äußerst unsicher.
quelle
Nun, ich finde immer noch Raum, um zu antworten.
Zusätzlich zu den Antworten von Rob und Nathan möchte ich hinzufügen, dass es wichtig ist, clientseitige Validierungen zu haben. Wenn Sie Validierungen auf Ihren Webformularen anwenden, müssen Sie die folgenden Richtlinien befolgen:
Client-Seite
Serverseitig
Beide Arten von Validierungen spielen in ihrem jeweiligen Umfang eine wichtige Rolle, die stärkste ist jedoch die serverseitige. Wenn Sie 10.000 Benutzer zu einem bestimmten Zeitpunkt empfangen, werden Sie definitiv die Anzahl der Anfragen filtern, die an Ihren Webserver gesendet werden. Wenn Sie feststellen, dass ein einzelner Fehler wie eine ungültige E-Mail-Adresse aufgetreten ist, senden sie das Formular erneut zurück und bitten Ihren Benutzer, es zu korrigieren, wodurch Ihre Serverressourcen und Bandbreite definitiv aufgebraucht werden. Wenden Sie also besser die Javascript-Validierung an. Wenn Javascript deaktiviert ist, wird Ihre serverseitige Validierung behoben, und ich wette, nur wenige Benutzer haben es möglicherweise versehentlich deaktiviert, da 99,99% der Websites Javascript verwenden und es in allen modernen Browsern standardmäßig aktiviert ist.
quelle
Sie können eine serverseitige Validierung durchführen und ein JSON-Objekt mit den Validierungsergebnissen für jedes Feld zurücksenden, um das Client-Javascript auf ein Minimum zu beschränken (nur die Ergebnisse anzuzeigen) und dennoch eine benutzerfreundliche Erfahrung zu erzielen, ohne sich sowohl auf dem Client als auch auf dem Server wiederholen zu müssen.
quelle
Die Clientseite sollte eine grundlegende Validierung über HTML5-Eingabetypen und Musterattribute verwenden, da diese nur für progressive Verbesserungen für eine bessere Benutzererfahrung verwendet werden (auch wenn sie in <IE9 und Safari nicht unterstützt werden, wir uns jedoch nicht auf sie verlassen). Die Hauptvalidierung sollte jedoch auf der Serverseite erfolgen.
quelle
Ich werde vorschlagen, sowohl die Client- als auch die Servervalidierung zu implementieren, um das Projekt sicherer zu machen. Wenn ich eine auswählen muss, werde ich die serverseitige Validierung durchführen.
Einige relevante Informationen finden Sie hier https://web.archive.org/web/20131210085944/http://www.webexpertlabs.com/server-side-form-validation-using-regular-expression/
quelle
JavaScript kann zur Laufzeit geändert werden.
Ich schlage ein Muster vor, bei dem eine Validierungsstruktur auf dem Server erstellt und diese für den Client freigegeben wird.
Sie benötigen an beiden Enden eine separate Validierungslogik, z.
"required"
Attribute aufinputs
Clientseitefield.length > 0
serverseitig.Durch die Verwendung derselben Validierungsspezifikation werden jedoch Redundanzen (und Fehler) bei der Spiegelungsvalidierung an beiden Enden vermieden.
quelle
Die clientseitige Datenüberprüfung kann für eine bessere Benutzererfahrung hilfreich sein: Beispielsweise sollte ein Benutzer, der seine E-Mail-Adresse falsch eingibt, nicht warten, bis seine Anfrage von einem Remote-Server verarbeitet wird, um mehr über den Tippfehler zu erfahren, den er begangen hat.
Da ein Angreifer die clientseitige Validierung umgehen kann (und den Browser möglicherweise überhaupt nicht verwendet), ist eine serverseitige Validierung erforderlich und muss das eigentliche Tor sein, um Ihr Backend vor schändlichen Benutzern zu schützen.
quelle
Ich bin auf einen interessanten Zusammenhang gestoßen, der zwischen groben, systematischen und zufälligen Fehlern unterscheidet.
Client-Side validation
eignet sich perfekt zur Vermeidung von groben und zufälligen Fehlern. Normalerweise eine maximale Länge für Textur und Eingabe. Imitieren Sie nicht die serverseitige Validierungsregel. Geben Sie Ihre eigene Brutto-Faustregel-Validierungsregel an (z. B. 200 Zeichen auf der Clientseite.n
auf der Serverseite, die von einer starken Geschäftsregel vorgegeben wird).Server-side validation
eignet sich perfekt zur Vermeidung systematischer Fehler; es wird Geschäftsregeln durchsetzen.In einem Projekt, an dem ich beteiligt bin, erfolgt die Validierung auf dem Server über Ajax-Anforderungen. Auf dem Client zeige ich entsprechend Fehlermeldungen an.
Weiterführende Literatur: grobe, systematische, zufällige Fehler:
https://answers.yahoo.com/question/index?qid=20080918203131AAEt6GO
quelle
Wenn Sie eine Lichtvalidierung durchführen, ist es am besten, diese auf dem Client durchzuführen. Dadurch wird der Netzwerkverkehr gespeichert, wodurch Ihr Server eine bessere Leistung erzielt. Wenn die Validierung das Abrufen von Daten aus einer Datenbank oder etwas anderem wie Kennwörtern erschwert, ist es am besten, dies auf dem Server zu tun, auf dem die Daten sicher überprüft werden können.
quelle