Frage 403 Forbidden vs 401 Nicht autorisierte HTTP-Antworten


Für eine Webseite, die zwar vorhanden ist, für die jedoch ein Benutzer nicht über ausreichende Berechtigungen verfügt (sie sind nicht angemeldet oder gehören nicht zur richtigen Benutzergruppe), welche HTTP-Antwort ist angemessen? 401? 403? Etwas anderes? Was ich bisher gelesen habe, ist über den Unterschied zwischen den beiden nicht klar. Welche Anwendungsfälle sind für jede Antwort geeignet?


1896
2017-07-21 07:21


Ursprung


Antworten:


Eine klare Erklärung von Daniel Irvine:

Es gibt ein Problem mit 401 nicht Autorisiertder HTTP-Statuscode für Authentifizierungsfehler. Und das ist es nur: Es ist für die Authentifizierung, nicht für die Autorisierung.   Wenn Sie eine 401-Antwort erhalten, sagt Ihnen der Server: "Sie sind es nicht   authentifiziert - entweder nicht authentifiziert oder authentifiziert   falsch - aber bitte erneut authentifizieren und erneut versuchen. "Um Ihnen zu helfen,   es wird immer ein enthalten WWW-Authentifizieren Überschrift, die beschreibt, wie   authentifizieren.

Dies ist eine Antwort, die im Allgemeinen von Ihrem Webserver und nicht von Ihrem Web zurückgegeben wird   Anwendung.

Es ist auch etwas sehr temporäres; Der Server fordert Sie auf, es zu versuchen   nochmal.

Also, zur Autorisierung benutze ich die 403 Verboten Antwort. Es ist   permanent, es ist an meine Anwendungslogik gebunden und es ist konkreter   Antwort als ein 401.

Wenn der Server eine 403 Antwort erhält, sagt er: "Es tut mir leid. Ich kenne   Wer du bist - ich glaube, du sagst, du bist - aber du hast es einfach nicht   Erlaubnis, auf diese Ressource zuzugreifen. Vielleicht, wenn Sie das System fragen   Administrator schön, Sie erhalten die Erlaubnis. Aber bitte nicht stören   ich wieder, bis sich Ihre missliche Lage ändert. "

Zusammenfassend, a 401 nicht Autorisiert Antwort sollte für fehlende verwendet werden   oder schlechte Authentifizierung, und a 403 Verboten Antwort sollte verwendet werden   danach, wenn der Benutzer authentifiziert ist, aber nicht autorisiert ist   Führen Sie die angeforderte Operation für die angegebene Ressource aus.

Ein weiterer schönes Bildformat wie HTTP-Statuscodes verwendet werden sollten.


2828
2017-08-04 06:24



Sehen RFC2616:

401 nicht Autorisiert:

Wenn die Anforderung bereits Autorisierungsanmeldeinformationen enthielt, weist die 401-Antwort darauf hin, dass die Autorisierung für diese Anmeldeinformationen abgelehnt wurde.

403 Verboten:

Der Server hat die Anfrage verstanden, weigert sich aber, sie zu erfüllen.

Aktualisieren

Aus Ihrem Anwendungsfall scheint der Benutzer nicht authentifiziert zu sein. Ich würde 401 zurückgeben.


Bearbeiten: RFC2616 ist veraltet, siehe RFC7231 und RFC7235.


336
2017-07-21 07:28



Etwas, das die anderen Antworten fehlen, ist, dass die Authentifizierung und Autorisierung im Zusammenhang mit RFC 2616 NUR auf das HTTP-Authentifizierungsprotokoll von RFC 2617 zu verstehen ist. 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 zu verwenden.

Kurz und knapp

Unauthorized gibt an, dass der Client nicht RFC2617-authentifiziert ist und der Server den Authentifizierungsprozess initiiert. Forbidden gibt an, dass der Client RFC2617-authentifiziert ist und keine Berechtigung hat oder dass der Server RFC2617 für die angeforderte Ressource nicht unterstützt.

Das heißt, wenn Sie Ihren eigenen Login-Prozess 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

10.4.2 401 Nicht autorisiert

Die Anfrage erfordert eine Benutzerauthentifizierung. Die Antwort MUSS ein WWW-Authenticate-Header-Feld (Abschnitt 14.47) enthalten, das eine für die angeforderte Ressource anwendbare Abfrage enthält. Der Kunde kann die Anfrage mit einem geeigneten Autorisierungs-Header-Feld wiederholen (Abschnitt 14.8).

und

10.4.4 403 Verboten   Der Server hat die Anfrage verstanden, weigert sich aber, sie zu erfüllen. Die Autorisierung wird nicht helfen und die Anfrage sollte nicht wiederholt werden.

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 Ihre selbst erstellten Authentifizierungsprotokolle Verwenden von Login-Seiten usw. Ich verwende "Login", um auf Authentifizierung und Autorisierung durch andere Methoden als RFC2617 zu verweisen

Der wahre Unterschied ist also nicht, was das Problem ist oder ob es eine Lösung gibt. Der Unterschied ist, was der Server als nächstes vom Client erwartet.

401 gibt an, dass die Ressource nicht bereitgestellt werden kann, aber der Server REQUESTIERT, dass sich der Client über die HTTP-Authentifizierung anmeldet und Antwort-Header gesendet hat, um den Prozess zu initiieren. Möglicherweise gibt es Autorisierungen, die den Zugriff auf die Ressource erlauben, möglicherweise nicht, aber wir sollten es versuchen und sehen, was passiert.

403 zeigt an, dass die Ressource nicht bereitgestellt werden kann und dass es für den aktuellen Benutzer keine Möglichkeit gibt, dies über RFC2617 zu lösen, und es keinen Sinn hat, dies zu versuchen. Dies kann daran liegen, dass bekannt ist, dass keine Authentifizierungsstufe ausreichend ist (z. B. aufgrund einer IP-Blacklist), dies kann jedoch daran liegen, dass der Benutzer bereits authentifiziert ist und keine Berechtigung besitzt. Das RFC2617-Modell besteht aus Ein-Benutzer- und Ein-Berechtigungsnachweisen, so dass der Fall, dass der Benutzer möglicherweise einen zweiten Satz von Berechtigungsnachweisen hat, die autorisiert werden könnten, ignoriert werden kann. Es wird weder vorgeschlagen noch impliziert, dass irgendeine Art von Login-Seite oder ein anderes Nicht-RFC2617-Authentifizierungsprotokoll helfen kann oder nicht - das ist außerhalb der RFC2616-Standards und -Definitionen.


Bearbeiten: RFC2616 ist veraltet, siehe RFC7231 und RFC7235.


254
2018-02-05 17:14



Gemäß RFC 2616 (HTTP / 1.1) 403 wird gesendet, wenn:

Der Server hat die Anfrage verstanden, weigert sich aber, sie zu erfüllen. Die Autorisierung wird nicht helfen und die Anfrage sollte nicht wiederholt werden. Wenn die Anfrage-Methode nicht HEAD war und der Server öffentlich machen wollte, warum die Anfrage nicht erfüllt wurde, SOLLTE der Grund für die Ablehnung in der Entität beschrieben werden. Wenn der Server diese Informationen dem Client nicht zur Verfügung stellen möchte, kann stattdessen der Statuscode 404 (Not Found) verwendet werden

Mit anderen Worten, wenn der Client durch Authentifizierung Zugriff auf die Ressource erhalten kann, sollte 401 gesendet werden.


94
2017-07-21 07:26



TL, DR-Version

    GET-Ressource, existiert?
    | |
    | |
    v v
NO: 404 JA: Ist authentifiziert?
             | |
             | |
             v v
           NO: 401 JA: Kann auf Ressourcen zugreifen?
           (oder: 404) | |
           oder 301 | |
           Weiterleitung v v
           Login NO: 403 OK 200, 301, ...

Die Überprüfungen werden normalerweise in dieser Reihenfolge durchgeführt:

  • 401 wenn nicht eingeloggt oder Sitzung abgelaufen
  • 403 wenn der Benutzer keine Berechtigung zum Zugriff auf die Ressource hat
  • 404 falls Ressource nicht existiert

UNBEFUGT: Statuscode (401), der angibt, dass die Anforderung erforderlich ist Authentifizierung. Benutzer / Agent unbekannt vom Server. Kann mit anderen Anmeldeinformationen wiederholt werden. HINWEIS: Dies ist verwirrend, da es "nicht authentifiziert" statt "nicht autorisiert" heißen sollte.

VERBOTEN: Statuscode (403), der angibt, dass der Server die Anforderung verstanden hat, diese jedoch nicht erfüllt hat. Benutzer / Agent, der vom Server bekannt ist, hat jedoch unzureichende Anmeldeinformationen. Die wiederholte Anfrage funktioniert nicht.

NICHT GEFUNDEN: Statuscode (404), der anzeigt, dass die angeforderte Ressource nicht verfügbar ist. Der Benutzer / Agent ist bekannt, aber der Server wird nichts über die Ressource verraten, als ob sie nicht existiert. Das Wiederholen wird nicht funktionieren. Dies ist eine spezielle Verwendung von 404 (github tut es zum Beispiel).


46
2018-02-23 11:00



Wenn die Authentifizierung als anderer Benutzer den Zugriff auf die angeforderte Ressource gewähren würde, sollte 401 Nicht autorisiert zurückgegeben werden. 403 Verboten wird meistens verwendet, wenn der Zugriff auf die Ressource für alle Benutzer verboten oder auf ein bestimmtes Netzwerk beschränkt oder nur über SSL erlaubt ist, unabhängig von der Art der Authentifizierung.

Aus RFC 7235 (Hypertext Transfer Protocol (HTTP / 1.1): Authentifizierung):

3.1. 401 nicht Autorisiert

Der 401 (Unauthorized) Statuscode zeigt an, dass die Anfrage hat   wurde nicht angewendet, da keine gültigen Authentifizierungsdaten vorhanden sind   für die Zielressource. Der Ursprungsserver MUSS senden   WWW-Authenticate Header-Feld (Abschnitt 4.4) mit mindestens einem   Herausforderung für die Zielressource. Wenn die Anfrage   Authentifizierungsinformationen enthalten, dann die 401-Antwort   zeigt an, dass die Genehmigung für diese verweigert wurde   Referenzen. Der Kunde kann die Anfrage mit einem neuen oder wiederholen   das Autorisierungsheaderfeld wurde ersetzt (Abschnitt 4.1). Wenn die 401   Antwort enthält die gleiche Herausforderung wie die vorherige Antwort und die   Der Benutzeragent hat die Authentifizierung bereits mindestens einmal versucht   der Benutzeragent SOLLTE die beigefügte Darstellung der   Benutzer, da es in der Regel relevante Diagnoseinformationen enthält.

Und das ist von RFC 2616:

10.4.4 403 Verboten

Der Server hat die Anfrage verstanden, weigert sich aber, sie zu erfüllen.
Die Autorisierung wird nicht helfen und die Anfrage sollte nicht wiederholt werden.
  Wenn die Anfrage-Methode nicht HEAD war und der Server es wünscht
  Öffentlichkeit, warum die Anfrage nicht erfüllt wurde, sollte es beschreiben die   Grund für die Ablehnung in der Entität. Wenn der Server dies nicht möchte   Stellen Sie dem Kunden diese Informationen zur Verfügung, den Statuscode 404
  (Nicht gefunden) kann stattdessen verwendet werden.

Edit: RFC 7231 (Hypertext Transfer Protocol (HTTP / 1.1): Semantik und Inhalt) ändert die Bedeutung von 403:

6.5.3. 403 Verboten

Der Statuscode 403 (Verboten) gibt an, dass der Server   verstanden die Anfrage, weigert sich aber, sie zu autorisieren. Ein Server, der   möchte veröffentlichen, warum die Anfrage verboten wurde   Beschreiben Sie diesen Grund in der Antwort-Payload (falls vorhanden).

Wenn in der Anfrage Authentifizierungsdaten angegeben wurden, wird die
  Server betrachtet sie als nicht ausreichend, um Zugriff zu gewähren. Der Kunde
  SOLLTE nicht automatisch die Anfrage mit dem gleichen wiederholen
  Referenzen. Der Kunde kann die Anfrage mit neuen oder anderen wiederholen   Referenzen. Eine Anfrage kann jedoch aus Gründen verboten sein
  unabhängig von den Anmeldeinformationen.

Ein Ursprungsserver, der die aktuelle Existenz von a verbergen möchte
  verbotene Zielressource MAY stattdessen mit einem Statuscode von antworten
  404 Nicht gefunden).

Daher könnte ein 403 nun alles bedeuten. Das Bereitstellen neuer Anmeldedaten könnte helfen ... oder auch nicht.


37
2018-02-27 09:44



Dies ist eine ältere Frage, aber eine Option, die nie wirklich angesprochen wurde, war die Rückgabe eines 404. Aus Sicherheitsaspekten leidet die Antwort mit der höchsten Wahl an einem Potenzial Informationsleckage-Schwachstelle. Nehmen wir zum Beispiel an, dass es sich bei der fraglichen sicheren Webseite um eine Systemadministrationsseite handelt, oder vielleicht häufiger um einen Datensatz in einem System, auf das der Benutzer keinen Zugriff hat. Im Idealfall möchten Sie nicht, dass ein böswilliger Benutzer überhaupt weiß, dass dort eine Seite / ein Datensatz vorhanden ist, geschweige denn, dass sie keinen Zugriff haben. Wenn ich so etwas erstelle, versuche ich, nicht authentifizierte / nicht autorisierte Anfragen in einem internen Protokoll aufzuzeichnen, aber gebe 404 zurück.

OWASP hat einige Mehr Informationen darüber, wie ein Angreifer diese Art von Informationen als Teil eines Angriffs verwenden könnte.


20
2017-12-25 09:09



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) erhält der Statuscode 403 eine etwas andere Bedeutung als in RFC 2616.

Es spiegelt wider, was in Authentifizierungs- und Autorisierungsschemata geschieht, die von einer Anzahl von populären Web-Servern und Frameworks verwendet werden.

Ich habe das Stück betont, das meiner Meinung nach am auffälligsten ist.

6.5.3. 403 Verboten

Der Statuscode 403 (Verboten) gibt an, dass der Server die Anfrage verstanden hat, sie aber nicht autorisieren möchte. Ein Server, der veröffentlichen möchte, warum die Anforderung verboten wurde, kann diesen Grund in der Antwort-Nutzlast (falls vorhanden) beschreiben.

Wenn in der Anforderung Authentifizierungsdaten angegeben wurden, betrachtet der Server sie als nicht ausreichend, um Zugriff zu gewähren. Der Client SOLLTE die Anfrage nicht mit den gleichen Zugangsdaten wiederholen. Der Kunde kann die Anfrage mit neuen oder anderen Zugangsdaten wiederholen.  Eine Anfrage kann jedoch aus Gründen, die nicht mit den Zugangsdaten zusammenhängen, verboten sein.

Ein Ursprungsserver, der die aktuelle Existenz einer verbotenen Zielressource "verbergen" möchte, kann stattdessen mit dem Statuscode 404 (Nicht gefunden) antworten.

Unabhängig von der Konvention, die Sie verwenden, ist es wichtig, Einheitlichkeit für Ihre Website / API bereitzustellen.


19
2018-05-22 10:54



TL; DR

  • 401: Eine Ablehnung, die mit der Authentifizierung zu tun hat
  • 403: Eine Ablehnung, die nichts mit Authentifizierung zu tun hat

Praktische Beispiele

Ob Apache  erfordert Authentifizierung (über .htaccess), und Sie schlagen Cancel, wird es mit einem antworten 401 Authorization Required

Ob nginx findet eine Datei, hat aber keine Zugangsrechte (Benutzer / Gruppe) um es zu lesen / darauf zuzugreifen, es wird mit antworten 403 Forbidden

RFC (2616 Abschnitt 10)

401 Nicht autorisiert (10.4.2)

Bedeutung 1: Muss authentifiziert werden

Die Anfrage erfordert eine Benutzerauthentifizierung. ...

Bedeutung 2: Authentifizierung nicht ausreichend

... Wenn die Anforderung bereits Autorisierungsanmeldeinformationen enthielt, weist die 401-Antwort darauf hin, dass die Autorisierung für diese Anmeldeinformationen abgelehnt wurde. ...

403 verboten (10.4.4)

Bedeutung: Ohne Bezug zur Authentifizierung

... Autorisierung wird nicht helfen ...

Mehr Details:

  • Der Server hat die Anfrage verstanden, weigert sich aber, sie zu erfüllen.

  • Es sollte den Grund für die Ablehnung in der Entität beschreiben

  • Der Statuscode 404 (Not Found) kann stattdessen verwendet werden

    (Wenn der Server diese Informationen vom Client behalten möchte)


9
2018-02-25 09:03