Ich erstelle eine API-gestützte Webanwendung und in dieser Anwendung haben wir verschiedene Ebenen, die ihre eigene Arbeit erledigen.
Die erste Schicht ist die Validierungsschicht , die Benutzereingaben validiert. Wenn sie die Validierung bestehen, verschieben wir diese in die zweite Schicht (die Zugriffskontrollschicht ). Andernfalls wird die Fehlermeldung zurückgegeben
Die zweite Ebene ist die Zugriffssteuerung, die überprüft, ob der Benutzer die Berechtigung zum Ausführen der gewünschten Aufgabe hat. Wenn der Benutzer die Berechtigung hat, wird die Anforderung auf die nächste Ebene verschoben, andernfalls wird eine Fehlermeldung zurückgegeben
Die dritte Schicht ist die Controller- Schicht, auf der die Logik der Anwendung liegt
Meine Frage ist, dass ist das in Ordnung, Validierungsschicht vor der Zugriffskontrolle zu haben? Was passiert, wenn der Benutzer versucht, eine Aufgabe auszuführen, für die er keine Berechtigung hat, und wir eine Validierungsfehlermeldung zurücksenden? Der Benutzer sendet Anforderungen an einen Endpunkt und spricht mit der Validierungsschicht. Sobald die Validierung erfolgreich abgeschlossen wurde, wird die Nachricht angezeigtYou can't access this!
Es fühlt sich seltsam für mich an, ist es in Ordnung so oder was könnten meine anderen Optionen in der Infrastruktur sein?
quelle
Antworten:
Es hängt davon ab, ob die 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 lautet "Zugriff verweigert". Wenn die Antwort manchmal "schlechte Anfrage" und ein anderes Mal "Zugriff verweigert" lautet, senden Sie Informationen an einen nicht autorisierten Benutzer.
Beispielsweise könnten Sie die Überprüfung der Aufgabe "Dokument löschen" veranlassen, dass das genannte Dokument vorhanden ist. Jemand ohne Berechtigungen kann erkennen, ob etwas vorhanden ist, indem er versucht, es zu löschen, und vergleicht, welchen Fehler er zurückerhält. Ein besonders entschlossener Angreifer könnte alle Dokumentnamen (unter einer bestimmten Länge) auflisten, um zu sehen, welche existieren.
quelle
Nun, es gibt verschiedene Arten der Validierung:
Günstige grundlegende Überprüfung der Integrität, die sicherstellt, dass die Anforderung nicht offensichtlich fehlerhaft ist.
Dies ist in der Regel zumindest teilweise clientseitig dupliziert, um sinnlose Roundtrips zu vermeiden.
Auf jeden Fall sollte dies vor der Zugriffskontrolle erfolgen, um die Dinge einfacher und weniger fehleranfällig zu machen, da dadurch kein Informationsleck riskiert wird.
Teurere Validierung, die noch nicht von geschützten Anwendungsdaten abhängt.
Wenn es eine solche zusätzliche Validierung gibt, kann es sein, dass nach der Zugriffskontrolle keine Daten verloren gehen, sondern DOS-Angriffe verhindert werden.
Manchmal führt die einfache Ausführung 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 wurde, ist es möglicherweise sinnvoll, Teile dieser Clientseite ebenfalls zu duplizieren.
Zusätzliche Validierung abhängig von den geschützten Anwendungsdaten.
Wenn Sie dies vor der Zugriffskontrolle tun, besteht die Gefahr von Informationslecks. Führen Sie also zuerst die Zugriffskontrolle durch.
quelle
Es muss einige Validierung vor Zutrittskontrolle. 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). Der wohlgeformte Parameter "Antwort-ID" muss daher überprüft werden, bevor die Zugriffskontrollebene ins Spiel kommt. möglicherweise auch, dass die antwort existiert.
OTOH ist, wie Caleth und Greg erwähnen, ein potenzielles Sicherheitsrisiko, wenn eine umfassendere Validierung vor der Zugriffskontrolle erfolgt.
Also sind die harten Regeln
Das Befolgen dieser beiden Regeln kann bedeuten, dass Sie vor und nach der Zugriffskontrolle eine Validierung durchführen müssen.
quelle
Zusätzlich zu der möglichen Frustration, einen "Zugriff verweigert" zu erhalten, nachdem die Eingabe validiert wurde; Beachten Sie auch, dass die Validierungsschicht , sofern sie nicht sehr einfach ist, immer Informationen vom Controller benötigen kann . Vor diesem Hintergrund ist es meiner Meinung nach sinnvoller, die Validierung hinter der Zugriffskontrolle näher am Controller zu positionieren .
quelle
Das hängt davon ab, was Sie unter Validierungsebene verstehen. Wenn Sie damit nur die Syntax der Anforderung überprüfen möchten, ist dies sicher und muss auf jeden Fall erledigt werden. Wenn bei Ihrer Validierung Informationen verwendet werden , auf die ein nicht privilegierter Benutzer keinen Zugriff hat, ist dies nicht mehr sicher.
Sie sollten auf jeden Fall eine Sicherheitsüberprüfung haben, bevor Sie versuchen, den Zugriff zu kontrollieren, aber Sie sollten darauf achten, allen Betreuern (derzeit und in Zukunft) klar und deutlich mitzuteilen, dass dieser Teil keine privilegierten Informationen verwenden darf . Solche Überprüfungen sollten nach der Authentifizierung in einem separaten Validierungsschritt durchgeführt werden .
Als Sicherheitsüberprüfung für das Sicherheitsüberprüfungsprogramm sollte es keine Code-Abhängigkeiten zu einem Teil Ihres Codes weiter unten in der Pipeline aufweisen und in ein eigenes Paket zerlegbar sein, das problemlos öffentlich veröffentlicht werden kann (mit Ausnahme möglicher rechtlicher Probleme). . Wenn Sie das nicht können, tut Ihre "Validierungsschicht" zu viel (oder Ihre Codebasis ist ein Chaos).
quelle
Nein, es ist nicht in Ordnung.
Wenn Sie einen Fehler in Ihrer Validierungsschicht haben, wird die Sicherheitsschicht möglicherweise umgangen.
Es ist ein häufiger Fehler, Sicherheit als Teil der Geschäftsanforderungen zu betrachten. "Nur Benutzer mit der Rolle Umsatz sollten in der Lage sein, die Quartalszahlen zu sehen", 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 ausgeführt wird Jede Art von Code, den Sie geschrieben haben, oder Dateien auf dem Server.
quelle