Knowledge Base
Раскрытие информации через страницы ошибок
Раскрытие информации через страницы ошибок
Категория: Web Application Security · Риск: medium
Раскрытие информации через страницы ошибок
Что утекает в ошибках
Подробные страницы ошибок (stack trace) в production-окружении раскрывают:
- Пути к файлам на сервере: `/home/app/backend/app/api/routes.py line 142`
- Версии фреймворков: `FastAPI 0.104.0`, `Django 4.2.1`
- Имена внутренних переменных, параметров, SQL-запросов
- Структуру базы данных (при ошибках ORM)
- Тип и версию СУБД: `psycopg2 2.9.9 — PostgreSQL 15.3`
- Внутренние IP-адреса и имена хостов
- Конфигурационные параметры
Как проверить
# Запрос несуществующего пути
curl -si https://example.com/api/nonexistent | head -50
# Запрос с некорректными параметрами
curl -si "https://example.com/api/user?id=abc" | head -50
# Запрос с методом, который не поддерживается
curl -si -X DELETE https://example.com/api/user/1
# Безопасный ответ:
# HTTP/2 404
# {"detail": "Not found"}
# Опасный ответ:
# HTTP/2 500
# Traceback (most recent call last):
# File "/app/api/routes.py", line 142, in get_user
# user = db.query(User).filter(User.id == int(user_id)).first()
# ValueError: invalid literal for int() with base 10: 'abc'
Как исправить
FastAPI / Python
# В main.py — не выдавать детали ошибок в production
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import logging
app = FastAPI()
log = logging.getLogger(__name__)
@app.exception_handler(Exception)
async def global_handler(request: Request, exc: Exception):
# Логируем детально — но возвращаем клиенту только generic ошибку
log.error("Unhandled exception", exc_info=exc,
extra={"path": request.url.path})
return JSONResponse(
status_code=500,
content={"detail": "Internal server error"}
)
@app.exception_handler(404)
async def not_found_handler(request: Request, exc):
return JSONResponse(status_code=404, content={"detail": "Not found"})
Django
# settings.py
DEBUG = False # КРИТИЧНО: никогда True в production
ALLOWED_HOSTS = ['example.com']
# 404.html и 500.html в templates/ — без технических деталей
Nginx — кастомные страницы ошибок
# Скрыть upstream-ошибки за статичными страницами
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /404.html { root /var/www/html/errors; internal; }
location = /50x.html { root /var/www/html/errors; internal; }
# Скрыть ошибки upstream от клиента
proxy_intercept_errors on;
Express.js / Node.js
// В конце middleware-цепочки
app.use((err, req, res, next) => {
console.error(err.stack); // логируем полно
res.status(500).json({ // клиенту — минимум
error: 'Internal Server Error'
});
});
Контрольный список
- [ ] `DEBUG = False` / аналог для вашего фреймворка
- [ ] Глобальный обработчик исключений возвращает generic-ответ
- [ ] Логи с деталями пишутся в файл/Sentry, не в HTTP-ответ
- [ ] Кастомные страницы для 404, 500, 403
- [ ] В заголовках нет `X-Powered-By`, `Server: nginx/1.25.3`
Связанные проверки
- [Утечка версии сервера](/kb/http/server-header-leakage)
- [Открытые debug-эндпойнты](/kb/web_app_security/api-health-and-debug-endpoints)