Как бы вы обеспечили защитуа 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.