HTTPQUERY
Español

403 Forbidden

Uso

Cuando llega un error 403 Forbidden, el cliente no tiene permisos suficientes para acceder al recurso. Es un error habitual y genérico que indica al cliente que la solicitud no está permitida. Este estado se diferencia de 401 Unauthorized porque el error persiste incluso después de que el cliente vuelva a autenticarse y reenvíe la solicitud. El estado más específico 405 Method Not Allowed indica que el recurso está disponible, pero que ese método HTTP concreto no se permite.

403 frente a 404 como decisión de seguridad

Los servidores devuelven intencionadamente 404 en lugar de 403 para ocultar el hecho de que un recurso existe. Responder con 403 confirma que el recurso está presente pero con el acceso restringido, lo cual no es deseable para rutas sensibles. Elegir entre 403 y 404 es una decisión deliberada de diseño de seguridad.

Impacto en SEO

Los motores de búsqueda como Google no indexan una URL que devuelve el estado 403. Las URL indexadas previamente que devuelven este código de estado se eliminan de los resultados de búsqueda. Las páginas que devuelven este código no consumen presupuesto de rastreo. No utilice 403 para frenar a Googlebot. Solo 429 reduce la frecuencia de rastreo.

Ejemplo

El cliente solicita un recurso protegido y el servidor responde con 403 Forbidden para indicar que el cliente carece de acceso. El cuerpo de la respuesta explica la restricción.

Solicitud

GET /tech-news/confidential.pdf HTTP/1.1
Host: example.com

Respuesta

HTTP/1.1 403 Forbidden
Content-Type: text/html
Content-Length: 154

<html>
  <head>
    <title>Access Denied</title>
  </head>
  <body>
    <p>Permission to access this resource is
    restricted.</p>
  </body>
</html>

Cómo solucionarlo

Un 403 Forbidden significa que el servidor entendió la solicitud, pero se niega a autorizar la acción.

Verifique los permisos de archivos y directorios en el servidor. En Linux, compruebe la propiedad y los bits de permiso con ls -la. El proceso del servidor web (que normalmente se ejecuta como www-data o nginx) necesita acceso de lectura al archivo solicitado. Permisos estándar: 755 para directorios y 644 para archivos. Corrección recursiva:

find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/html

nginx también requiere permiso de ejecución en cada directorio padre de la ruta que va desde / hasta el archivo servido.

Revise .htaccess o la configuración del servidor en busca de reglas de denegación. Las directivas Require de Apache, las reglas deny de nginx o controles de acceso similares bloquean rutas o rangos de IP concretos. En Apache, busque Require all denied o Deny from all en .htaccess o en los bloques . En nginx, busque deny all; dentro de los bloques location. Revise los archivos de configuración correspondientes y consulte el registro de errores para conocer el motivo concreto de la denegación.

Confirme que la IP de la solicitud no está bloqueada. Un cortafuegos, un cortafuegos de aplicaciones web (WAF) o una regla de geobloqueo rechaza las solicitudes procedentes de direcciones restringidas. Revise los registros de acceso del servidor en busca de entradas de denegación. Cloudflare, AWS WAF y mod_security producen respuestas 403 cuando se activan sus reglas. Consulte el panel del WAF o el registro de auditoría para identificar la regla que bloquea.

Asegúrese de que el usuario autenticado tiene el rol o el ámbito requerido. Incluso con una autenticación válida, la cuenta necesita el nivel de permiso correcto. Verifique las asignaciones de roles en el sistema de control de acceso de la aplicación. Los endpoints de API devuelven 403 con frecuencia cuando el token carece de los ámbitos de OAuth necesarios.

Revise la configuración del índice de directorio al solicitar una carpeta. Solicitar un directorio sin un archivo de índice predeterminado (por ejemplo, index.html) devuelve 403 cuando el listado de directorios está desactivado. Añada un archivo de índice o habilite el listado. En nginx:

location /files/ {
    autoindex on;
}

En Apache, añada Options +Indexes a la configuración del directorio. Habilitar el listado de directorios en servidores de producción supone un riesgo de seguridad.

Revise las políticas de SELinux o AppArmor. En sistemas RHEL/CentOS, SELinux deniega al servidor web el acceso a archivos situados fuera de las rutas previstas incluso cuando los permisos Unix permiten la lectura. Ejecute sestatus para comprobar el modo de SELinux y revise /var/log/audit/audit.log en busca de entradas denegadas. Vuelva a etiquetar los archivos con restorecon -Rv /var/www/html o establezca el contexto correcto con chcon.

Inspeccione los requisitos de certificado de cliente SSL/TLS. Los servidores configurados para TLS mutuo devuelven 403 cuando el cliente no presenta un certificado válido. Revise la directiva ssl_verify_client de nginx o la directiva SSLVerifyClient de Apache.

Referencias de código

.NET

HttpStatusCode.Forbidden

Rust

http::StatusCode::FORBIDDEN

Rails

:forbidden

Go

http.StatusForbidden

Symfony

Response::HTTP_FORBIDDEN

Python3.5+

http.HTTPStatus.FORBIDDEN

Java

java.net.HttpURLConnection.HTTP_FORBIDDEN

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_FORBIDDEN

Angular

@angular/common/http/HttpStatusCode.Forbidden