Para una página web que existe, pero para la cual un usuario no tiene suficientes privilegios (no ha iniciado sesión o no pertenece al grupo de usuarios adecuado), ¿cuál es la respuesta HTTP adecuada para servir?
401 Unauthorized
?
403 Forbidden
?
¿Algo más?
Lo que he leído sobre cada uno hasta ahora no está muy claro sobre la diferencia entre los dos. ¿Qué casos de uso son apropiados para cada respuesta?
Respuestas:
Una explicación clara de Daniel Irvine :
Otro buen formato gráfico de cómo se deben usar los códigos de estado http.
fuente
Ver RFC2616 :
401 no autorizado:
403 Prohibido:
Actualizar
Según su caso de uso, parece que el usuario no está autenticado. Volvería 401.
Editar: RFC2616 está obsoleto, vea RFC7231 y RFC7235 .
fuente
Algo que faltan las otras respuestas es que debe entenderse que la autenticación y autorización en el contexto de RFC 2616 se refiere SOLAMENTE al protocolo de autenticación HTTP de RFC 2617. La autenticación por esquemas fuera de RFC2617 no es compatible con los códigos de estado HTTP y no se considera al decidir si usar 401 o 403.
Breve y breve
No autorizado indica que el cliente no está autenticado con RFC2617 y que el servidor está iniciando el proceso de autenticación. Prohibido indica que el cliente está autenticado con RFC2617 y no tiene autorización o que el servidor no admite RFC2617 para el recurso solicitado.
Es decir, si tiene su propio proceso de inicio de sesión de roll-your-own y nunca usa la autenticación HTTP, 403 es siempre la respuesta adecuada y 401 nunca debe usarse.
Detallado y en profundidad
De RFC2616
y
Lo primero que debe tener en cuenta es que "Autenticación" y "Autorización" en el contexto de este documento se refieren específicamente a los protocolos de autenticación HTTP de RFC 2617. No se refieren a ningún protocolo de autenticación de rodar su propia cuenta que haya creado usando páginas de inicio de sesión, etc. Usaré "inicio de sesión" para referirme a la autenticación y autorización por otros métodos que no sean RFC2617
Entonces, la verdadera diferencia no es cuál es el problema o incluso si hay una solución. La diferencia es lo que el servidor espera que el cliente haga a continuación.
401 indica que no se puede proporcionar el recurso, pero el servidor SOLICITA que el cliente inicie sesión a través de la autenticación HTTP y ha enviado encabezados de respuesta para iniciar el proceso. Posiblemente hay autorizaciones que permitirán el acceso al recurso, posiblemente no las hay, pero probémoslo y veamos qué sucede.
403 indica que el recurso no se puede proporcionar y que, para el usuario actual, no hay forma de resolverlo a través de RFC2617 y no tiene sentido intentarlo. Esto puede deberse a que se sabe que ningún nivel de autenticación es suficiente (por ejemplo, debido a una lista negra de IP), pero puede deberse a que el usuario ya está autenticado y no tiene autoridad. El modelo RFC2617 es de un usuario, una credencial, por lo que se puede ignorar el caso en el que el usuario puede tener un segundo conjunto de credenciales que podrían autorizarse. No sugiere ni implica que algún tipo de página de inicio de sesión u otro protocolo de autenticación que no sea RFC2617 puede o no ayudar, eso está fuera de los estándares y la definición de RFC2616.
Editar: RFC2616 está obsoleto, vea RFC7231 y RFC7235 .
fuente
WWW-Authenticate
encabezado? Incluso si un navegador no lo admite, mi aplicación React puede ...Los controles generalmente se realizan en este orden:
NO AUTORIZADO : Código de estado (401) que indica que la solicitud requiere autenticación , generalmente esto significa que el usuario debe iniciar sesión (sesión). Usuario / agente desconocido por el servidor. Se puede repetir con otras credenciales. NOTA: Esto es confuso ya que debería haberse llamado 'no autenticado' en lugar de 'no autorizado'. Esto también puede suceder después de iniciar sesión si la sesión expiró. Caso especial: se puede usar en lugar de 404 para evitar revelar presencia o no presencia de recursos (créditos @gingerCodeNinja)
PROHIBIDO : Código de estado (403) que indica que el servidor entendió la solicitud pero se negó a cumplirla. Usuario / agente conocido por el servidor pero no tiene suficientes credenciales . La solicitud repetida no funcionará, a menos que se cambien las credenciales, lo cual es muy poco probable en un corto período de tiempo. Caso especial: se puede usar en lugar de 404 para evitar revelar la presencia o no de recursos (créditos @gingerCodeNinja)
NO ENCONTRADO : Código de estado (404) que indica que el recurso solicitado no está disponible. Usuario / agente conocido pero el servidor no revelará nada sobre el recurso, hace como si no existiera. Repetir no funcionará. Este es un uso especial de 404 (github lo hace, por ejemplo).
Como mencionó @ChrisH, hay algunas opciones para la redirección 3xx (301, 302, 303, 307 o no redirigir en absoluto y usar un 401):
fuente
no reveal
caso a veces se puede detectar a través de sutiles diferencias de tiempo y no se debe ver como una característica de seguridad, solo puede ralentizar a los atacantes o ayudar un poco con la privacidad.De acuerdo con RFC 2616 (HTTP / 1.1) 403 se envía cuando:
En otras palabras, si el cliente PUEDE obtener acceso al recurso mediante la autenticación, se debe enviar 401.
fuente
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).
Suponiendo que la autenticación HTTP ( WWW-Autenticación y encabezados de autorización ) esté en uso , si la autenticación como otro usuario otorgaría acceso al recurso solicitado, se devolverá 401 No autorizado.
403 Prohibido se usa cuando el acceso al recurso está prohibido para todos o restringido a una red determinada o permitido solo a través de SSL, siempre que no esté relacionado con la autenticación HTTP.
Si la autenticación HTTP no está en uso y el servicio es un esquema de autenticación basado en cookies como es la norma hoy en día, entonces se debe devolver un 403 o un 404.
Con respecto a 401, esto es de RFC 7235 (Protocolo de transferencia de hipertexto (HTTP / 1.1): Autenticación):
La semántica de 403 (y 404) ha cambiado con el tiempo. Esto es de 1999 (RFC 2616):
En 2014, RFC 7231 (Protocolo de transferencia de hipertexto (HTTP / 1.1): semántica y contenido) cambió el significado de 403:
Por lo tanto, un 403 (o un 404) ahora podría significar cualquier cosa. Proporcionar nuevas credenciales puede ayudar ... o puede que no.
Creo que la razón por la cual esto ha cambiado es que RFC 2616 asumió que la autenticación HTTP se usaría cuando, en la práctica, las aplicaciones web actuales crean esquemas de autenticación personalizados utilizando, por ejemplo, formularios y cookies.
fuente
Esta es una pregunta anterior, pero una opción que nunca se mencionó fue devolver un 404. Desde una perspectiva de seguridad, la respuesta más votada sufre una posible vulnerabilidad de fuga de información . Digamos, por ejemplo, que la página web segura en cuestión es una página de administración del sistema, o quizás más comúnmente, es un registro en un sistema al que el usuario no tiene acceso. Idealmente, no querrá que un usuario malintencionado sepa que hay una página / registro allí, y mucho menos que no tiene acceso. Cuando estoy creando algo como esto, intentaré registrar solicitudes no autenticadas / no autorizadas en un registro interno, pero devolveré un 404.
OWASP tiene más información sobre cómo un atacante podría usar este tipo de información como parte de un ataque.
fuente
fuente
Esta pregunta se hizo hace algún tiempo, pero el pensamiento de la gente sigue adelante.
La Sección 6.5.3 en este borrador (escrito por Fielding y Reschke) le da al código de estado 403 un significado ligeramente diferente al que se documenta en RFC 2616 .
Refleja lo que sucede en los esquemas de autenticación y autorización empleados por varios servidores y marcos web populares.
He enfatizado la parte que creo que es más sobresaliente.
Cualquiera que sea la convención que use, lo importante es proporcionar uniformidad en su sitio / API.
fuente
TL; DR
Ejemplos prácticos
Si apache requiere autenticación (vía
.htaccess
) y presionasCancel
, responderá con un401 Authorization Required
Si nginx encuentra un archivo, pero no tiene derechos de acceso (usuario / grupo) para leerlo / accederlo, responderá con
403 Forbidden
RFC (2616 Sección 10)
401 No autorizado (10.4.2)
Significado 1: Necesito autenticar
Significado 2: Autenticación insuficiente
403 Prohibido (10.4.4)
Significado: no relacionado con la autenticación
Más detalles:
(Si el servidor quiere mantener esta información del cliente)
fuente
Has declarado dos casos diferentes; cada caso debe tener una respuesta diferente:
Nota sobre el RFC basada en los comentarios recibidos a esta respuesta:
Si el usuario no ha iniciado sesión, no está autenticado, cuyo equivalente HTTP es 401 y se denomina engañosamente No autorizado en el RFC. Como se indica en la sección 10.4.2 para 401 no autorizado :
Si no está autenticado, 401 es la respuesta correcta. Sin embargo, si no está autorizado, en el sentido semánticamente correcto, 403 es la respuesta correcta.
fuente
Estos son los significados:
401 : Usuario no autenticado (correctamente), el recurso / página requiere autenticación
403 : Usuario autenticado, pero su rol o permisos no permiten acceder al recurso solicitado, por ejemplo, el usuario no es administrador y la página solicitada es para administradores
fuente
Esto es más simple en mi cabeza que en cualquier otro lugar aquí, así que:
401: Necesita autenticación básica HTTP para ver esto.
403: No puede ver esto, y la autenticación básica HTTP no ayudará.
Si el usuario solo necesita iniciar sesión con el formulario de inicio de sesión HTML estándar de su sitio, 401 no sería apropiado porque es específico de la autenticación básica HTTP.
No recomiendo usar 403 para negar el acceso a cosas como
/includes
, porque en lo que respecta a la web, esos recursos no existen en absoluto y, por lo tanto, deberían 404.Esto deja 403 como "necesita iniciar sesión".
En otras palabras, 403 significa "este recurso requiere alguna forma de autenticación distinta de la autenticación básica HTTP".
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2
fuente
Creo que es importante tener en cuenta que, para un navegador, 401 inicia un diálogo de autenticación para que el usuario ingrese nuevas credenciales, mientras que 403 no lo hace. Los navegadores piensan que, si se devuelve un 401, el usuario debe volver a autenticarse. Entonces 401 significa autenticación no válida, mientras que 403 significa falta de permiso.
Aquí hay algunos casos bajo esa lógica donde se devolvería un error de autenticación o autorización, con frases importantes en negrita.
401 : el cliente debe especificar las credenciales.
400 : Eso no es 401 ni 403, ya que los errores de sintaxis siempre deben devolver 400.
401 : el cliente debe especificar credenciales válidas.
401 : Nuevamente, el cliente debe especificar credenciales válidas.
401 : Esto es prácticamente lo mismo que tener credenciales no válidas en general, por lo que el cliente debe especificar credenciales válidas.
403 : Especificar credenciales válidas no otorgaría acceso al recurso, ya que las credenciales actuales ya son válidas pero solo no tienen permiso.
403 : Esto es independientemente de las credenciales, por lo que especificar credenciales válidas no puede ayudar.
403 : Si el cliente está bloqueado, especificar nuevas credenciales no hará nada.
fuente
En inglés:
401
403
fuente
Dado los últimos RFC sobre el tema ( 7231 y 7235 ), el caso de uso parece bastante claro (cursiva agregada):
fuente
authenticated
es y quéauthorized
es y omití todos los RFC obsoletos para que la aplicación sea clara.En el caso de 401 vs 403, esto ha sido respondido muchas veces. Esto es esencialmente un debate de 'entorno de solicitud HTTP', no un debate de 'aplicación'.
Parece que hay una pregunta sobre el problema de roll-your-own-login (aplicación).
En este caso, simplemente no iniciar sesión no es suficiente para enviar un 401 o un 403, a menos que use HTTP Auth frente a una página de inicio de sesión (no vinculada a la configuración de HTTP Auth). Parece que puede estar buscando un "201 Creado", con una pantalla de inicio de sesión automático (en lugar del recurso solicitado) para el acceso de nivel de aplicación a un archivo. Esto dice:
"Te escuché, está aquí, pero intenta esto en su lugar (no puedes verlo)"
fuente