Knowledge Base

Раскрытие информации через страницы ошибок

Раскрытие информации через страницы ошибок

Категория: Web Application Security · Риск: medium

Раскрытие информации через страницы ошибок

Что утекает в ошибках

Подробные страницы ошибок (stack trace) в production-окружении раскрывают:

Как проверить

# Запрос несуществующего пути
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'
    });
});

Контрольный список

Связанные проверки