solucion para pagina example estado error codigos codes http-headers http-status-code-403 http-status-codes http-status-code-401 http-response-codes

http-headers - para - http response example



403 respuestas HTTP prohibidas contra 401 no autorizadas (14)

Para una página web que existe, pero para la cual un usuario que no tiene suficientes privilegios (no está conectado o no pertenece al grupo de usuarios adecuado), ¿cuál es la respuesta HTTP adecuada para servir? 401? 403? ¿Algo más? Lo que he leído en cada uno hasta ahora no es muy claro sobre la diferencia entre los dos. ¿Qué casos de uso son apropiados para cada respuesta?


no han iniciado sesión o no pertenecen al grupo de usuarios adecuado

Usted ha declarado dos casos diferentes; Cada caso debe tener una respuesta diferente:

  1. Si no están conectados, debe devolver 401 No Autorizado.
  2. Si han iniciado sesión pero no pertenecen al grupo de usuarios adecuado, deberá devolver 403 Prohibido

TL; DR

  • 401: Un rechazo que tiene que ver con la autenticación.
  • 403: una negativa que NADA tiene que ver con la autenticación

Ejemplos prácticos

Si apache requiere autenticación (a través de .htaccess ), y presiona Cancel , responderá con una 401 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: Necesidad de autenticar

La solicitud requiere autenticación de usuario. ...

Significado 2: Autenticación insuficiente

... Si la solicitud ya incluía credenciales de autorización, entonces la respuesta 401 indica que se ha rechazado la autorización para esas credenciales. ...

403 Prohibido (10.4.4)

Significado: Sin relación con la autenticación

... La autorización no ayudará ...

Más detalles:

  • El servidor entendió la solicitud, pero se niega a cumplirla.

  • DEBE describir el motivo de la negativa en la entidad

  • El código de estado 404 (No encontrado) se puede utilizar en su lugar

    (Si el servidor quiere mantener esta información del cliente)


Algo que faltan en las otras respuestas es que debe entenderse que la autenticación y la autorización en el contexto de RFC 2616 se refieren SOLAMENTE al protocolo de autenticación HTTP de RFC 2617. La autenticación por esquemas fuera de RFC2617 no se admite en los códigos de estado HTTP y no se consideran Al decidir si usar 401 o 403.

Breve y Terso

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 es compatible con RFC2617 para el recurso solicitado.

Lo que significa que si tiene su propio proceso de inicio de sesión de rollo y no utiliza la autenticación HTTP, 403 es siempre la respuesta correcta y nunca se debe usar 401.

Detallado y en profundidad

Desde RFC2616

10.4.2 401 No Autorizado

La solicitud requiere autenticación de usuario. La respuesta DEBE incluir un campo de encabezado WWW-Authenticate (sección 14.47) que contenga un desafío aplicable al recurso solicitado. El cliente PUEDE repetir la solicitud con un campo de encabezado de Autorización adecuado (sección 14.8).

y

10.4.4 403 Prohibido El servidor entendió la solicitud, pero se niega a cumplirla. La autorización no ayudará y la solicitud NO DEBE repetirse.

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 rollo propio que pueda haber creado. uso de páginas de inicio de sesión, etc. Usaré "inicio de sesión" para referirme a la autenticación y autorización por métodos distintos al RFC2617

Entonces la diferencia real 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, pero vamos a intentarlo y ver qué sucede.

403 indica que no se puede proporcionar el recurso 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 solo usuario, de una sola credencial, por lo que el caso donde el usuario puede tener un segundo conjunto de credenciales que podrían autorizarse puede ignorarse. 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.

Edición: RFC2616 está obsoleto, vea RFC7231 y RFC7235 .


Creo que es importante tener en cuenta que, para un navegador, 401 inicia un cuadro de 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 inválida, mientras que 403 significa falta de permiso.

Aquí hay algunos casos bajo esa lógica donde un error sería devuelto por la autenticación o autorización, con frases importantes en negrita.

  • Un recurso requiere autenticación pero no se especificaron credenciales .

401 : El cliente debe especificar las credenciales.

  • Las credenciales especificadas están en un formato no válido .

400 : Eso no es ni 401 ni 403, ya que los errores de sintaxis siempre deben devolver 400.

  • Las credenciales especificadas hacen referencia a un usuario que no existe .

401 : El cliente debe especificar credenciales válidas.

  • Las credenciales especificadas no son válidas, pero especifican un usuario válido (o no especifique un usuario ya que no se requiere un usuario específico).

401 : De nuevo, el cliente debe especificar credenciales válidas.

  • Las credenciales especificadas han caducado .

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.

  • Las credenciales especificadas son completamente válidas pero no son suficientes para un recurso en particular, aunque es posible que las credenciales con más permisos puedan hacerlo.

403 : la especificación de credenciales válidas no otorgaría acceso al recurso, ya que las credenciales actuales ya son válidas pero solo no tienen permiso.

  • El recurso particular es inaccesible independientemente de las credenciales.

403 : esto es independientemente de las credenciales, por lo que la especificación de credenciales válidas no puede ayudar.

  • Las credenciales especificadas son completamente válidas, pero el cliente particular no puede utilizarlas.

403 : Si el cliente está bloqueado, la especificación de nuevas credenciales no hará nada.


Dados los últimos RFC al respecto ( RFC7231 y RFC7235 ), el caso de uso parece bastante claro (se agregaron las cursivas):

  • 401 es para unauthenticated ("carece de autenticación válida"); es decir, ''no sé quién eres, o no confío en que seas quien dices que eres''.

401 no autorizado

El código de estado 401 (no autorizado) indica que la solicitud no se ha aplicado porque carece de credenciales de autenticación válidas para el recurso de destino. El servidor que genera una respuesta 401 DEBE enviar un campo de encabezado WWW-Authenticate (Sección 4.1) que contenga al menos un desafío aplicable al recurso de destino.

Si la solicitud incluía credenciales de autenticación, la respuesta 401 indica que se ha rechazado la autorización para esas credenciales. El agente de usuario PUEDE repetir la solicitud con un campo de encabezado de Autorización nuevo o reemplazado (Sección 4.2). Si la respuesta 401 contiene el mismo desafío que la respuesta anterior, y el agente de usuario ya ha intentado la autenticación al menos una vez, entonces el agente de usuario DEBERÍA presentar la representación adjunta al usuario, ya que generalmente contiene información de diagnóstico relevante.

  • 403 es para personas unauthorized ("se niega a autorizar"); es decir, ''Sé quién eres, pero no tienes permiso para acceder a este recurso''.

403 Prohibido

El código de estado 403 (Prohibido) indica que el servidor entendió la solicitud, pero se niega a autorizarla . Un servidor que desea hacer público el motivo por el cual se ha prohibido la solicitud puede describir ese motivo en la carga útil de respuesta (si existe).

Si se proporcionaron las credenciales de autenticación en la solicitud, el servidor las considera insuficientes para otorgar acceso. El cliente NO DEBE repetir la solicitud automáticamente con las mismas credenciales. El cliente PUEDE repetir la solicitud con credenciales nuevas o diferentes. Sin embargo, una solicitud puede estar prohibida por razones no relacionadas con las credenciales.

Un servidor de origen que desea "ocultar" la existencia actual de un recurso de destino prohibido PUEDE responder con un código de estado de 404 (No encontrado).


En el caso de 401 vs 403, esto ha sido contestado muchas veces. Esto es esencialmente un debate sobre el ''entorno de solicitud HTTP'', no un debate sobre ''aplicaciones''.

Parece que hay una pregunta sobre el problema de inicio de sesión (aplicación).

En este caso, el simple hecho de no estar conectado no es suficiente para enviar un 401 o un 403, a menos que use la autenticación HTTP frente a la página de inicio de sesión (no está vinculado a la configuración de la autenticación HTTP). Parece que puede estar buscando un "201 Created", con una pantalla de inicio de sesión de rollo propio (en lugar del recurso solicitado) para el acceso de nivel de aplicación a un archivo. Esto dice:

"Te escuché, está aquí, pero prueba esto en su lugar (no puedes verlo)"


Esta es una pregunta más antigua, pero una opción que nunca se mencionó realmente fue devolver un 404. Desde una perspectiva de seguridad, la respuesta más votada sufre una vulnerabilidad potencial 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. Lo ideal sería que no quisieras que un usuario malintencionado supiera que hay una página / registro allí, y mucho menos que no tengan acceso. Cuando estoy creando algo como esto, intentaré registrar solicitudes no autorizadas / 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.


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 (creada por Fielding y Reschke) le da al código de estado 403 un significado ligeramente diferente al documentado 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 lo que creo que es lo más destacado.

6.5.3. 403 Prohibido

El código de estado 403 (Prohibido) indica que el servidor entendió la solicitud, pero se niega a autorizarla. Un servidor que desea hacer público el motivo por el cual se ha prohibido la solicitud puede describir ese motivo en la carga útil de respuesta (si existe).

Si se proporcionaron las credenciales de autenticación en la solicitud, el servidor las considera insuficientes para otorgar acceso. El cliente NO DEBE repetir la solicitud con las mismas credenciales. El cliente PUEDE repetir la solicitud con credenciales nuevas o diferentes. Sin embargo, una solicitud puede estar prohibida por razones no relacionadas con las credenciales.

Un servidor de origen que desea "ocultar" la existencia actual de un recurso de destino prohibido PUEDE responder con un código de estado de 404 (No encontrado).

Independientemente de la convención que utilice, lo importante es proporcionar uniformidad en su sitio / API.


Esto es más simple en mi cabeza que en cualquier otro lugar aquí, así que:

401: Necesitas autenticación HTTP básica para ver esto.

403: No puedes ver esto, y la autenticación HTTP básica 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 denegar 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 ser 404.

Esto deja a 403 como "necesitas estar conectado".

En otras palabras, 403 significa "este recurso requiere alguna forma de autenticación diferente a la autenticación básica HTTP".

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2


Según RFC 2616 (HTTP / 1.1) 403 se envía cuando:

El servidor entendió la solicitud, pero se niega a cumplirla. La autorización no ayudará y la solicitud NO DEBE repetirse. Si el método de solicitud no era HEAD y el servidor desea hacer público el motivo por el cual la solicitud no se ha cumplido, DEBE describir el motivo de la denegación en la entidad. Si el servidor no desea que esta información esté disponible para el cliente, se puede usar el código de estado 404 (No encontrado) en su lugar

En otras palabras, si el cliente PUEDE obtener acceso al recurso mediante la autenticación, se debe enviar 401.


Si la autenticación como otro usuario otorgaría acceso al recurso solicitado, se debe devolver 401 No autorizado. 403 Forbidden se usa principalmente cuando el acceso al recurso está prohibido para todos o está restringido a una red determinada o solo se permite a través de SSL, siempre que no esté relacionado con la autenticación.

De RFC 7235 (Protocolo de transferencia de hipertexto (HTTP / 1.1): Autenticación):

3.1. 401 no autorizado

El código de estado 401 (no autorizado) indica que la solicitud no se ha aplicado porque carece de credenciales de autenticación válidas para el recurso de destino. El servidor de origen DEBE enviar un campo de encabezado WWW-Authenticate (Sección 4.4) que contenga al menos un desafío aplicable al recurso objetivo. Si la solicitud incluía credenciales de autenticación, la respuesta 401 indica que se ha rechazado la autorización para esas credenciales . El cliente PUEDE repetir la solicitud con un campo de encabezado de Autorización nuevo o reemplazado (Sección 4.1). Si la respuesta 401 contiene el mismo desafío que la respuesta anterior, y el agente de usuario ya ha intentado la autenticación al menos una vez, entonces el agente de usuario DEBERÍA presentar la representación adjunta al usuario, ya que generalmente contiene información de diagnóstico relevante.

Y esto es de RFC 2616:

10.4.4 403 Prohibido

El servidor entendió la solicitud, pero se niega a cumplirla.
La autorización no ayudará y la solicitud NO DEBE repetirse.
Si el método de solicitud no era HEAD y el servidor desea hacer
Por qué no se ha cumplido con la solicitud, debe describir la razón de la negativa en la entidad. Si el servidor no desea que esta información esté disponible para el cliente, el código de estado 404
(No encontrado) se puede utilizar en su lugar.

Edición: RFC 7231 (Protocolo de transferencia de hipertexto (HTTP / 1.1): Semántica y contenido) cambia el significado de 403:

6.5.3. 403 Prohibido

El código de estado 403 (Prohibido) indica que el servidor entendió la solicitud, pero se niega a autorizarla. Un servidor que desea hacer público el motivo por el cual se ha prohibido la solicitud puede describir ese motivo en la carga útil de respuesta (si existe).

Si se proporcionaron credenciales de autenticación en la solicitud, el
El servidor los considera insuficientes para otorgar acceso. El cliente
NO DEBE repetir la solicitud automáticamente con el mismo
cartas credenciales. El cliente PUEDE repetir la solicitud con credenciales nuevas o diferentes. Sin embargo, una solicitud puede ser prohibida por razones
Sin relación con las credenciales.

Un servidor de origen que desea "ocultar" la existencia actual de un
El recurso de destino prohibido PUEDE responder con un código de estado de
404 No encontrado).

Por lo tanto, un 403 ahora podría significar cualquier cosa. Proporcionar nuevas credenciales puede ayudar ... o no.


Una explicación clara de Daniel Irvine :

Hay un problema con 401 no autorizado , el código de estado HTTP para errores de autenticación. Y eso es todo: es para la autenticación, no para la autorización. El servidor le dice a usted que recibe una respuesta al 401: "usted no está autenticado, o bien no está autenticado en absoluto o está autenticado incorrectamente, pero vuelva a autenticarse e intente nuevamente". Para ayudarlo, siempre incluirá un encabezado WWW-Authenticate que describe cómo autenticar

Esta es una respuesta generalmente devuelta por su servidor web, no por su aplicación web.

También es algo muy temporal; el servidor le está pidiendo que intente de nuevo.

Por lo tanto, para la autorización utilizo la respuesta 403 Prohibida . Es permanente, está ligado a la lógica de mi aplicación y es una respuesta más concreta que un 401.

Al recibir una respuesta 403, el servidor le dice: “Lo siento. Sé quién eres, creo que dices que eres, pero no tienes permiso para acceder a este recurso. Tal vez si le pregunta amablemente al administrador del sistema, obtendrá permiso. Pero, por favor, no me vuelvas a molestar hasta que tu situación cambie ".

En resumen, se debe usar una respuesta 401 no autorizada para la autenticación faltante o incorrecta, y luego se debe usar una respuesta 403 prohibida , cuando el usuario está autenticado pero no está autorizado para realizar la operación solicitada en el recurso dado.

Otro buen formato pictórico de cómo se deben usar los códigos de estado de http.


Ver RFC2616 :

401 no autorizado:

Si la solicitud ya incluía credenciales de autorización, entonces la respuesta 401 indica que se ha rechazado la autorización para esas credenciales.

403 Prohibido:

El servidor entendió la solicitud, pero se niega a cumplirla.

Actualizar

Desde su caso de uso, parece que el usuario no está autenticado. Yo regresaría 401.

Edición: RFC2616 está obsoleto, vea RFC7231 y RFC7235 .


GET, resource exists ? | | NO | | YES v v 404 Is authenticated (logged-in) ? | | NO | | YES v v 401 Can access resource (has permissions) ? (or: 404) | | or 301 NO | | YES redirect v v to login 403 OK 200, 301, ...

Los cheques se hacen generalmente en este orden:

  • 401 si no ha iniciado sesión o la sesión ha caducado
  • 403 si el usuario no tiene permiso para acceder al recurso
  • 404 si el recurso no existe

NO AUTORIZADO : Código de estado (401) que indica que la solicitud requiere autenticación , por lo general, 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 denominado "no autenticado" en lugar de "no autorizado". Esto también puede fallar después de iniciar sesión si la sesión ha caducado.

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 repetición de la solicitud no funcionará, a menos que se cambien las credenciales, lo cual es muy improbable en un corto período de tiempo.

NO ENCONTRADO : Código de estado (404) que indica que el recurso solicitado no está disponible. El usuario / agente lo sabe, 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).