Для веб-страницы, которая существует, но для которой пользователь не имеет достаточных привилегий (они не вошли в систему или не принадлежат к соответствующей группе пользователей), какой надлежащий HTTP-ответ должен обслуживать?
401 Unauthorized
?
403 Forbidden
?
Что-то другое?
То, что я прочитал о каждом из них, пока не очень ясно о разнице между ними. Какие варианты использования подходят для каждого ответа?
Ответы:
Четкое объяснение от Даниэля Ирвина :
Еще один приятный графический формат того, как следует использовать коды состояния http.
источник
См. RFC2616 :
401 Несанкционированный:
403 Запрещено:
Обновить
Из вашего варианта использования видно, что пользователь не аутентифицирован. Я бы вернул 401.
Изменить: RFC2616 устарел, см. RFC7231 и RFC7235 .
источник
Чего не хватает другим ответам, так это того, что следует понимать, что Аутентификация и Авторизация в контексте RFC 2616 относятся ТОЛЬКО к протоколу HTTP-аутентификации RFC 2617. Аутентификация по схемам вне RFC2617 не поддерживается в кодах состояния HTTP и не рассматривается при принятии решения использовать 401 или 403.
Краткое и краткое
Unauthorized указывает, что клиент не прошел проверку подлинности RFC2617, и сервер инициирует процесс проверки подлинности. Запрещено указывает, что клиент аутентифицирован по RFC2617 и не имеет авторизации, или что сервер не поддерживает RFC2617 для запрошенного ресурса.
Это означает, что если у вас есть свой собственный процесс входа в систему «по-отдельности» и вы никогда не используете HTTP-аутентификацию, 403 всегда является правильным ответом, а 401 никогда не должен использоваться.
Подробный и углубленный
От RFC2616
а также
Первое, что нужно иметь в виду, это то, что «Аутентификация» и «Авторизация» в контексте этого документа относятся конкретно к протоколам HTTP-аутентификации из RFC 2617. Они не относятся к любым протоколам аутентификации, которые вы, возможно, создали сами. использование страниц входа и т. д. Я буду использовать «логин» для ссылки на аутентификацию и авторизацию, отличные от RFC2617
Таким образом, реальная разница не в том, в чем проблема, или даже в том, если есть решение. Разница в том, что сервер ожидает, что клиент будет делать дальше.
401 указывает, что ресурс не может быть предоставлен, но сервер ЗАПРОСИЛ, чтобы клиент вошел через HTTP-аутентификацию и послал заголовки ответа, чтобы инициировать процесс. Возможно, есть авторизации, которые разрешат доступ к ресурсу, возможно, нет, но давайте попробуем и посмотрим, что произойдет.
403 указывает, что ресурс не может быть предоставлен, и для текущего пользователя нет никакого способа решить это через RFC2617 и нет смысла пытаться. Это может быть связано с тем, что известно, что никакого уровня аутентификации недостаточно (например, из-за черного списка IP-адресов), но это может быть связано с тем, что пользователь уже аутентифицирован и не имеет полномочий. Модель RFC2617 является однопользовательской, однопользовательской, поэтому случай, когда у пользователя может быть второй набор учетных данных, которые могут быть авторизованы, может быть проигнорирован. Это не предполагает и не подразумевает, что какая-либо страница входа в систему или другой протокол аутентификации, отличный от RFC2617, может или не может помочь - что находится за пределами стандартов и определений RFC2616.
Изменить: RFC2616 устарел, см. RFC7231 и RFC7235 .
источник
WWW-Authenticate
заголовка? Даже если браузер не поддерживает его, мое приложение React может ...Проверки обычно проводятся в следующем порядке:
НЕСАНКЦИОНИРОВАННО : Код состояния (401), указывающий, что запрос требует аутентификации , обычно это означает, что пользователь должен войти в систему (сеанс). Пользователь / агент неизвестен серверу. Можно повторить с другими учетными данными. ПРИМЕЧАНИЕ: это сбивает с толку, поскольку это должно было быть названо «неаутентифицированным» вместо «неавторизованным». Это также может произойти после входа в систему, если сеанс истек. Особый случай: Может использоваться вместо 404, чтобы избежать выявления наличия или отсутствия ресурса (credits @gingerCodeNinja)
ЗАПРЕЩЕНО : код состояния (403), указывающий, что сервер понял запрос, но отказался его выполнить. Пользователь / агент, известный серверу, но с недостаточными учетными данными . Повторный запрос не будет работать, если учетные данные не изменены, что очень маловероятно за короткий промежуток времени. Особый случай: Может использоваться вместо 404, чтобы избежать выявления наличия или отсутствия ресурса (credits @gingerCodeNinja)
НЕ НАЙДЕН : Код состояния (404), указывающий, что запрошенный ресурс недоступен. Пользователь / агент известен, но сервер ничего не раскрывает о ресурсе, если он не существует. Повтор не сработает. Это специальное использование 404 (например, github).
Как упомянуто @ChrisH, есть несколько вариантов перенаправления 3xx (301, 302, 303, 307 или не перенаправления вообще и использования 401):
источник
no reveal
случай иногда может быть обнаружен с помощью незначительных временных различий и не должен рассматриваться как функция безопасности, он может просто замедлить действия злоумышленников или немного помочь с конфиденциальностью.Согласно RFC 2616 (HTTP / 1.1) 403 отправляется, когда:
Другими словами, если клиент МОЖЕТ получить доступ к ресурсу путем аутентификации, следует отправить 401.
источник
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).
Предполагая , что HTTP аутентификация ( WWW-Authenticate и Authorization заголовков) используется , если аутентификация как другой пользователь будет предоставлять доступ к запрашиваемому ресурсу, а затем 401 Несанкционированные должны быть возвращены.
403 Запрещено используется, когда доступ к ресурсу запрещен для всех или ограничен определенной сетью или разрешен только по SSL, независимо от того, что это не связано с аутентификацией HTTP.
Если HTTP-аутентификация не используется и обслуживает схему аутентификации на основе файлов cookie, что является нормой в настоящее время, то следует вернуть 403 или 404.
Что касается 401, это из RFC 7235 (протокол передачи гипертекста (HTTP / 1.1): аутентификация):
Семантика 403 (и 404) со временем изменилась. Это с 1999 года (RFC 2616):
В 2014 RFC 7231 (протокол передачи гипертекста (HTTP / 1.1): семантика и контент) изменил значение 403:
Таким образом, 403 (или 404) теперь может означать что угодно. Предоставление новых учетных данных может помочь ... или не поможет.
Я полагаю, что причина, по которой это изменилось, заключается в том, что RFC 2616 предполагал, что аутентификация HTTP будет использоваться, когда на практике современные веб-приложения создают собственные схемы аутентификации с использованием, например, форм и файлов cookie.
источник
Это более старый вопрос, но один вариант, который так и не был поставлен, состоял в том, чтобы вернуть 404. С точки зрения безопасности, голос с наибольшим количеством голосов страдает от потенциальной уязвимости утечки информации . Скажем, например, что рассматриваемая защищенная веб-страница является страницей системного администратора или, что более часто, является записью в системе, к которой у пользователя нет доступа. В идеале вы бы не хотели, чтобы злоумышленник даже знал, что там есть страница / запись, не говоря уже о том, что у него нет доступа. Когда я создаю что-то подобное, я пытаюсь записать неавторизованные / неавторизованные запросы во внутренний журнал, но возвращаю 404.
OWASP содержит дополнительную информацию о том, как злоумышленник может использовать этот тип информации как часть атаки.
источник
источник
Этот вопрос был задан некоторое время назад, но мышление людей движется дальше.
Раздел 6.5.3 в этом проекте (автор Fielding и Reschke) дает код состояния 403, немного отличающийся от того, который задокументирован в RFC 2616 .
Он отражает то, что происходит в схемах аутентификации и авторизации, используемых рядом популярных веб-серверов и сред.
Я подчеркнул бит, который я считаю наиболее заметным.
Какое бы соглашение вы не использовали, важно обеспечить единообразие для вашего сайта / API.
источник
TL; DR
Практические примеры
Если Apache требует аутентификации (через
.htaccess
), и вы нажметеCancel
, он ответит401 Authorization Required
Если nginx находит файл, но не имеет прав доступа (пользователь / группа) для чтения / доступа к нему, он ответит
403 Forbidden
RFC (2616 Раздел 10)
401 Несанкционированный (10.4.2)
Значение 1: необходимо подтвердить подлинность
Значение 2: аутентификация недостаточна
403 Запрещено (10.4.4)
Значение: не связано с аутентификацией
Больше деталей:
(Если сервер хочет сохранить эту информацию от клиента)
источник
Вы изложили два разных случая; у каждого случая должен быть свой ответ:
Примечание к RFC на основе комментариев, полученных к этому ответу:
Если пользователь не вошел в систему, он не прошел проверку подлинности, HTTP-эквивалент которого равен 401, и в RFC вводит в заблуждение, называя его Несанкционированным. Как указано в разделе 10.4.2 для 401 Unauthorized :
Если вы не прошли проверку подлинности, 401 является правильным ответом. Однако, если вы не авторизованы, в семантически правильном смысле 403 - это правильный ответ.
источник
Вот эти значения:
401 : пользователь не (правильно) аутентифицирован, ресурс / страница требуют аутентификации
403. Пользователь прошел проверку подлинности, но его роль или разрешения не позволяют получить доступ к запрашиваемому ресурсу, например, пользователь не является администратором, а запрашиваемая страница предназначена для администраторов.
источник
Это проще в моей голове, чем где-либо здесь, поэтому:
401: вам нужна базовая аутентификация HTTP, чтобы увидеть это.
403: Вы не можете видеть это, и базовая аутентификация HTTP не поможет.
Если пользователю просто необходимо войти в систему, используя стандартную HTML-форму входа в систему на вашем сайте, 401 не подойдет, потому что она специфична для базовой аутентификации HTTP.
Я не рекомендую использовать 403 для запрета доступа к таким вещам
/includes
, потому что, что касается Интернета, эти ресурсы вообще не существуют и поэтому должны 404.Это оставляет 403 как «Вы должны войти в систему».
Другими словами, 403 означает «этот ресурс требует некоторой формы аутентификации, отличной от базовой аутентификации HTTP».
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2
источник
Я думаю, что важно учитывать, что для браузера 401 инициирует диалог аутентификации для пользователя, чтобы ввести новые учетные данные, а 403 - нет. Браузеры считают, что если возвращается 401, то пользователь должен повторно пройти аутентификацию. Таким образом, 401 означает неверную аутентификацию, а 403 - отсутствие разрешения.
Вот некоторые случаи в соответствии с этой логикой, когда ошибка будет возвращена из аутентификации или авторизации, с выделением важных фраз.
401 : клиент должен указать учетные данные.
400 : это ни 401, ни 403, поскольку синтаксические ошибки всегда должны возвращать 400.
401 : клиент должен указать действительные учетные данные.
401 : Опять же, клиент должен указать действительные учетные данные.
401 : Это практически то же самое, что и неверные учетные данные в целом, поэтому клиент должен указать действительные учетные данные.
403. Указание допустимых учетных данных не предоставит доступ к ресурсу, поскольку текущие учетные данные уже действительны, но только не имеют разрешения.
403. Это не зависит от учетных данных, поэтому указание действительных учетных данных не может помочь.
403. Если клиент заблокирован, указание новых учетных данных ничего не изменит.
источник
На английском:
401
403
источник
Учитывая последние RFC по этому вопросу ( 7231 и 7235 ), сценарий использования выглядит вполне ясным (курсив добавлен):
источник
authenticated
есть и чтоauthorized
есть, и остановил все устаревшие RFC, чтобы приложение было понятным.В случае 401 против 403, на это много раз отвечали. По сути, это дебаты «среды HTTP-запросов», а не «приложений».
Похоже, что возникает вопрос о проблеме «подкатить-под-именем-входа» (приложение).
В этом случае просто не войти в систему недостаточно для отправки 401 или 403, если только вы не используете HTTP Auth против страницы входа (не привязанной к настройке HTTP Auth). Похоже, вы ищете «201 Created», с присутствующим на экране скрининга входа (вместо запрошенного ресурса) для доступа к файлу на уровне приложения. Это говорит:
«Я слышал, это здесь, но попробуйте вместо этого (вы не можете видеть это)»
источник