Autorisierung und Zugriffskontrolle
Authentifizierung beweist, wer Sie sind. Autorisierung entscheidet, worauf Sie zugreifen dürfen. Der häufigste und schädlichste Fehler moderner Apps ist, Letzteres falsch zu machen: Ein angemeldeter Benutzer liest oder ändert Daten, die ihm nicht gehören.
Checkliste
- Eigentum bei jedem Objektzugriff prüfen. Bei jeder Route, die eine ID entgegennimmt (eine Rechnung, eine Notiz, ein Projekt, eine Nachricht), bestätigen Sie, dass der aktuelle Benutzer diesen konkreten Datensatz besitzt oder darauf zugreifen darf, bevor Sie ihn zurückgeben oder ändern. Dies ist Broken Object Level Authorization (BOLA), auch IDOR genannt, und laut OWASP das Risiko Nummer eins.
- Nach dem Besitzer filtern, nicht nur nach der ID. Eine Abfrage wie
SELECT * FROM invoices WHERE id = ?ist ein IDOR. Machen Sie darausWHERE id = ? AND owner_id = ?und geben Sie bei einem Treffer-Fehlschlag 404 zurück. - Nicht auf den Client verlassen, um Dinge zu verbergen. Ein versteckter Button oder ein fehlender Link ist keine Zugriffskontrolle. Die Prüfung muss auf dem Server erfolgen.
- Autorisierung beim Refactoring beibehalten. Zugriffsprüfungen, die in einer Änderung ergänzt wurden, fallen in der nächsten oft weg. Testen Sie die Eigentumsrechte nach jeder Änderung an Datenrouten erneut.
- Row-Level Security in der Datenbank erzwingen, wo Ihre Plattform sie unterstützt, damit eine vergessene Prüfung im Code von der Datenebene trotzdem abgefangen wird.
- Jede Admin- und interne Route absichern. Bestätigen Sie, dass der Aufrufer wirklich Admin ist, und zwar anhand einer serverseitigen Rolle und nicht eines Feldes, das der Benutzer selbst setzen kann. Halten Sie rein interne Routen aus dem öffentlichen Internet unerreichbar.
- Mandanten isolieren. In einer Multi-Tenant-App muss jede Abfrage und jeder Dateipfad über einen zentralen Kontrollpunkt auf den Mandanten des Aufrufers beschränkt sein, damit ein Kunde niemals Daten oder Dateien eines anderen erreicht.
- Dateipfade einschränken. Wenn eine Anfrage eine Datei benennt, lösen Sie den Pfad auf und bestätigen Sie, dass er innerhalb des erlaubten Verzeichnisses bleibt. Die Prüfung muss an einem Pfadtrenner enden, damit ein Nachbarordner mit längerem Namen nicht erreichbar ist.
Testvorgehen
- Legen Sie zwei Konten an. Fordern Sie als Konto A die Objekt-IDs von Konto B direkt an. Nichts davon sollte zurückkommen.
- Rufen Sie eine Admin-Route mit dem Token eines normalen Benutzers auf. Erwartet wird 403.
- Testen Sie an jedem Dateiendpunkt Pfade im Stil
../und Pfade mit einem Nachbarpräfix.