Bei der Arbeit mit einer ressourcenbasierten Site (z. B. einer MVC-Anwendung oder einem REST-Service) haben wir zwei Hauptoptionen, wenn ein Client versucht, auf GET
eine Ressource zuzugreifen, auf die er keinen Zugriff hat:
- 403 , die besagt, dass der Client nicht autorisiert ist ; oder
- 404 , die besagt, dass die Ressource nicht vorhanden ist (oder nicht gefunden werden konnte).
Allgemeine Weisheit und übliche Praxis scheinen zu sein, mit der Wahrheit zu antworten - das ist ein 403. Aber ich frage mich, ob dies tatsächlich das Richtige ist.
Sichere Anmeldesysteme geben niemals den Grund für einen Anmeldefehler an. Für den Kunden ist also kein Unterschied zwischen einem nicht vorhandenen Benutzernamen und einem falschen Passwort feststellbar. Damit sollen Benutzer-IDs - oder schlimmer noch E-Mail-Adressen - nicht auffindbar gemacht werden.
Aus Sicht des Datenschutzes erscheint es viel sicherer, einen 404 zurückzugeben. Ich erinnere mich an den Vorfall, bei dem Berichten zufolge jemand die Gewinner einer Reality-Show (Survivor, glaube ich) herausgefunden hat, indem er sich ansah, welche Ressourcen auf der nicht vorhanden waren Seite gegen welche. Ich mache mir Sorgen, dass ein 403 möglicherweise vertrauliche Informationen wie eine Seriennummer oder eine Kontonummer preisgibt.
Gibt es zwingende Gründe , einen 404 nicht zurückzugeben? Könnte eine 404-Richtlinie an anderer Stelle negative Nebenwirkungen haben? Wenn nicht, warum ist die Praxis dann nicht üblicher?
quelle
Antworten:
Es gibt ein allgemeines Missverständnis (und einen Missbrauch)
403 Forbidden
: Es soll nichts darüber verraten, was der Server über die Anfrage denkt. Es wurde speziell entwickelt, um zu sagen,Jeder UA oder Client sollte dies dahingehend interpretieren, dass die Anforderung niemals funktioniert, und angemessen reagieren.
Dies hat Auswirkungen auf Clients, die Anfragen im Namen von Benutzern bearbeiten: Wenn ein Benutzer nicht angemeldet ist, oder wenn er sich vertippt, sollte der Client, der die Anfrage bearbeitet, nach dem ersten Mal antworten: "Es tut mir leid, aber ich kann nichts tun" es bekommt das
403
und hört auf, zukünftige Anfragen zu bearbeiten. Wenn ein Benutzer nach einem Fehler weiterhin Zugriff auf seine persönlichen Informationen anfordern kann, ist dies offensichtlich ein benutzerfeindliches Verhalten.403
ist im Gegensatz zu401 Authorization Required
, was sich , dass der Server die Anforderung, solange Sie die richtigen Anmeldeinformationen passieren behandeln weggeben. Dies ist normalerweise das, woran die Leute denken, wenn sie hören403
.Es ist auch im Gegensatz dazu,
404 Page Not Found
was, wie andere betonten, nicht nur darauf ausgelegt ist, "Ich kann diese Seite nicht finden" zu sagen, sondern dem Client vorzuschlagen, dass der Server keine Ansprüche auf Erfolg oder Misserfolg für zukünftige Anforderungen erhebt.Mit
401
und404
sagt der Server dem Client oder der UA nichts darüber, wie er vorgehen soll: Er kann weiterhin versuchen, eine andere Antwort zu erhalten.Dies
404
ist der geeignete Weg, um eine Seite zu behandeln, die Sie nicht allen zeigen möchten, aber nichts darüber preisgeben möchten, warum Sie sie in bestimmten Situationen nicht zeigen.Dies setzt natürlich voraus, dass der Client, der die Anfrage stellt, sich um geringfügige RFC-Abweichungen kümmert. Ein Client, der böswillig genug ist, kümmert sich nicht um den zurückgegebenen Statuscode, außer auf zufällige Weise. Man erkennt, dass es sich um eine versteckte Benutzerseite (oder eine potenzielle versteckte Benutzerseite) handelt, indem man sie mit anderen bekannten Benutzerseiten vergleicht.
Nehmen wir an, Ihr Handler ist
users/*
. Wenn ich weißusers/foo
,users/bar
undusers/baaz
Arbeit, der Server einer Rückkehr401
,403
oder404
fürusers/quux
bedeutet nicht , ich werde es nicht versuchen, vor allem , wenn ich Grund zu glauben , dass es ist einquux
Benutzer. Ein Standard-Beispielszenario ist Facebook: Mein Profil ist privat, meine Kommentare zu öffentlichen Profilen jedoch nicht. Ein böswilliger Client weiß, dass ich existiere, auch wenn Sie404
auf meine Profilseite zurückkehren.Statuscodes sind also nicht für böswillige Anwendungsfälle gedacht, sondern für die Clients, die sich an die Regeln halten. Und für diese Kunden ist ein
401
oder eine404
Anfrage am besten geeignet.quelle
quux
es das gibt. Es wird jedoch nicht immer externe Beweise geben, insbesondere auf nicht-sozialen Websites, auf denen Kundendaten wirklich privat sind . Ein neugieriger oder feindlichen Benutzer könnte schließlich in der Lage sein zu folgern , dass du lügst, aber nicht unbedingt , welche Ressourcen Sie liegen über . Ich denke, der springende Punkt hier ist, dass Sie sich nicht um 404-Ressourcen kümmern müssen, es sei denn, es gibt keine anderen Methoden zur Ermittlung.Gemäß RFC2616
Beachten Sie auch, dass beim Zugriff auf verbotene Ressourcen die Autorisierung nicht hilft .
quelle
HttpUnauthorizedResult
das für privilegierte Ressourcen verwendet werden soll . Mir ist klar , auch (natürlich) , dass 404 kann stattdessen verwendet werden; Meine Frage ist, ob es verwendet werden soll oder nicht und was bei dieser Entscheidung zu beachten ist.Solltest du? Ja .
Du hast es selbst gesagt, verrate so wenig wie möglich. Wenn ich ein System angriff und bemerkte, dass der Server mit 403 Codes antwortete, würde ich mich auf diese konzentrieren, anstatt weiterzumachen. Besser, eine Tür verkündet, dass sie nicht existiert, als zu verkünden, dass sie gesperrt ist.
Der Nachteil bei der Verwendung von 404-Anforderungen besteht darin, dass es von außen so aussieht, als ob die Seite nicht vorhanden ist. Dies kann zu Konflikten im Vergleich zu Seiten führen, die vorhanden sein sollen , aber stattdessen fehlen. Wenn Sie sich keine Sorgen um Webcrawler machen (authentifizierte Systeme sollten sowieso komplett abgelehnt werden), sollten Sie sich unbedingt dafür entscheiden. Alle APIs, die ich nicht autorisiert habe, werden genauso behandelt wie StackOverflow . Kann diese Seite nicht sehen? Ich versichere Ihnen , es tut exist, obwohl er behauptet , nicht zu tun .
Sie sollten Anfragen bestätigen , wenn die Ressource bekannt zu existieren und der Zugriff verweigert wird. Eine fehlgeschlagene Anmeldung sollte nicht zu einer 404-Nachricht führen. Sie sollten Anforderungen nicht bestätigen, wenn die Existenz der Ressource selbst geschützt werden soll. Der Zugriff auf den Realm ist in der Öffentlichkeit vorhanden, die darin enthaltenen Sicherheitsgruppen oder -rollen jedoch nicht.
Entwickler sollten Zugriff auf Protokolle haben, die einen Versuch anzeigen, auf eine geschützte Ressource zuzugreifen. Kunden / Benutzer / Tester generieren Feedback, das schließlich einen Entwickler trifft.
Dies ist keine Sicherheit durch Unbekanntheit. Sie verwenden Unbekanntheit zusätzlich zu den richtigen Sicherheitsmaßnahmen.
Sie sind keine gültigen Anfragen, sie sind nicht autorisierte Anfragen. Sie ändern einen kleinen Teil (Rückgabe 404 statt 403), um einen wesentlichen Vorteil für potenzielle Angreifer zu erzielen.
quelle
Es hängt wirklich von den Informationen ab, die der Statuscode 403 liefert. Wenn ein API-Endpunkt
GET /myresource/{id}
mit einem 404 antwortet, wenn die Ressource nicht vorhanden ist, sollte der Statuscode, der vom Endpunkt zurückgegeben wird, wenn die Ressource vorhanden, aber nicht für den aktuellen Benutzer autorisiert ist, von der Vorhersagbarkeit desid
Parameters und der Menge abhängen von Informationen, die es selbst enthält.id
es sich um ein privates Feld wie eine E-Mail-Adresse oder eine Bankkontonummer handelt, sollte es wahrscheinlich immer hinter einem 404 versteckt sein. Im Falle einer E-Mail-Adresse könnte dies verhindern, dass Spam-Bots eine Liste gültiger E-Mail-Adressen erstellen, die auf Ihrer Website registriert sind.id
es sich um einen öffentlichen Benutzernamen handelt, gibt es andere Möglichkeiten, auf diese Informationen zuzugreifen (z. B. indem Sie einfach auf der Forenseite Ihrer Website surfen).id
es sich um eine undurchsichtige, aber vorhersehbare Kennung handelt (z. B. eine automatisch inkrementierende Ganzzahl), geben Sie dem Angreifer keine Informationen weiter, die er auf andere Weise nicht erhalten konnte. Meiner Meinung nach ist es also sicher, einen 403-Statuscode zurückzugeben.id
es sich um eine undurchsichtige, unvorhersehbare Kennung handelt (wie eine zufällige GUID), ist die Frage subtiler. Ich persönlich denke, es ist kein Problem, einen 403-Statuscode zurückzugeben. Diese Informationen könnten nur ausgenutzt werden, wenn ein anderer fehlerhafter Endpunkt in Ihrer API diese ID verwendet, der eigentliche Fehler jedoch Ihr anderer Endpunkt ist.Sie können davon ausgehen, dass es in jedem Fall besser ist, auf Nummer sicher zu gehen und die Informationen unabhängig vom Kontext zu verbergen. Sie können sich jedoch nicht auf diese Art von Verhalten verlassen, um irgendeine Form von Sicherheit zu gewährleisten . Auf der anderen Seite kann es Vertraulichkeit bieten (oder Privatsphäre, wie andere gesagt haben).
Ein Sicherheitsmechanismus sollte für den Angreifer nicht nur ein Geschwindigkeitsschub sein, sonst ist er schlichtweg nutzlos. In diesem Fall können Sie möglicherweise sogar andere Funktionen nicht richtig verwenden (Crawler, Webanwendungsfirewall, die nach ungewöhnlichen Mengen von 403 Statuscodes suchen, um Benutzer zu blockieren ...).
quelle