JavaScript: clientseitige vs. serverseitige Validierung

179

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 keypressEreignis, 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.

Brad8118
quelle
2
Javascript kann deaktiviert werden
Enrico Murru
Es gibt keine sichere Möglichkeit, Benutzer zu blockieren, die JavaScript deaktivieren. Wenn der Benutzer mit aktiviertem JS zu Ihrer Seite kommt und diese dann deaktiviert, können Sie nichts tun. (OK, Sie könnten JS verwenden, um die Übermittlungssteuerung zu implementieren, so dass sie in diesem Szenario nicht mehr funktioniert, aber dies kann wie alles andere umgangen werden.)
Stewart

Antworten:

346

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 curloder 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 POSTAnfragen 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 .

Nathan Long
quelle
30
Dies sollte die akzeptierte Antwort sein, auch 6 Jahre später: P
Jacob McKay
17
Ja, ich wollte fast 10 Jahre warten, um sicher zu sein.
Brad8118
2
@kidmosey "es ist eine offensichtliche Verletzung der DRY-Prinzipien" Ja, was für Programmierer wie uns Schmerz bedeutet. Aber stellen Sie sich ein Anmeldeformular vor. Wenn das Wissen "Eine E-Mail-Adresse muss ein @ enthalten" im Client-Code dupliziert wird, erhalten Benutzer schnelleres Feedback und mehr von ihnen melden sich an. Dies führt zu einem zusätzlichen Umsatz von 100.000 USD pro Jahr. Dies zahlt sich mehr als für die zusätzlichen Wartungskosten aus. DRY ist ein sehr gutes Prinzip, aber es ist nicht die einzige Überlegung. Die Codequalität wird in einer Kosten-Nutzen-Analyse wirklich daran gemessen, wie gut sie Benutzern und einem Unternehmen dient.
Nathan Long
1
@ArunRaaj Ja, und Sie werden die meisten Probleme auf diese Weise erkennen, aber es ist nicht 100% zuverlässig. Wenn zwei Benutzer gleichzeitig das Formular ausfüllen, wird ihnen möglicherweise mitgeteilt, dass user1es 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.
Nathan Long
1
@NathanLong Validierungen von Daten, die für Rennbedingungen empfindlich sind, sind nicht so unlösbar, wie dieser Satz sie klingen lässt. Es ist mühsam, es richtig zu machen, aber erstellen Sie einen Reservierungsmechanismus, der eine synchronisierte Ressource zum Anfordern verwendet. Wenn der Benutzer "usernameA" eingibt, wird auf dem Server eine Eindeutigkeitsprüfung durchgeführt, bei der mehrere gleichzeitige Aufrufe nicht zulässig sind, um zu überprüfen, ob sie eindeutig sind. Wenn dies eindeutig ist, reservieren Sie es auch mit einem dem Client zugewiesenen temporären Token, das ebenfalls freigegeben wird, wenn ein anderer Benutzername mit derselben Sitzungs-ID getestet wird. Der Token sollte nach einer angemessenen Zeit ablaufen. Beispiel: TicketMaster Sitzplatzreserve.
Elaskanator
79

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.

Vinko Vrsalovic
quelle
43

Ich werde es nur wiederholen, weil es ziemlich wichtig ist:

Überprüfen Sie immer auf dem Server

und fügen Sie JavaScript für die Reaktionsfähigkeit des Benutzers hinzu.

Toby Hede
quelle
31

Der Vorteil der serverseitigen Validierung gegenüber der clientseitigen Validierung besteht darin, dass die clientseitige Validierung umgangen / manipuliert werden kann:

  • Der Endbenutzer könnte Javascript ausgeschaltet haben
  • Die Daten können von jemandem, der Ihre Website nicht einmal nutzt, mit einer dafür entwickelten benutzerdefinierten App direkt an Ihren Server gesendet werden
  • Ein Javascript-Fehler auf Ihrer Seite (verursacht durch eine beliebige Anzahl von Dingen) kann dazu führen, dass einige, aber nicht alle Ihrer Überprüfungen ausgeführt werden

Kurz gesagt - immer immer serverseitig validieren und dann clientseitige Validierung als zusätzliches "Extra" betrachten, um die Endbenutzererfahrung zu verbessern.

rauben
quelle
18

Sie müssen immer auf dem Server validieren.

Auch eine Validierung auf dem Client ist für Benutzer hilfreich, aber äußerst unsicher.

Peter Boughton
quelle
9

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

  1. Es müssen clientseitige Validierungen verwendet werden, um echte Anfragen von echten Benutzern auf Ihrer Website zu filtern.
  2. Die clientseitige Validierung sollte verwendet werden, um die Fehler zu reduzieren, die während der serverseitigen Verarbeitung auftreten können.
  3. Die clientseitige Validierung sollte verwendet werden, um die serverseitigen Roundtrips zu minimieren, damit Sie Bandbreite und Anforderungen pro Benutzer sparen.

Serverseitig

  1. Sie sollten NICHT davon ausgehen, dass die auf Client-Seite erfolgreich durchgeführte Validierung zu 100% perfekt ist. Egal, auch wenn es weniger als 50 Benutzer bedient. Sie wissen nie, welcher Ihrer Benutzer / Mitarbeiter sich in ein "Übel" verwandelt und schädliche Aktivitäten ausführt, wenn Sie wissen, dass Sie nicht über die richtigen Validierungen verfügen.
  2. Selbst wenn es perfekt ist, um E-Mail-Adressen, Telefonnummern oder gültige Eingaben zu überprüfen, kann es sehr schädliche Daten enthalten. Was auf der Serverseite gefiltert werden muss, egal ob es richtig oder falsch ist.
  3. Wenn die clientseitige Validierung umgangen wird, werden Sie durch Ihre serverseitigen Validierungen vor möglichen Schäden an Ihrer serverseitigen Verarbeitung bewahrt. In letzter Zeit haben wir bereits viele Geschichten über SQL Injections und andere Techniken gehört, die angewendet werden könnten, um einige böse Vorteile zu erzielen.

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.

KMX
quelle
Ich habe Leute gesehen, die es versäumt haben, sich vor Code-Injection zu schützen, egal, nur auf der Client-Seite. Und kein Verweis auf Code-Injection ist vollständig ohne einen Link dazu: xkcd.com/327 :)
Stewart
8

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.

Jonathan
quelle
3
Benutzerfreundlich? Vielleicht. Fast augenblicklich und butterweich? Wahrscheinlich nicht.
Vierfachrunde
4

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.

Adardesign
quelle
"Die Hauptüberprüfung sollte jedoch auf der Serverseite erfolgen." Nicht sollte, muss.
Stewart
2

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 auf inputs Clientseite

field.length > 0 serverseitig.

Durch die Verwendung derselben Validierungsspezifikation werden jedoch Redundanzen (und Fehler) bei der Spiegelungsvalidierung an beiden Enden vermieden.

TaylorMac
quelle
2

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.

Billal Begueradj
quelle
1

Ich bin auf einen interessanten Zusammenhang gestoßen, der zwischen groben, systematischen und zufälligen Fehlern unterscheidet.

Client-Side validationeignet 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 validationeignet 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

Roland
quelle
-2

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.

Tom
quelle
2
Was Sie empfehlen, ist nicht die beste Idee. Der Benutzer kann die clientseitige Validierung jederzeit umgehen und alles, was er möchte, an die Datenbank senden.
Kremuwa