Oft basiert das, was einem Benutzer angezeigt wird (z. B. auf einer Webseite), teilweise auf Sicherheitsüberprüfungen. Normalerweise betrachte ich die Sicherheit auf Benutzerebene / ACL als Teil der Geschäftslogik eines Systems. Wenn eine Ansicht die Sicherheit explizit überprüft, um UI-Elemente bedingt anzuzeigen, verstößt sie dann gegen MVC, indem sie Geschäftslogik enthält?
web-development
design-patterns
security
mvc
Matt S.
quelle
quelle
Antworten:
Es kann zwei Arten von Sicherheitsbedingungen geben, eine für das Modell und eine für die Ansicht. Die Ansicht steuert die Anzeige relevanter Elemente in Abhängigkeit von den Berechtigungen des aktuellen Benutzers, das Modell steuert jedoch den Zugriff auf die zugrunde liegenden Daten. Solange das Modell über die richtigen Überprüfungen / Validierungen verfügt, besteht auch dann noch Sicherheit, wenn die Ansicht fehlt.
Normalerweise müssen Sie beide haben, da sich die Ansicht für verschiedene Ebenen / Rollen ändern muss. Der Controller sendet die relevanten Daten, die die Ansicht ändern würden, aber die Ansicht muss noch etwas mit diesen Daten tun, um Inhalte für den richtigen Benutzer auszublenden / anzuzeigen.
Aus diesem Grund verfügen die meisten Vorlagen-Frameworks über bedingte Elemente ( Beispiel für Lenker ):
Das bedeutet also, dass es keine Verletzung ist, solange sich die entsprechenden Teile an der richtigen Stelle befinden.
quelle
Ja und nein.
Wenn die eigentliche Sicherheitsentscheidung von der Ansicht getroffen wird, verstoßen Sie gegen MVC. Wenn die Ansicht jedoch die eigentliche Entscheidung an das Modell delegiert, ist alles in Ordnung. Es ist nichts Falsches daran, Entscheidungen zu treffen, welche Elemente basierend auf Informationen aus dem Modell angezeigt werden sollen.
Wenn Sie beispielsweise über eine Schaltfläche "Bearbeiten" verfügen, die nur für Benutzer mit Berechtigungen "Editor" sichtbar ist, kann die Ansicht das Modell fragen, wer der aktuelle Benutzer ist und ob sie über die Berechtigung "Editor" verfügen Verwenden Sie diese Informationen, um zu entscheiden, ob die Schaltfläche angezeigt werden soll oder nicht. Wenn die Ansicht jedoch die Authentifizierungs- und Autorisierungslogik selbst ausführen würde, würden Sie MVC verletzen.
quelle
Ich würde nein sagen .
Aber aus einem anderen Grund als @rvcoutinho sagte (obwohl er Wikipedia zitiert, was mich in meinem Denken falsch fühlen lässt)
Ich würde sagen, dass alle relevanten Sicherheitsbedenken von dem Modell geteilt werden sollten, das der Ansicht zugewiesen wurde (abhängig von der Anzahl der Kombinationen, die Sie aus diesem Grund möglicherweise für ein ViewModel verwenden möchten), da Sie möglicherweise Schalter für die Sicherheitsbits haben könnten.
Dies ermöglicht die Sicherheitsüberprüfung auf zwei Ebenen: Auf der UI-Ebene wird ein Postback für den Normalfall untergraben, sowie auf der Serverebene für schlechte Akteure, bei denen das Modell das Sicherheitswissen in sich behält, sodass der Controller die Informationen an weitergibt das Modell, das es sofort rauswirft.
Zweischichtige Sicherheit wie diese ist der Standard in der Industrie, und auf diese Weise muss Ihre Sicherheitslogik nur an zwei Stellen vorhanden sein. Dies ist ein Bonus, sobald Sie die Sicherheitslogik in Ihren Controller einfügen, platzieren Sie sie dort und in der Benutzeroberfläche und im Modell (das Modell benötigt es, da es die letzte Verteidigungslinie darstellt und besonders wichtig für alle Anwendungen außerhalb dieser MVC-Web-App wie einen Desktop-Client oder Serververwaltungstools ist).
quelle
Ich würde nein sagen .
Normalerweise wird diese Art von Sicherheitsüberprüfungen vom Controller durchgeführt.
Wie aus Wikipedia :
Und ich denke nicht, dass es direkt in der Ansicht gemacht werden sollte. Wenn dies beispielsweise über Javascript erfolgt, kann dies ein Sicherheitsproblem darstellen (man kann Javascript deaktivieren und auf privilegierte Daten zugreifen).
Wieder aus Wikipedia :
quelle
Mit dieser Frage sind mehrere Probleme verbunden.
if model.userCanEdit() ... endif
.quelle
Wenn es nur darum geht, das UI-Element anzuzeigen, denke ich, ist es in Ordnung (wie würden Sie es sonst noch tun?). Wenn diese Elemente Daten enthalten würden, hätte das Modell sicherstellen müssen, dass die Container leer sind. Und natürlich sollte der Code zum Abrufen der Berechtigungsdaten vor der Ansicht verarbeitet worden sein, sodass hier kein aktiver Zugriff auf das Modell besteht.
quelle
Ja, es ist eine Verletzung von MVC.
Die Ansicht dient nur zur Anzeige von Elementen, und die Logik sollte sich im Modell befinden. Indem Sie die Ansicht etwas tun lassen (in Ihrem Fall die Sicherheit überprüfen), platzieren Sie die Logik dort.
quelle