← Назад к вопросам

От каких атак нужно защищать параметры запроса в Django, FastAPI и других фреймворках

2.0 Middle🔥 211 комментариев
#Django#FastAPI и Flask#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

От каких атак нужно защищать параметры запроса

Параметры запроса — один из основных векторов атак на веб-приложения. Вот основные атаки и методы защиты в Django, FastAPI и других фреймворках.

1. SQL Injection (SQL инъекции)

Суть: Внедрение SQL-кода через параметры для прямого доступа к БД.

Защита — параметризованные запросы:

# Правильно: Django ORM
from django.db import models
User.objects.filter(id=request.GET.get("id"))

# Правильно: FastAPI + SQLAlchemy
from sqlalchemy import select
session.execute(select(User).where(User.id == user_id))

# Правильно: Raw SQL с параметрами
User.objects.raw("SELECT * FROM users WHERE id=%s", [user_id])

2. Cross-Site Scripting (XSS)

Суть: Внедрение JavaScript-кода через параметры.

Защита — экранирование и валидация:

# Правильно: Django templates экранируют автоматически
from django.template.loader import render_to_string
template = render_to_string("greet.html", {"name": name})

# Правильно: FastAPI с Jinja2
from fastapi.templating import Jinja2Templates
response = templates.TemplateResponse("greet.html", {"request": request, "name": name})

# Правильно: Ручное экранирование
from html import escape
safe_output = f"Hello, {escape(name)}!"

3. CSRF (Cross-Site Request Forgery)

Суть: Выполнение несанкционированного действия от имени пользователя.

Защита:

# Django защита
from django.views.decorators.csrf import csrf_protect

@csrf_protect
def submit_form(request):
    if request.method == "POST":
        pass

# FastAPI с httpOnly cookies и CSRF токеном
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.post("/submit")
async def submit(request):
    # Проверка CSRF токена из заголовка
    pass

4. Path Traversal (обход директорий)

Суть: Доступ к файлам вне разрешённой директории.

Защита:

from pathlib import Path
from fastapi import HTTPException

@app.get("/files/{filename}")
def get_file(filename: str):
    base_path = Path("/uploads").resolve()
    file_path = (base_path / filename).resolve()
    
    if not str(file_path).startswith(str(base_path)):
        raise HTTPException(status_code=403, detail="Access denied")
    
    return file_path

5. Command Injection (инъекции команд)

Защита:

import subprocess

# Правильно: subprocess с массивом аргументов
result = subprocess.run(
    ["convert", image_filename, "output.jpg"],
    check=True,
    capture_output=True
)

6. Type Confusion и Integer Overflow

Защита через валидацию типов (FastAPI):

from pydantic import BaseModel, Field

class QueryParams(BaseModel):
    user_id: int = Field(gt=0, le=2147483647)
    limit: int = Field(ge=1, le=100)
    offset: int = Field(ge=0)

@app.get("/users")
def list_users(params: QueryParams = Depends()):
    pass

Полный пример безопасной обработки

from fastapi import FastAPI, Query, HTTPException
from pydantic import BaseModel, field_validator

app = FastAPI()

class SearchRequest(BaseModel):
    query: str = Field(..., min_length=1, max_length=100)
    category: str = Field(..., pattern="^[a-z0-9_]+$")
    limit: int = Field(10, ge=1, le=100)
    
    @field_validator("query")
    @classmethod
    def query_safe(cls, v):
        dangerous = ["select", "drop", "insert", "delete"]
        if any(kw in v.lower() for kw in dangerous):
            raise ValueError("Suspicious query")
        return v

@app.get("/search")
def search(params: SearchRequest = Depends()):
    return {"results": []}

Общие рекомендации

  1. Валидируй всё: Входные данные всегда враг
  2. ORM везде: Django ORM и SQLAlchemy защищают от SQL инъекций
  3. Экранируй вывод: Особенно в HTML/JavaScript контексте
  4. Ограничивай привилегии: БД пользователь с минимальными правами
  5. HTTPS везде: Никогда не передавай sensitive данные по HTTP
  6. Rate limiting: Защита от brute-force и DoS
  7. WAF: Web Application Firewall в продакшене
  8. Логирование: Отслеживай подозрительную активность
  9. Security headers: X-Frame-Options, X-Content-Type-Options и т.д.
  10. Content-Type: Явно указывай тип контента

Параметры запроса требуют многоуровневой защиты: валидация на входе, санитизация, параметризованные запросы к БД и экранирование при выводе.