it-swarm.com.de

Ist es in Ordnung, eine Validierungsschicht vor der Zugriffskontrollschicht zu haben?

Ich erstelle eine API-strukturierte Webanwendung und in dieser Anwendung haben wir verschiedene Ebenen, die ihre eigene Arbeit erledigen.

Die erste Schicht ist Validierung Schicht, die Benutzereingaben validiert, und wenn sie die Validierung besteht, verschieben wir diese in die zweite Schicht (Zugriffskontrolle Schicht), andernfalls wird die Fehlermeldung zurückgegeben

Die zweite Ebene ist Zugriffssteuerung, die prüft, ob der Benutzer die Berechtigung zum Ausführen der gewünschten Aufgabe hat. Wenn der Benutzer über die Berechtigung verfügt, wird die Anforderung in die nächste Ebene verschoben, andernfalls wird eine Fehlermeldung zurückgegeben

Die dritte Schicht ist Controller Schicht, in der wir die Logik der Anwendung haben

Meine Frage ist, dass es in Ordnung ist, vor der Zugriffskontrolle eine Validierungsschicht zu haben. Was passiert, wenn der Benutzer versucht, eine Aufgabe auszuführen, für die der Benutzer keine Berechtigung hat, und wir eine Validierungsfehlermeldung zurücksenden? Der Benutzer würde Anforderungen an einen Endpunkt senden und mit der Validierungsschicht sprechen. Sobald die Validierung bestanden ist, wird die Nachricht You can't access this!

Es fühlt sich seltsam für mich an, also ist es in Ordnung so oder was könnten meine anderen Optionen in der Infrastruktur sein?

25
Muhammad

Es hängt davon ab, ob die Kenntnis der Gültigkeit einer Eingabe für eine Aufgabe, die Sie nicht ausführen dürfen, ein Sicherheitsleck ist. Wenn ja, sollten Sie es wirklich umgekehrt machen.

Die einzige sichere Antwort für einen nicht autorisierten Benutzer ist "Zugriff verweigert". Wenn die Antwort manchmal "schlechte Anfrage" und manchmal "Zugriff verweigert" lautet, senden Sie Informationen an einen nicht autorisierten Benutzer.

Beispielsweise könnten Sie die Validierung der Aufgabe "Dokument löschen" überprüfen lassen, ob das genannte Dokument vorhanden ist. Jemand ohne Berechtigungen kann erkennen, ob etwas vorhanden ist, indem er versucht, es zu löschen und zu vergleichen, welchen Fehler er zurückerhält. Ein besonders entschlossener Angreifer könnte alle Dokumentnamen (unter einer bestimmten Länge) auflisten, um festzustellen, welche vorhanden sind.

57
Caleth

Nun, es gibt mehrere Arten der Validierung:

  1. Günstige grundlegende Überprüfung der geistigen Gesundheit, die überprüft, ob die Anfrage nicht offensichtlich fehlerhaft ist.

    Dies ist in der Regel zumindest teilweise clientseitig dupliziert, um vergebliche Roundtrips zu vermeiden.

    Auf jeden Fall sollte dies vor der Zugriffskontrolle erfolgen, um die Dinge einfacher und weniger fehleranfällig zu machen, da kein Informationsleck riskiert wird.

  2. Teurere Validierung, die noch nicht von geschützten Anwendungsdaten abhängt.

    Wenn es eine solche zusätzliche Validierung gibt, kann es nach der Zugriffskontrolle sein, Datenlecks nicht zu vermeiden, sondern DOS-Angriffe zu verhindern.
    Manchmal führt das einfache Ausführen der Anforderung einen Teil dieser Validierung implizit zu reduzierten oder kostenlosen Kosten aus, sodass sie hier möglicherweise weggelassen wird.

    Wenn die gesamte Validierung des ersten Schritts dupliziert wird, ist es möglicherweise sinnvoll, auch Teile dieser Clientseite zu duplizieren.

  3. Zusätzliche Validierung abhängig von den geschützten Anwendungsdaten.

    Wenn Sie dies vor der Zugriffskontrolle tun, besteht offensichtlich die Gefahr von Informationslecks. Führen Sie daher zuerst die Zugriffskontrolle durch.

24
Deduplicator

Vor der Zugriffskontrolle muss einige validiert werden. Angenommen, die SO-API hat einen Endpunkt "Antwort bearbeiten". Ob der Benutzer eine bestimmte Antwort bearbeiten kann, hängt von der Antwort ab (unter einem bestimmten Ruf kann ein Benutzer nur seine eigenen Antworten bearbeiten). Daher muss der wohlgeformte Parameter "Antwort-ID" überprüft werden, bevor die Zugriffskontrollschicht ins Spiel kommt. möglicherweise auch, dass die Antwort existiert.

Wie Caleth und Greg erwähnen, ist OTOH ein potenzielles Sicherheitsrisiko, wenn eine umfassendere Validierung vor der Zugriffskontrolle erfolgt.

Die harten Regeln sind also

  1. Sie dürfen keine Informationen durch Validierung offenlegen, die der Benutzer sonst nicht herausfinden kann.
  2. Sie müssen Daten validieren, bevor die Zugriffskontrolle sie in dem Umfang verwenden kann, in dem die Zugriffskontrolle sie benötigt.

Das Befolgen dieser beiden Regeln kann bedeuten, dass Sie vor und nach der Zugriffskontrolle eine Validierung durchführen müssen.

14
Sebastian Redl

Zusätzlich zu der möglichen Frustration, einen 'Zugriff verweigert' zu erhalten nach Eingabe validieren; Denken Sie auch daran, dass die Ebene Validierung, sofern es sich nicht um eine sehr einfache Ebene handelt, immer Informationen vom Controller benötigen kann. Vor diesem Hintergrund halte ich die Positionierung Validierung hinter Zugriffskontrolle näher an Controller für sinnvoller.

6
simurg

Das hängt davon ab, was Sie unter Validierungsschicht verstehen. Wenn Sie damit nur die Syntax der Anforderung überprüfen möchten, ist dies sicher und Sie müssen es trotzdem tun. Wenn Ihre 'Validierung' any Informationen verwendet, auf die ein nicht privilegierter Benutzer keinen Zugriff hat, ist dies nicht mehr sicher.

Sie sollten auf jeden Fall einen Sanity Checker haben, bevor Sie versuchen, die Zugriffskontrolle durchzuführen, aber Sie sollten darauf achten, allen Betreuern (aktuell und zukünftig) sehr klar mitzuteilen, dass dieser Teil darf nicht privilegierte Informationen verwendet; Solche Überprüfungen sollten in einem separaten Validierungsschritt durchgeführt werden nach Authentifizierung.

Als Sanity Check für den Sanity Checker sollte er keine Code-Abhängigkeiten von einem Teil Ihres Codes in der Pipeline aufweisen und in ein eigenes Paket trennbar sein, das ohne Probleme öffentlich veröffentlicht werden kann (außer bei möglichen rechtlichen Problemen). . Wenn Sie das nicht können, macht Ihre 'Validierungsschicht' zu viel (oder Ihre Codebasis ist ein Chaos).

2
Cubic

Nein, es ist nicht in Ordnung.

Wenn Ihre Validierungsschicht einen Fehler aufweist, wird möglicherweise die Sicherheitsschicht umgangen.

Es ist ein häufiger Fehler, Sicherheit als Teil der Geschäftsanforderungen zu betrachten. "Nur Benutzer mit Rollenverkäufen sollten die Quartalszahlen sehen können" scheint eine Geschäftsregel zu sein.

Wenn Sie jedoch sicher sein möchten, müssen Sie die Regel "Nur Benutzer in der Vertriebsrolle sollten Code auf diesem Endpunkt ausführen können" lesen. Sie müssen sicherstellen, dass Ihr Server immer "Zugriff verweigert" zurückgibt, bevor er dazu kommt jede Art von Code, den Sie geschrieben haben, oder Dateien auf dem Server.

1
Ewan