Защита FastAPI от атак с внедрением и кросс-сайтовых уязви... | Вопросы для собеседования | Skilio
Защита FastAPI от атак с внедрением и кросс-сайтовых уязвимостей
Вопрос:

Как бы вы обеспечили защитуа endpoint-а на FastAPI от уязвимостей SQL Injection?

Объясните свой подход к валидации запросов и санитизации ответов, чтобы предотвратить распространенные атаки, такие как XSS и CSRF.

Подсказки:

  • Учтите, как система зависимостей FastAPI может быть использована для обеспечения мер безопасности.
  • Подумайте о встроенной валидации запросов с помощью моделей Pydantic и о том, как они помогают предотвратить injection атаки.
  • Возможно, стоит обсудить варианты использования middleware или сторонние пакеты, которые повышают безопасность в приложениях FastAPI.
  • Как настроить CORS для FastAPI?

Выше ожиданий:

  • Знает о реализации Content Security Policy в FastAPI.
Ответ:

Предотвращение SQL-инъекций

Параметризованные запросы являются необходимыми для предотвращения SQL-инъекций. Никогда не конкатенируйте пользовательский ввод в SQL-строки:

# НЕБЕЗОПАСНО
query = f"SELECT * FROM users WHERE username = '{username}'"

# БЕЗОПАСНО с SQLAlchemy
result = db.execute(select(User).where(User.username == username))

Используйте фреймворки ORM (Object-Relational Mapping), такие как SQLAlchemy, которые автоматически обрабатывают параметризацию.

Pydantic модели FastAPI валидируют входные данные перед их передачей в базу данных:

class UserRequest(BaseModel):
    username: str
    email: EmailStr  # Валидирует формат электронной почты

Защита от XSS

Валидация входных данных с помощью Pydantic обеспечивает правильные типы данных и ограничения.

Кодирование выходных данных при возврате пользователю HTML-контента. Используйте шаблоны, которые автоматически экранируют значения:

# Используя Jinja2-шаблоны, которые по умолчанию экранируют
templates = Jinja2Templates(directory="templates")

@app.get("/items/{id}")
async def read_item(request: Request, id: str):
    return templates.TemplateResponse("item.html", {"request": request, "id": id})

Защита от CSRF

Реализуйте CSRF-токены для операций изменения состояния. Используйте готовые библиотеки для проверки токенов:

def verify_csrf_token(csrf_token: str = Cookie(None), token_from_form: str = Form(...)):
    if csrf_token != token_from_form:
        raise HTTPException(status_code=400, detail="CSRF-токен отсутствует или неверный")

Middleware и заголовки безопасности

Настройте CORS для ограничения запросов с других доменов:

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://trusted-site.com"],
    allow_methods=["GET", "POST"],
    allow_headers=["*"],
)

Реализуйте заголовки Content Security Policy с помощью middleware:

@app.middleware("http")
async def add_security_headers(request, call_next):
    response = await call_next(request)
    response.headers["Content-Security-Policy"] = "default-src 'self'"
    return response

Используйте пакет fastapi.security для реализации доп мер безопасности, таких как OAuth2PasswordBearer для аутентификации и HTTPSRedirectMiddleware для принудительного использования HTTPS.

0
Python Средний Опубликовано
© Skilio, 2025
Условия использования
Политика конфиденциальности
Мы используем файлы cookie, для персонализации сервисов и повышения удобства пользования сайтом. Если вы не согласны на их использование, поменяйте настройки браузера.