Welche HTTP-Antwort muss für eine vorhandene Webseite verwendet werden, für die ein Benutzer jedoch nicht über ausreichende Berechtigungen verfügt (er ist nicht angemeldet oder gehört nicht zur richtigen Benutzergruppe)?
401 Unauthorized
?
403 Forbidden
?
Etwas anderes?
Was ich bisher auf jedem gelesen habe, ist nicht sehr klar über den Unterschied zwischen den beiden. Welche Anwendungsfälle sind für jede Antwort geeignet?
http-headers
http-status-code-403
http-status-codes
http-status-code-401
http-response-codes
VirtuosiMedia
quelle
quelle
Antworten:
Eine klare Erklärung von Daniel Irvine :
Ein weiteres schönes Bildformat, wie http-Statuscodes verwendet werden sollten.
quelle
Siehe RFC2616 :
401 nicht Autorisiert:
403 Verboten:
Aktualisieren
Aus Ihrem Anwendungsfall geht hervor, dass der Benutzer nicht authentifiziert ist. Ich würde 401 zurückgeben.
Bearbeiten: RFC2616 ist veraltet, siehe RFC7231 und RFC7235 .
quelle
Die anderen Antworten fehlen, dass verstanden werden muss, dass sich Authentifizierung und Autorisierung im Kontext von RFC 2616 NUR auf das HTTP-Authentifizierungsprotokoll von RFC 2617 bezieht. Die Authentifizierung durch Schemata außerhalb von RFC2617 wird in HTTP-Statuscodes nicht unterstützt und nicht berücksichtigt bei der Entscheidung, ob 401 oder 403 verwendet werden soll.
Kurz und knapp
Nicht autorisiert zeigt an, dass der Client nicht RFC2617-authentifiziert ist und der Server den Authentifizierungsprozess initiiert. Verboten gibt an, dass der Client entweder RFC2617-authentifiziert und nicht autorisiert ist oder dass der Server RFC2617 für die angeforderte Ressource nicht unterstützt.
Das heißt, wenn Sie einen eigenen Anmeldevorgang haben und niemals die HTTP-Authentifizierung verwenden, ist 403 immer die richtige Antwort und 401 sollte niemals verwendet werden.
Detailliert und ausführlich
Von RFC2616
und
Beachten Sie zunächst, dass sich "Authentifizierung" und "Autorisierung" im Kontext dieses Dokuments speziell auf die HTTP-Authentifizierungsprotokolle von RFC 2617 beziehen. Sie beziehen sich nicht auf von Ihnen erstellte Roll-Your-Own-Authentifizierungsprotokolle Verwenden von Anmeldeseiten usw. Ich werde "Anmelden" verwenden, um auf die Authentifizierung und Autorisierung durch andere Methoden als RFC2617 zu verweisen
Der wirkliche Unterschied besteht also nicht darin, was das Problem ist oder ob es eine Lösung gibt. Der Unterschied besteht darin, was der Server vom Client als Nächstes erwartet.
401 gibt an, dass die Ressource nicht bereitgestellt werden kann, der Server jedoch anfordert, dass sich der Client über die HTTP-Authentifizierung anmeldet und Antwortheader gesendet hat, um den Prozess zu starten. Möglicherweise gibt es Berechtigungen, die den Zugriff auf die Ressource ermöglichen, möglicherweise nicht, aber versuchen wir es mal und sehen, was passiert.
403 gibt an, dass die Ressource nicht bereitgestellt werden kann und es für den aktuellen Benutzer keine Möglichkeit gibt, dies durch RFC2617 zu lösen, und es macht keinen Sinn, es zu versuchen. Dies kann daran liegen, dass bekanntermaßen keine Authentifizierungsstufe ausreicht (z. B. aufgrund einer IP-Blacklist), aber möglicherweise daran, dass der Benutzer bereits authentifiziert ist und keine Berechtigung besitzt. Das RFC2617-Modell besteht aus einem Benutzer und einem Berechtigungsnachweis, sodass der Fall, in dem der Benutzer möglicherweise über einen zweiten Satz von Berechtigungsnachweisen verfügt, die autorisiert werden könnten, möglicherweise ignoriert wird. Es wird weder vorgeschlagen noch impliziert, dass eine Anmeldeseite oder ein anderes Nicht-RFC2617-Authentifizierungsprotokoll hilfreich sein kann oder nicht - das liegt außerhalb der RFC2616-Standards und -Definitionen.
Bearbeiten: RFC2616 ist veraltet, siehe RFC7231 und RFC7235 .
quelle
WWW-Authenticate
Headers darstellen? Selbst wenn ein Browser dies nicht unterstützt, kann meine React-App ...Überprüfungen werden normalerweise in dieser Reihenfolge durchgeführt:
UNAUTHORIZED : Statuscode (401), der angibt, dass für die Anforderung eine Authentifizierung erforderlich ist. Dies bedeutet normalerweise , dass der Benutzer angemeldet sein muss (Sitzung). Benutzer / Agent vom Server unbekannt. Kann mit anderen Anmeldeinformationen wiederholen. HINWEIS: Dies ist verwirrend, da dies als "nicht authentifiziert" anstelle von "nicht autorisiert" hätte bezeichnet werden sollen. Dies kann auch nach der Anmeldung geschehen, wenn die Sitzung abgelaufen ist. Sonderfall: Kann anstelle von 404 verwendet werden, um zu vermeiden, dass Ressourcen vorhanden oder nicht vorhanden sind (Credits @gingerCodeNinja).
VERBOTEN : Statuscode (403), der angibt, dass der Server die Anforderung verstanden hat, sich jedoch geweigert hat, sie zu erfüllen. Benutzer / Agent, der dem Server bekannt ist, aber nicht über ausreichende Anmeldeinformationen verfügt . Das Wiederholen der Anforderung funktioniert nur, wenn die Anmeldeinformationen geändert werden, was in kurzer Zeit sehr unwahrscheinlich ist. Sonderfall: Kann anstelle von 404 verwendet werden, um zu vermeiden, dass Ressourcen vorhanden oder nicht vorhanden sind (Credits @gingerCodeNinja).
NICHT GEFUNDEN : Statuscode (404) zeigt an, dass die angeforderte Ressource nicht verfügbar ist. Benutzer / Agent bekannt, aber Server gibt nichts über die Ressource preis, tut so, als ob sie nicht existiert. Wiederholen funktioniert nicht. Dies ist eine spezielle Verwendung von 404 (Github macht es zum Beispiel).
Wie von @ChrisH erwähnt, gibt es einige Optionen für die 3xx- Umleitung (301, 302, 303, 307 oder gar keine Umleitung und Verwendung eines 401):
quelle
no reveal
Fall manchmal über subtile Zeitunterschiede erkannt werden kann und nicht als Sicherheitsmerkmal angesehen werden sollte. Es kann nur Angreifer verlangsamen oder ein wenig zum Schutz der Privatsphäre beitragen.Gemäß RFC 2616 (HTTP / 1.1) wird 403 gesendet, wenn:
Mit anderen Worten, wenn der Client durch Authentifizierung Zugriff auf die Ressource erhalten kann, sollte 401 gesendet werden.
quelle
An origin server that wishes to "hide" the current existence of a forbidden target resource MAY instead respond with a status code of 404 (Not Found).
Angenommen, die HTTP-Authentifizierung ( WWW-Authentifizierungs- und Autorisierungsheader ) wird verwendet . Wenn die Authentifizierung als ein anderer Benutzer Zugriff auf die angeforderte Ressource gewähren würde, sollte 401 Unauthorized zurückgegeben werden.
403 Verboten wird verwendet, wenn der Zugriff auf die Ressource für alle Personen verboten oder auf ein bestimmtes Netzwerk beschränkt oder nur über SSL zulässig ist, sofern dies nicht mit der HTTP-Authentifizierung zusammenhängt.
Wenn die HTTP-Authentifizierung nicht verwendet wird und der Dienst ein Cookie-basiertes Authentifizierungsschema ist, wie es heutzutage üblich ist, sollte ein 403 oder ein 404 zurückgegeben werden.
In Bezug auf 401 stammt dies aus RFC 7235 (Hypertext Transfer Protocol (HTTP / 1.1): Authentifizierung):
Die Semantik von 403 (und 404) hat sich im Laufe der Zeit geändert. Dies ist von 1999 (RFC 2616):
Im Jahr 2014 änderte RFC 7231 (Hypertext Transfer Protocol (HTTP / 1.1): Semantik und Inhalt) die Bedeutung von 403:
Somit könnte ein 403 (oder ein 404) jetzt über alles bedeuten. Das Bereitstellen neuer Anmeldeinformationen kann hilfreich sein ... oder auch nicht.
Ich glaube, der Grund, warum sich dies geändert hat, ist die Annahme von RFC 2616, dass die HTTP-Authentifizierung verwendet wird, wenn in der Praxis heutige Web-Apps benutzerdefinierte Authentifizierungsschemata erstellen, die beispielsweise Formulare und Cookies verwenden.
quelle
Dies ist eine ältere Frage, aber eine Option, die nie wirklich angesprochen wurde, war die Rückgabe eines 404. Aus Sicherheitsgründen leidet die Antwort mit der höchsten Bewertung an einer potenziellen Sicherheitslücke in Bezug auf Informationslecks . Angenommen, die betreffende sichere Webseite ist eine Systemadministrationsseite oder häufiger ein Datensatz in einem System, auf den der Benutzer keinen Zugriff hat. Idealerweise möchten Sie nicht, dass ein böswilliger Benutzer überhaupt weiß, dass sich dort eine Seite / ein Datensatz befindet, geschweige denn, dass er keinen Zugriff hat. Wenn ich so etwas erstelle, werde ich versuchen, nicht authentifizierte / nicht autorisierte Anforderungen in einem internen Protokoll aufzuzeichnen, aber einen 404 zurückgeben.
OWASP bietet weitere Informationen darüber, wie ein Angreifer diese Art von Informationen als Teil eines Angriffs verwenden kann.
quelle
quelle
Diese Frage wurde vor einiger Zeit gestellt, aber das Denken der Menschen geht weiter.
Abschnitt 6.5.3 in diesem Entwurf (verfasst von Fielding und Reschke) gibt dem Statuscode 403 eine etwas andere Bedeutung als dem in RFC 2616 dokumentierten .
Es spiegelt wider, was in Authentifizierungs- und Autorisierungsschemata geschieht, die von einer Reihe gängiger Webserver und Frameworks verwendet werden.
Ich habe das hervorgehoben, was ich für am auffälligsten halte.
Unabhängig von der verwendeten Konvention ist es wichtig, die Einheitlichkeit Ihrer Site / API zu gewährleisten.
quelle
TL; DR
Praktische Beispiele
Wenn Apache eine Authentifizierung (via
.htaccess
) erfordert und Sie drückenCancel
, antwortet er mit einem401 Authorization Required
Wenn nginx eine Datei findet, aber keine Zugriffsrechte (Benutzer / Gruppe) zum Lesen / Zugreifen darauf hat, antwortet es mit
403 Forbidden
RFC (2616 Abschnitt 10)
401 Nicht autorisiert (10.4.2)
Bedeutung 1: Authentifizierung erforderlich
Bedeutung 2: Authentifizierung unzureichend
403 Verboten (10.4.4)
Bedeutung: Nicht mit der Authentifizierung verbunden
Mehr Details:
(Wenn der Server diese Informationen vom Client fernhalten möchte)
quelle
Sie haben zwei verschiedene Fälle angegeben; Jeder Fall sollte eine andere Antwort haben:
Hinweis zum RFC basierend auf Kommentaren zu dieser Antwort:
Wenn der Benutzer nicht angemeldet ist, ist er nicht authentifiziert. Das HTTP-Äquivalent lautet 401 und wird im RFC irreführend als Nicht autorisiert bezeichnet. In Abschnitt 10.4.2 heißt es für 401 Unauthorized :
Wenn Sie nicht authentifiziert sind, ist 401 die richtige Antwort. Wenn Sie jedoch nicht autorisiert sind, ist 403 im semantisch korrekten Sinne die richtige Antwort.
quelle
Dies sind die Bedeutungen:
401 : Benutzer nicht (korrekt) authentifiziert, die Ressource / Seite muss authentifiziert werden
403 : Benutzer authentifiziert, aber seine Rolle oder Berechtigungen erlauben keinen Zugriff auf die angeforderte Ressource. Beispielsweise ist der Benutzer kein Administrator und die angeforderte Seite ist für Administratoren
quelle
Das ist in meinem Kopf einfacher als irgendwo hier, also:
401: Sie benötigen eine HTTP-Basisauthentifizierung, um dies zu sehen.
403: Sie können dies nicht sehen, und die HTTP-Basisauthentifizierung hilft nicht weiter.
Wenn sich der Benutzer nur mit dem Standard-HTML-Anmeldeformular Ihrer Site anmelden muss, ist 401 nicht geeignet, da es spezifisch für die HTTP-Basisauthentifizierung ist.
Ich empfehle nicht, 403 zu verwenden, um den Zugriff auf Dinge wie zu verweigern
/includes
, da diese Ressourcen im Web überhaupt nicht vorhanden sind und daher 404 sein sollten.Damit bleibt 403 als "Sie müssen angemeldet sein".
Mit anderen Worten bedeutet 403 "diese Ressource erfordert eine andere Form der Authentifizierung als die HTTP-Basisauthentifizierung".
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2
quelle
Ich denke, es ist wichtig zu berücksichtigen, dass 401 für einen Browser einen Authentifizierungsdialog initiiert, in dem der Benutzer neue Anmeldeinformationen eingeben kann, während 403 dies nicht tut. Browser sind der Meinung, dass der Benutzer sich erneut authentifizieren sollte, wenn ein 401 zurückgegeben wird. 401 steht also für ungültige Authentifizierung, während 403 für mangelnde Berechtigung steht.
Hier sind einige Fälle unter dieser Logik, in denen ein Fehler von der Authentifizierung oder Autorisierung zurückgegeben wird, wobei wichtige Sätze fett gedruckt sind.
401 : Der Client sollte Anmeldeinformationen angeben.
400 : Das ist weder 401 noch 403, da Syntaxfehler immer 400 zurückgeben sollten.
401 : Der Client sollte gültige Anmeldeinformationen angeben.
401 : Auch hier sollte der Client gültige Anmeldeinformationen angeben.
401 : Dies entspricht praktisch den ungültigen Anmeldeinformationen im Allgemeinen. Daher sollte der Client gültige Anmeldeinformationen angeben.
403 : Durch die Angabe gültiger Anmeldeinformationen wird kein Zugriff auf die Ressource gewährt, da die aktuellen Anmeldeinformationen bereits gültig sind, jedoch nur keine Berechtigung haben.
403 : Dies ist unabhängig von den Anmeldeinformationen. Die Angabe gültiger Anmeldeinformationen kann daher nicht helfen.
403 : Wenn der Client blockiert ist, führt die Angabe neuer Anmeldeinformationen zu nichts.
quelle
Auf Englisch:
401
403
quelle
Angesichts der neuesten RFCs zu diesem Thema ( 7231 und 7235 ) scheint der Anwendungsfall ziemlich klar zu sein (Kursivschrift hinzugefügt):
quelle
authenticated
ist und wasauthorized
ist, und alle veralteten RFCs weggelassen, damit die Anwendung klar ist.Im Fall von 401 vs 403 wurde dies viele Male beantwortet. Dies ist im Wesentlichen eine Debatte über die HTTP-Anforderungsumgebung und keine Debatte über die Anwendung.
Es scheint eine Frage zum Problem des Roll-Your-Own-Login (Anwendung) zu geben.
In diesem Fall reicht es nicht aus, einfach nicht angemeldet zu sein, um eine 401 oder eine 403 zu senden, es sei denn, Sie verwenden HTTP Auth gegen eine Anmeldeseite (nicht an die Einstellung von HTTP Auth gebunden). Es hört sich so an, als würden Sie nach einem "201 Created" suchen, bei dem (anstelle der angeforderten Ressource) ein Roll-Your-Own-Login-Bildschirm für den Zugriff auf eine Datei auf Anwendungsebene vorhanden ist. Dies sagt:
"Ich habe dich gehört, es ist hier, aber versuche es stattdessen (du darfst es nicht sehen)"
quelle