W przypadku strony internetowej, która istnieje, ale dla której użytkownik nie ma wystarczających uprawnień (nie jest zalogowany lub nie należy do odpowiedniej grupy użytkowników), jaka jest poprawna odpowiedź HTTP do wyświetlenia?
401 Unauthorized
?
403 Forbidden
?
Coś innego?
To, co do tej pory przeczytałem, nie jest bardzo jasne na temat różnicy między nimi. Jakie przypadki użycia są odpowiednie dla każdej odpowiedzi?
http-headers
http-status-code-403
http-status-codes
http-status-code-401
http-response-codes
VirtuosiMedia
źródło
źródło
Odpowiedzi:
Jasne wyjaśnienie Daniela Irvine :
Kolejny ładny obrazowy sposób, w jaki należy stosować kody stanu HTTP.
źródło
Zobacz RFC2616 :
401 Nieautoryzowane:
403 Zabronione:
Aktualizacja
Z twojego przypadku użycia wydaje się, że użytkownik nie jest uwierzytelniony. Zwróciłbym 401.
Edycja: RFC2616 jest przestarzały, patrz RFC7231 i RFC7235 .
źródło
Brakuje innych odpowiedzi, że należy rozumieć, że Uwierzytelnianie i autoryzacja w kontekście RFC 2616 odnosi się TYLKO do protokołu uwierzytelniania HTTP RFC 2617. Uwierzytelnianie przez schematy poza RFC2617 nie jest obsługiwane w kodach stanu HTTP i nie jest brane pod uwagę przy podejmowaniu decyzji, czy użyć 401, czy 403.
Krótkie i zwięzłe
Brak autoryzacji wskazuje, że klient nie jest uwierzytelniony RFC2617, a serwer inicjuje proces uwierzytelnienia. Zabronione oznacza, że klient jest uwierzytelniony RFC2617 i nie ma autoryzacji lub serwer nie obsługuje RFC2617 dla żądanego zasobu.
Oznacza to, że jeśli masz swój własny proces logowania i nigdy nie używasz uwierzytelniania HTTP, 403 jest zawsze właściwą odpowiedzią i 401 nigdy nie powinno być używane.
Szczegółowy i szczegółowy
Z RFC2616
i
Pierwszą rzeczą, o której należy pamiętać, jest to, że „Uwierzytelnianie” i „Uwierzytelnianie” w kontekście tego dokumentu odnoszą się konkretnie do protokołów uwierzytelniania HTTP z RFC 2617. Nie odnoszą się one do żadnych opracowanych przez siebie protokołów uwierzytelniania używając stron logowania itp. Będę używał słowa „login” w odniesieniu do uwierzytelniania i autoryzacji metodami innymi niż RFC2617
Tak więc prawdziwą różnicą nie jest to, na czym polega problem, a nawet czy istnieje rozwiązanie. Różnica polega na tym, co serwer oczekuje od klienta w następnej kolejności.
401 wskazuje, że nie można podać zasobu, ale serwer ZAPYTA, aby klient logował się za pośrednictwem uwierzytelniania HTTP i wysłał nagłówki odpowiedzi w celu zainicjowania procesu. Możliwe, że istnieją autoryzacje, które umożliwią dostęp do zasobu, być może nie, ale spróbujmy i zobaczmy, co się stanie.
403 wskazuje, że nie można zapewnić zasobu i dla obecnego użytkownika nie ma sposobu na rozwiązanie tego za pomocą RFC2617 i nie ma sensu próbować. Może to wynikać z faktu, że wiadomo, że żaden poziom uwierzytelnienia nie jest wystarczający (na przykład z powodu czarnej listy IP), ale może być tak, ponieważ użytkownik jest już uwierzytelniony i nie ma uprawnień. Model RFC2617 to jeden użytkownik, jedno poświadczenie, więc przypadek, w którym użytkownik może mieć drugi zestaw poświadczeń, które mogą być autoryzowane, może zostać zignorowany. Nie sugeruje ani nie sugeruje, że jakaś strona logowania lub inny protokół uwierzytelniania inny niż RFC2617 może, ale nie musi pomóc - to jest poza standardami i definicją RFC2616.
Edycja: RFC2616 jest przestarzały, patrz RFC7231 i RFC7235 .
źródło
WWW-Authenticate
nagłówka? Nawet jeśli przeglądarka go nie obsługuje, moja aplikacja React może ...Kontrole zwykle wykonuje się w następującej kolejności:
NIEAUTORYZOWANY : Kod statusu (401) wskazujący, że żądanie wymaga uwierzytelnienia , zwykle oznacza to, że użytkownik musi być zalogowany (sesja). Użytkownik / agent nieznany przez serwer. Można powtórzyć z innymi poświadczeniami. UWAGA: Jest to mylące, ponieważ powinno to być nazwane „nieuwierzytelnione” zamiast „nieautoryzowane”. Może się to również zdarzyć po zalogowaniu, jeśli sesja wygasła. Przypadek specjalny: można użyć zamiast 404, aby uniknąć ujawnienia obecności lub braku obecności zasobów (kredyty @gingerCodeNinja)
ZABRONIONE : Kod statusu (403) wskazujący, że serwer zrozumiał żądanie, ale odmówił jego spełnienia. Użytkownik / agent znany przez serwer, ale ma niewystarczające poświadczenia . Powtarzanie żądania nie zadziała, chyba że zmieni się dane uwierzytelniające, co jest bardzo mało prawdopodobne w krótkim okresie czasu. Przypadek specjalny: można użyć zamiast 404, aby uniknąć ujawnienia obecności lub braku obecności zasobów (kredyty @gingerCodeNinja)
NOT FOUND : Kod statusu (404) wskazujący, że żądany zasób nie jest dostępny. Użytkownik / agent znany, ale serwer nie ujawni niczego na temat zasobu, działa tak, jakby nie istniał. Powtarzanie nie zadziała. Jest to specjalne zastosowanie 404 (na przykład robi to github).
Jak wspomniano w @ChrisH, istnieje kilka opcji przekierowania 3xx (301, 302, 303, 307 lub brak przekierowania i użycie 401):
źródło
no reveal
sprawa może być czasami wykryta przez subtelne różnice czasowe i nie powinna być postrzegana jako funkcja bezpieczeństwa, może po prostu spowolnić atakujących lub nieco pomóc w prywatności.Zgodnie z RFC 2616 (HTTP / 1.1) 403 jest wysyłany, gdy:
Innymi słowy, jeśli klient MOŻE uzyskać dostęp do zasobu poprzez uwierzytelnienie, należy wysłać 401.
źródło
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).
Zakładając uwierzytelnianie HTTP ( WWW-uwierzytelnienia i autoryzacji nagłówków) jest w użyciu , jeśli uwierzytelnianie jako inny użytkownik będzie udzieli dostępu do żądanego zasobu, a następnie 401 Nieuprawnione powinny być zwrócone.
403 Zabronione jest stosowane, gdy dostęp do zasobu jest zabroniony dla wszystkich lub ograniczony do danej sieci lub dozwolony tylko przez SSL, o ile nie ma to związku z uwierzytelnianiem HTTP.
Jeśli uwierzytelnianie HTTP nie jest używane, a usługa jest schematem uwierzytelniania opartym na plikach cookie, co jest obecnie normą, wówczas należy zwrócić kod 403 lub 404.
Odnośnie 401, pochodzi z RFC 7235 (Hypertext Transfer Protocol (HTTP / 1.1): Uwierzytelnianie):
Semantyka 403 (i 404) zmieniła się z czasem. Pochodzi z 1999 r. (RFC 2616):
W 2014 RFC 7231 (Hypertext Transfer Protocol (HTTP / 1.1): Semantics and Content) zmienił znaczenie 403:
Zatem 403 (lub 404) może teraz znaczyć cokolwiek. Podanie nowych danych uwierzytelniających może pomóc ... lub nie.
Uważam, że powodem tego jest RFC 2616, zakładając, że uwierzytelnianie HTTP będzie używane, gdy w praktyce dzisiejsze aplikacje internetowe będą budować niestandardowe schematy uwierzytelniania przy użyciu na przykład formularzy i plików cookie.
źródło
To jest starsze pytanie, ale jedną z opcji, która tak naprawdę nigdy nie została podniesiona, było zwrócenie 404. Z punktu widzenia bezpieczeństwa, najwyżej głosowana odpowiedź cierpi na potencjalną lukę wycieku informacji . Powiedzmy na przykład, że bezpieczna strona internetowa, o której mowa, jest stroną administracyjną systemu, a może częściej jest zapisem w systemie, do którego użytkownik nie ma dostępu. Idealnie byłoby, gdyby złośliwy użytkownik nawet nie wiedział, że jest tam strona / rekord, nie mówiąc już o tym, że nie ma on dostępu. Kiedy buduję coś takiego, spróbuję zapisać nieautoryzowane / nieautoryzowane żądania w wewnętrznym dzienniku, ale zwrócę 404.
OWASP ma więcej informacji na temat tego, w jaki sposób osoba atakująca może wykorzystać ten typ informacji jako część ataku.
źródło
źródło
To pytanie zostało zadane jakiś czas temu, ale myślenie ludzi idzie dalej.
Sekcja 6.5.3 w tym projekcie (autor: Fielding i Reschke) nadaje kodowi statusu 403 nieco inne znaczenie niż ten udokumentowany w RFC 2616 .
Odzwierciedla to, co dzieje się w schematach uwierzytelniania i autoryzacji stosowanych przez wiele popularnych serwerów i platform.
Podkreśliłem to, co uważam za najbardziej istotne.
Niezależnie od stosowanej konwencji ważne jest zapewnienie jednolitości w całej witrynie / interfejsie API.
źródło
TL; DR
Praktyczne przykłady
Jeśli apache wymaga uwierzytelnienia (przez
.htaccess
), a ty uderzyszCancel
, odpowie na nie401 Authorization Required
Jeśli nginx znajdzie plik, ale nie ma praw dostępu (użytkownik / grupa) do odczytu / dostępu, odpowie za pomocą
403 Forbidden
RFC (2616 sekcja 10)
401 Nieautoryzowane (10.4.2)
Znaczenie 1: Konieczność uwierzytelnienia
Znaczenie 2: Uwierzytelnianie jest niewystarczające
403 Zabronione (10.4.4)
Znaczenie: niezwiązane z uwierzytelnianiem
Więcej szczegółów:
(Jeśli serwer chce ukryć te informacje przed klientem)
źródło
Podałeś dwa różne przypadki; każda sprawa powinna mieć inną odpowiedź:
Uwaga na temat RFC na podstawie komentarzy otrzymanych do tej odpowiedzi:
Jeśli użytkownik nie jest zalogowany, jest nieautoryzowany, którego odpowiednikiem HTTP jest 401 i jest wprowadzany w błąd jako Nieautoryzowany w RFC. Jak podano w sekcji 10.4.2 dla 401 Nieautoryzowanych :
Jeśli nie masz uwierzytelnienia, poprawna odpowiedź to 401. Jednak jeśli jesteś nieautoryzowany, w sensie semantycznym, 403 jest prawidłową odpowiedzią.
źródło
Oto znaczenia:
401 : Użytkownik nie został (poprawnie) uwierzytelniony, zasób / strona wymagają uwierzytelnienia
403 : Użytkownik uwierzytelniony, ale jego rola lub uprawnienia nie pozwalają na dostęp do żądanego zasobu, na przykład użytkownik nie jest administratorem, a żądana strona jest dla administratorów
źródło
W mojej głowie jest to prostsze niż gdziekolwiek, więc:
401: Aby to zobaczyć, potrzebujesz podstawowego uwierzytelniania HTTP.
403: Nie widać tego, a podstawowe uwierzytelnianie HTTP nie pomoże.
Jeśli użytkownik musi się tylko zalogować przy użyciu standardowego formularza logowania HTML witryny, 401 nie byłoby odpowiednie, ponieważ jest ono specyficzne dla podstawowego uwierzytelniania HTTP.
Nie polecam używania 403 do odmawiania dostępu do takich rzeczy
/includes
, ponieważ jeśli chodzi o sieć, te zasoby w ogóle nie istnieją i dlatego powinny 404.Pozostawia to 403 jako „musisz się zalogować”.
Innymi słowy, 403 oznacza „ten zasób wymaga innej formy uwierzytelnienia niż uwierzytelnianie podstawowe HTTP”.
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2
źródło
Myślę, że ważne jest, aby wziąć pod uwagę, że w przeglądarce 401 inicjuje okno dialogowe uwierzytelniania dla użytkownika w celu wprowadzenia nowych danych uwierzytelniających, podczas gdy 403 nie. Przeglądarki uważają, że w przypadku zwrotu 401 użytkownik powinien ponownie uwierzytelnić. Zatem 401 oznacza nieprawidłowe uwierzytelnienie, a 403 oznacza brak pozwolenia.
Oto kilka przypadków w ramach tej logiki, w których błąd zostałby zwrócony z uwierzytelnienia lub autoryzacji, z ważnymi pogrubionymi zdaniami.
401 : Klient powinien określić poświadczenia.
400 : To nie jest ani 401, ani 403, ponieważ błędy składniowe powinny zawsze zwracać 400.
401 : Klient powinien podać prawidłowe poświadczenia.
401 : Ponownie klient powinien podać prawidłowe poświadczenia.
401 : Jest to praktycznie to samo, co niepoprawne poświadczenia, więc klient powinien podać prawidłowe poświadczenia.
403 : Określenie prawidłowych poświadczeń nie zapewni dostępu do zasobu, ponieważ bieżące poświadczenia są już prawidłowe, ale tylko nie mają uprawnień.
403 : Jest to niezależne od poświadczeń, więc określenie prawidłowych poświadczeń nie może pomóc.
403 : Jeśli klient jest zablokowany, podanie nowych poświadczeń nic nie da.
źródło
Po angielsku:
401
403
źródło
Biorąc pod uwagę najnowsze RFC w tej sprawie ( 7231 i 7235 ), przypadek użycia wydaje się dość jasny (dodano kursywą):
źródło
authenticated
jest i coauthorized
jest, i zostawiłem wszystkie nieaktualne RFC, aby aplikacja była przejrzysta.W przypadku 401 vs 403 odpowiedziano na to wiele razy. Zasadniczo jest to debata „środowisko żądań HTTP”, a nie debata „aplikacyjna”.
Wygląda na to, że pojawia się pytanie dotyczące problemu z rolowaniem własnego logowania (aplikacji).
W takim przypadku zwykłe niezalogowanie się nie wystarczy, aby wysłać numer 401 lub 403, chyba że użyjesz uwierzytelniania HTTP zamiast strony logowania (niezwiązanej z ustawieniem uwierzytelniania HTTP). Wygląda na to, że szukasz „Utworzonego 201” z obecnym ekranem do samodzielnego logowania (zamiast żądanego zasobu) do dostępu do pliku na poziomie aplikacji. To mówi:
„Słyszałem cię, jest tutaj, ale spróbuj tego zamiast tego (nie możesz tego zobaczyć)”
źródło