403 Forbidden
Применение
Когда приходит ошибка 403 Forbidden, это означает, что у клиента недостаточно прав для доступа к ресурсу. Это распространённая и общая ошибка, сообщающая клиенту, что запрос не разрешён. Этот статус отличается от 401 Unauthorized, поскольку ошибка сохраняется даже после того, как клиент заново прошёл аутентификацию и повторно отправил запрос. Более конкретный статус 405 Method Not Allowed указывает, что ресурс доступен, но использованный HTTP-метод не разрешён.
403 и 404 как решение в области безопасности
Серверы намеренно возвращают 404 вместо 403, чтобы скрыть сам факт существования ресурса. Ответ с кодом 403 подтверждает, что ресурс присутствует, но доступ к нему ограничен, а для чувствительных путей это нежелательно. Выбор между 403 и 404 — это осознанное решение в проектировании безопасности.
Влияние на SEO
Поисковые системы вроде Google не индексируют URL, возвращающий статус 403. Ранее проиндексированные URL, которые начали возвращать этот код состояния, удаляются из результатов поиска. Страницы, возвращающие этот код, не расходуют краулинговый бюджет. Не используйте 403, чтобы замедлить Googlebot. Снизить частоту сканирования позволяет только 429.
Пример
Клиент запрашивает защищённый ресурс, и сервер отвечает 403 Forbidden, показывая, что у клиента нет доступа. Тело ответа поясняет ограничение.
Запрос
GET /tech-news/confidential.pdf HTTP/1.1
Host: example.com
Ответ
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>
Как исправить
403 Forbidden означает, что сервер понял запрос, но отказывается авторизовать действие.
Проверьте права на файлы и каталоги на сервере. В Linux посмотрите владельца и биты прав командой ls -la. Процессу веб-сервера (обычно работающему от имени www-data или nginx) нужны права на чтение запрошенного файла. Стандартные права: 755 для каталогов, 644 для файлов. Исправить рекурсивно:
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 дополнительно требует право на выполнение для каждого родительского каталога на пути от / до отдаваемого файла.
Проверьте .htaccess или конфигурацию сервера на наличие запрещающих правил. Директивы Require в Apache, правила deny в nginx или аналогичные средства контроля доступа блокируют определённые пути или диапазоны IP. В Apache ищите Require all denied или Deny from all в .htaccess либо в блоках
Убедитесь, что IP-адрес запроса не заблокирован. Межсетевой экран, веб-брандмауэр (WAF) или правило геоблокировки отклоняют запросы с ограниченных адресов. Проверьте журналы доступа сервера на наличие записей об отказах. Cloudflare, AWS WAF и mod_security — все они выдают ответы 403 при срабатывании правил. Просмотрите панель WAF или журнал аудита, чтобы определить блокирующее правило.
Убедитесь, что у аутентифицированного пользователя есть нужная роль или область доступа. Даже при действительной аутентификации учётной записи требуется корректный уровень прав. Проверьте назначение ролей в системе контроля доступа приложения. Эндпоинты API часто возвращают 403, когда у токена отсутствуют необходимые области OAuth.
Проверьте настройки индексного файла каталога при запросе папки. Запрос каталога без файла индекса по умолчанию (например, index.html) возвращает 403, если листинг каталога отключён. Добавьте индексный файл или включите листинг. В nginx:
location /files/ {
autoindex on;
}
В Apache добавьте Options +Indexes в конфигурацию каталога. Включение листинга каталогов на продакшен-серверах создаёт угрозу безопасности.
Проверьте политики SELinux или AppArmor. В системах RHEL/CentOS SELinux запрещает веб-серверу доступ к файлам вне ожидаемых путей, даже если права Unix разрешают чтение. Запустите sestatus, чтобы узнать режим SELinux, и просмотрите /var/log/audit/audit.log на предмет записей об отказах. Переназначьте метки файлов командой restorecon -Rv /var/www/html или задайте правильный контекст с помощью chcon.
Проверьте требования к клиентскому сертификату SSL/TLS. Серверы, настроенные на взаимный TLS, возвращают 403, когда клиент не предъявляет действительный сертификат. Проверьте директиву ssl_verify_client в nginx или директиву SSLVerifyClient в Apache.
Примеры кода
.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