it-swarm.com.de

Ist die Validierung des HTML5-Eingabemusters für die clientseitige Validierung ausreichend (oder sogar relevant)?

Ein interessantes Feature von HTML5 ist das <input pattern="" />Attribut , mit dem der Browser den Wert des Eingabefelds anhand eines vom Entwickler bereitgestellten regulären Ausdrucks überprüfen kann.

Anschließend wird dies an ValidityState des Felds gebunden, das dann nach UX-Feedback abgefragt werden kann, um eine ungültige Übermittlung zu verhindern, und so weiter.

Der Server implementiert die gleiche Validierung der Vorbedingungen (sowie XSRF).

Vor diesem Hintergrund ist dieses clientseitige Validierungsmuster ausgereift und angemessen oder ist es aus irgendeinem Grund immer noch wünschenswert, das gesamte Formular abzufangen und es vor dem Absenden einer herkömmlichen Validierung pro Feld zu unterziehen?

23
msanford

Aus Sicherheitsgründen müssen Sie alles auf dem Server erneut validieren. Dies wird immer der Fall sein, egal wie hübsch und fortschrittlich HTML5-Funktionen werden. Sie können dem Kunden einfach nicht vertrauen. Sie haben keine Ahnung, ob es den HTML5-Regeln folgt oder nicht. Sie wissen nicht einmal, ob es sich um einen Browser handelt.

Sollten Sie das gesamte Formular vor dem Absenden mit Ihrer eigenen JS-Client-Seite validieren, auch wenn Sie die HTML5-Funktionen verwenden? Aus Sicherheitsgründen spielt es keine Rolle. Die clientseitige Validierung hat ohnehin keinen Sicherheitswert (siehe oben). Aus Sicherheitsgründen können Sie sich also genauso gut überhaupt nicht darum kümmern.

Bei der clientseitigen Validierung geht es ausschließlich um die Benutzererfahrung. Wenn Ihre eigene JS-Validierung oder HTML5 für die beste UX sorgt, ist dies eine interessante Frage, die hier jedoch nicht zum Thema gehört.

110
Anders

Eine Erklärung mit Code und Screenshots

Die Antworten sind großartig. Aber ich wollte dies mit einigen Code/Screenshots veranschaulichen.

Das Fazit ist, dass alles, was clientseitig ist, vom Endbenutzer manipuliert (deaktiviert/vollständig entfernt/umgangen oder geändert) werden kann. Daher ist jede Art von "clientseitiger Validierung" aus Sicherheitsgründen völlig nutzlos. Sie müssen immer serverseitig validieren.

Angenommen, Sie haben ein HTML-Formular wie das folgende:

<form method="post" action="index.php">
    <input type="email" name="emailAddress" required>
    <button type="submit">Submit form</button>
</form>

Hierbei wird nach einer E-Mail-Adresse (type="email") Gefragt, die besagt, dass es sich um ein Pflichtfeld handelt (Attribut required).

Wenn ich versuche, etwas zu senden, das leer ist oder keine E-Mail-Adresse enthält, tritt ein Fehler auf, z.

(enter image description here

Warum ist dies aus Sicherheitsgründen nutzlos? Der Benutzer muss lediglich den HTML-Code manipulieren. Sie können dies entweder tun, indem Sie eine Kopie der Webseite speichern, bearbeiten und dann erneut öffnen. Oder sie können die Entwicklertools in ihrem Browser verwenden, um das Markup zu bearbeiten. Sie können dies tun, weil es sich um clientseitigen Code handelt und sie unter ihrer Kontrolle stehen.

Angenommen, ich ändere das Markup des Formulars wie folgt:

<form method="post" action="index.php">
    <input type="text" name="emailAddress">
    <button type="submit">Submit form</button>
</form>

Ich sage jetzt, dass das Feld emailAddress vom Typ text ist (d. H. Nicht email) und kein erforderliches Feld ist (entferntes Attribut required).

Also kann ich das an den Server senden. Die Textzeichenfolge "andy" ist offensichtlich keine gültige E-Mail-Adresse. Da wir jedoch (noch) keine serverseitige Validierung haben, wird diese sehr gerne auf dem Server veröffentlicht, und wenn der PHP Code verwendet wird $_POST['emailAddress']), Hätte sie "andy" als seine Daten.

(enter image description here

Ich könnte das Formular auch ohne Daten senden. In diesem Fall hätte die Anwendung - ohne serverseitige Validierung - eine leere Zeichenfolge in der Variablen $_POST['emailAddress'].

Dies war nur möglich, weil ich als Endbenutzer den clientseitigen Code manipulieren konnte.

Warum ist die serverseitige Validierung sicher? Der Endbenutzer kann den serverseitigen Code nicht manipulieren (es sei denn, der Server wurde kompromittiert, aber das ist ein sehr separates Problem und nicht etwas, das so einfach ist wie das Manipulieren von HTML für eine durchschnittliche Person).

In PHP könnte ich also eine Überprüfung wie folgt durchführen:

if (!filter_var($_POST['emailAddress'], FILTER_VALIDATE_EMAIL)) {
    die('Invalid email address');
}

Obwohl dies eine nicht benutzerfreundliche Fehlerbehandlungsmethode ist, wird die Skriptausführung gestoppt, wenn der Benutzer "andy" anstelle einer gültigen E-Mail-Adresse übermittelt. Die Anwendung verwendet daher niemals "andy" als Variable, in der eine E-Mail-Adresse erwartet wurde. Da der Endbenutzer den Code PHP oben) nicht manipulieren kann, besteht eine geringere Wahrscheinlichkeit, dass er die Validierung umgehen kann Dies ist eine serverseitige Validierung - sie kann von einem Endbenutzer nicht (einfach) geändert werden, da es nicht in seiner Kontrolle liegt, sie zu ändern.

Warum sollte man sich dann überhaupt um die clientseitige Validierung kümmern? Die clientseitige Validierung ist nützlich für "gut aussehende" Verbesserungen der Benutzeroberfläche oder zum Beispiel für Fehlermeldungen/Deaktivieren des Formulars Felder. Zum Beispiel ist es wohl eine gute UI-Funktion, diese Nachricht auf dem ersten Screenshot zu haben, falls der Benutzer eine E-Mail-Adresse falsch eingibt. Das Formular wird unter den ersten Bedingungen nicht einmal gesendet, wodurch nicht benötigte Daten an den Server gesendet werden. Aber letztendlich kann alles, was clientseitig getan wird, vom Endbenutzer geändert werden. Es ist also in keiner Weise sicher und Sie sollten niemals an eine "clientseitige Validierung" denken, wenn es um Sicherheitspraktiken geht. Jede clientseitige Validierung dient hauptsächlich der Verbesserung der Benutzeroberfläche.

Die clientseitige Validierung ist auch für clientseitige Anwendungen nützlich (wenn keine Anforderung/Veröffentlichung auf einem Server erfolgt). Wenn Sie beispielsweise das oben angegebene Formular hatten und dann den Inhalt von emailAddress in einem <div> Auf der Seite anzeigen, indem Sie es mit JavaScript/jquery lesen. Wenn der Benutzer etwas wie <script>alert('hello!');</script> eingibt und keine Validierung erfolgt, wird eine Warnung ausgegeben, wenn das JavaScript versucht, den Wert in das Feld in <div> Zu schreiben. In diesem Fall wird nichts auf den Server gebucht - alles geschieht clientseitig. Daher ist die clientseitige Validierung in diesem Szenario erneut hilfreich. Das gleiche Grundprinzip gilt jedoch dahingehend, dass ein Benutzer die Validierung weiterhin deaktivieren kann. Die Auswirkungen sind hier geringer, da sie den oben genannten Code nur auf ihrem lokalen Computer ausführen würden, nicht bei anderen Benutzern der Anwendung. Zum Beispiel:

(enter image description here

Verwendung des folgenden Codes (ohne Validierung):

<form method="post" action="#">
    <input type="text" name="emailAddress" id="emailAddress" size="100">
    <button type="submit">Submit form</button>
</form>

<div id="test"></div>

Und jquery, um den Formularinhalt in ein <div> Mit der ID test zu schreiben:

$(document).ready(function() {
    $("button").click(function(e) {
        e.preventDefault();

        $("#test").html($("#emailAddress").val());
    });
});
16
Andy

Wie Anders sagte, ist die clientseitige Validierung für die Sicherheit der Anwendung irrelevant, aber aus UX-Sicht sehr wichtig.

Die clientseitige Validierung konzentriert sich darauf, dem Benutzer eine reibungslosere und einfachere Zeit beim Ausfüllen Ihrer Formulare zu bieten. Das beste mir bekannte Beispiel ist das jQuery Masks-Plugin, mit dem Sie die Eingabegröße und das Eingabemuster begrenzen und dem Benutzer ein visuelles Feedback geben können. Dies kann Ihnen bei Sicherheitslücken helfen, z. B. beim Empfangen von Daten von Benutzern in einem anderen Muster als auf der Serverseite erwartet, wird jedoch von jedem Angreifer leicht ignoriert.

tl; dr - Es gibt keine ausreichende clientseitige Validierung. Vertrauen Sie dem Client einfach nicht. Behandeln Sie einfach alles, was auf dem Server empfangen wurde, bevor Sie es verarbeiten.

6
Bristran

Keine der bisherigen Antworten erwähnt es wirklich, also lassen Sie mich Folgendes hinzufügen:

Der Grund, warum irgendetwas in Ihrem HTML für die Sicherheit völlig irrelevant ist, ist, dass jeder Angreifer trivial Anforderungen erstellen kann, ohne HTML in den Browser zu laden (indem er eine Anforderung in die Konsole eingibt oder einige verwendet Plugin). Eigentlich ohne den Browser zu starten (c/f curl, wget oder eine andere Programmiersprache).

Der relevante Teil für diese Dinge sind die HTTP Anfragen. Nicht die HTML-Nutzdaten. Und mit Ausnahme der TLS/SSL-Schicht gibt es nichts, was den Inhalt der HTTP-Anforderung vor der Person schützt, die die Anforderung tatsächlich erstellt hat.

Jede Sicherheit muss also serverseitig erfolgen. Alle clientseitigen Überprüfungen dienen lediglich einer besseren Benutzererfahrung (Überspringen einer Rundreise).

2
AnoE

HTML-Überprüfungen gelten nur für diejenigen, die nicht wissen, wie der HTML-Code vom Client aus geändert werden kann. Diese HTML-Validierungen können einfach von der Clientseite entfernt und bearbeitet werden. Haben Sie immer die richtige Validierung auf Ihrer Datenbank.

0
Harshit Singhal