Änderungen bei der Validierung der endgültigen Version von ASP.NET MVC 2

    und mehrere Sicherheitsprobleme, die es wert sind die Aufmerksamkeit auf

    Bild Brad Wilson (Brad Wilson), einer der Entwickler in ASP.NET MVC - Gruppe, sagte in seinem Blog über die Zukunft der konzeptionellen Veränderungen , die MVC in der finalen Version von ASP.NET gemacht werden 2.

    Es ist über den Wechsel eines Validierungskonzepts von den Formularfeldern zu einem anderen - ein Konzept, das auf einem Datenmodell basiert. In diesem Artikel möchte ich erklären, warum diese Änderungen vorgenommen wurden und was sie für den Entwickler bedeuten.

    Zur Demonstration möchte ich ein einfaches Datenmodell definieren. Als Beispiel habe ich ein vereinfachtes Modell eines einzelnen digg-ähnlichen Servicedatensatzes gewählt. Bei solchen Diensten ist jeder Eintrag der Text eines Links zu einer nützlichen Ressource im Netzwerk sowie eine Beschreibung dieses Links.
    In dem Artikel verwende ich Bilder, um Code zu demonstrieren. Dies liegt an der Tatsache, dass ich vorhabe, den Artikel auf mehreren Ressourcen zu veröffentlichen, und keine Zeit damit verbringen möchte, die Syntax in den einzelnen Ressourcen einzufärben. Im Gegenzug füge ich am Ende des Artikels die Quellcodes als fertiges Projekt hinzu.
    Also die Klasse Story.cs:

    Bild

    Hier werden zusätzlich zu den Feldern Url und Description die Felder Id (Bezeichner), Approved (Flag, das angibt, dass der Eintrag moderiert wurde) und CreateDate (Erstellungsdatum des Eintrags) deklariert. In diesem Fall gibt das Bind-Attribut an, dass beim Verknüpfen von Daten mit der Modellinstanz keine ID-Werte zugeordnet werden müssen.

    Zur Demonstration benötigen wir ein Formular zur Eingabe und ein Feld zur Ausgabe der Ergebnisse. Lassen Sie uns das folgende Markup erstellen:

    Bild

    Versuchen wir, etwas einzugeben und das Ergebnis zu betrachten:

    Bild

    Auf den ersten Blick ist alles in Ordnung, außer dass es keine Validierung in unserem Code gibt. Wir ändern die Datenmodellklasse mithilfe der DataAnnotations-Attribute, um die Validierung zu unterstützen:

    Bild

    Wenn wir nun versuchen, leere Felder aus unserem Formular zu senden, werden Validierungsfehler angezeigt:

    Bild

    Bisher sieht alles gut und schön aus. Stellen Sie sich jedoch diese Option vor: Ein Feld zur Eingabe einer Beschreibung wurde in einer der Formularoptionen nicht hinzugefügt, als ein anderer Entwickler eine andere Seite erstellte. Tragischerweise generiert und sendet ein Angreifer überhaupt Daten, ohne das Feld Beschreibung anzugeben. Wie wird sich unsere Bewerbung in diesem Fall verhalten?

    Um einen solchen Versuch zu demonstrieren, fehlerhafte Daten zu senden, habe ich eine einfache Anfrage erstellt, die den Url-Wert, aber nicht den Description-Wert enthält. Sie können das Ergebnis der folgenden Abfrage sehen:

    Bild

    Wie Sie sehen, ist Description null, aber das Datenmodell wird als gültig betrachtet. Im Falle, dass es keine zusätzlichen Überprüfungen gibt, würde diese Abfrage Datensätze eines ungültigen (nach unseren Vorstellungen) Modells in die Datenbank bringen.

    Das problem


    Was ist der Haken? Tatsache ist, dass die Validierung, die in ASP.NET MVC 2 aller derzeit öffentlich verfügbaren Versionen (die neueste Version ist RC) in seiner Arbeit funktioniert, auf den Werten des Formulars basiert. Mit anderen Worten, nur die Felder, die an den Server übertragen wurden, werden validiert, andere Felder bestehen die Validierung nicht.

    Das Problem in diesem Moment ist das Folgende: Ist die Serverüberprüfung ein Mechanismus zum Schutz vor unbefugtem Zugriff oder nicht? Bis vor kurzem lautete die Antwort im Wesentlichen nein. Die Validierung diente dazu, Benutzereingaben auf bestimmte Bedingungen zu überprüfen.

    Die meisten Entwickler, die sich mit den Feinheiten nicht auskennen, sind jedoch der Ansicht, dass die Validierung ihre Daten vor unbefugtem Zugriff schützt. In diesem Fall kann der Standardvalidierungsmechanismus die Ursache für zahlreiche Schwachstellen in den erstellten Ressourcen sein.

    Lösung


    Was wird im Austausch angeboten? Die Lösung besteht darin, das Validierungsverhalten von Formular zu Modell zu ändern. Das heißt, Verhalten auf das zu bringen, was von den meisten Entwicklern erwartet wird. In der endgültigen Version von ASP.NET MVC 2 wird genau dies durchgeführt: Die Validierung hängt nicht mehr von den übergebenen Werten ab, sondern vollständig vom Datenmodell.

    Ein Angreifer kann uns also keinen Schaden zufügen, wenn er eine falsch generierte Anfrage sendet, in der keine Daten enthalten sind. Wenn das Modell feststellt, dass die Daten erforderlich sind, tritt beim Binden der Werte des Formulars und der Modellinstanz ein Validierungsfehler auf und das Modell ist ungültig.

    Details oder "nicht so einfach"


    In den kommenden Innovationen gibt es mehrere Punkte, auf die Sie achten müssen.

    Komplexe Arten


    Validierungsregeln für verschachtelte komplexe Objekte im Modell wirken sich nur dann auf die Validierung aus, wenn das Formular mindestens ein Feld dieses komplexen Typs enthält. Wenn beispielsweise eine Eigenschaft vom Typ Address in der Person-Klasse deklariert ist, gelten die Validierungsregeln für Address nur, wenn mindestens eine der Address-Eigenschaften an der Serveranforderung beteiligt ist.

    Änderungen an der Verarbeitung der Bindungsattribute


    Aufgrund von Änderungen im Validierungsmechanismus wurde die Verarbeitung des für das Modell festgelegten Bindungsattributs geändert. In der endgültigen Version von MVC 2 wird die Validierung für alle Eigenschaften des Modells durchgeführt, unabhängig davon, ob die Eigenschaften in die Ausschlussliste des Bindungsattributs aufgenommen wurden oder nicht.

    Zuvor konnte durch Festlegen bestimmter Felder in der Ausschlussliste eine teilweise Modellvalidierung erreicht werden. Ab sofort ist dies nicht mehr möglich - alle Eigenschaften werden auf Validierungsregeln überprüft.

    Erforderlich für nicht nullfähige Typen


    Aufgrund der Tatsache, dass die Validierung auf dem Modell basiert, ist die Verwendung von Erforderlich für nicht nullfähige Typen nutzlos. Es ist nicht möglich zu bestimmen, ob ein Wert aus dem Formular übergeben wurde oder nicht, da der Werttyp einen Standardwert hat.

    Parameter als Teil des Modells


    Ein weiteres mögliches Problem ist, dass der Entwickler kein striktes Präsentationsmodell als Aktionsparameter verwenden kann, sondern einen Teil davon:

    Bild

    Hier erfolgt die Bearbeitung eines Eintrags, indem zuerst ein ID-Parameter gebunden wird. Anschließend wird der vorhandene Datensatz aus dem Repository heruntergeladen und versucht, ihn zu aktualisieren. Das Problem tritt auf, wenn die an den Server gesendeten Daten nicht alle erforderlichen Werte enthalten. Beispielsweise ist dasselbe Feld "Beschreibung" leer. Im vorliegenden Beispiel funktioniert die Validierung für das Feld "Beschreibung" an keiner Stelle, an der der Code ausgeführt wird, und das Modell wird falsch gespeichert.

    Die Lösung des Problems besteht darin, nur den Typ des Modells anstelle eines Teils davon zu verwenden. Die Validierung funktioniert dann bereits beim Verknüpfen der Aktionsparameter.

    Übergabe unnötiger Parameter


    Ein weiteres Problem, das bei der Verwendung der Validierung auftreten kann, besteht darin, dass ein Angreifer Werte solcher Modellfelder senden kann, die nicht an den Server gesendet werden sollten. Dies kann der genehmigte Wert für unser Story-Modell sein. Der Wert "Genehmigt" für die Aufzeichnung bedeutet, dass die Aufzeichnung moderiert wurde, dh, dieser Wert bestimmt den Systemsicherheitsparameter und der Zugriff darauf sollte eindeutig eingeschränkt sein.

    Ich habe eine böswillige Anfrage von unserem Formular gesendet. Sehen Sie sich das Ergebnis an:

    Bild

    Sie können sehen, dass das Modell bereits den festgelegten Wert Approved = true hat, dh, der Angreifer hat möglicherweise den Moderationsmechanismus überwunden.

    Um diese Situation zu vermeiden, müssen Sie den Validierungsmechanismus sorgfältig prüfen und Ihre Modelle korrekt planen. Um beispielsweise einen solchen Hack der Vormoderation zu vermeiden, muss der Wert "Genehmigt" in die Liste "Ausgeschlossen" des Modells für das Attribut "Bin" in diesem Modell

    Bild

    eingefügt werden. Die Benutzerdaten werden nicht für das Feld "Genehmigt" verknüpft, wodurch das Problem behoben wird.

    Fazit


    In diesem Artikel habe ich die Neuerungen für den Überprüfungsmechanismus überprüft, der in der endgültigen Version von ASP.NET MVC 2 vorgenommen wird. Außerdem wurden Sicherheitsprobleme bei der Verwendung der Datenbindung, Validierung und Übermittlung von Daten von einem Formular aufgeworfen.

    Automatische Validierung und Datenbindung sind äußerst nützliche Mechanismen, die Ihr Leben erheblich erleichtern können. Ihre Verwendung verpflichtet jedoch zur Einhaltung bestimmter Sicherheitsvorschriften, die nicht vergessen werden dürfen. Ich hoffe, dieser Artikel hilft Ihnen beim Erstellen sicherer Sites in ASP.NET MVC. Habt eine schöne Entwicklung, Kolleginnen und Kollegen!
    Anhang: Quellcodes aus dem Artikel

    Progg es

    Jetzt auch beliebt: