← Назад к вопросам
От каких атак нужно защищать параметры запроса в 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": []}
Общие рекомендации
- Валидируй всё: Входные данные всегда враг
- ORM везде: Django ORM и SQLAlchemy защищают от SQL инъекций
- Экранируй вывод: Особенно в HTML/JavaScript контексте
- Ограничивай привилегии: БД пользователь с минимальными правами
- HTTPS везде: Никогда не передавай sensitive данные по HTTP
- Rate limiting: Защита от brute-force и DoS
- WAF: Web Application Firewall в продакшене
- Логирование: Отслеживай подозрительную активность
- Security headers: X-Frame-Options, X-Content-Type-Options и т.д.
- Content-Type: Явно указывай тип контента
Параметры запроса требуют многоуровневой защиты: валидация на входе, санитизация, параметризованные запросы к БД и экранирование при выводе.