Какие типы HTTP-запросов требуют валидации входных данных

Ответ

Валидировать необходимо абсолютно все входящие данные, независимо от HTTP-метода. Принцип "никогда не доверяй пользовательскому вводу" (Never Trust User Input) является фундаментальным в веб-безопасности.

Злоумышленник может подделать любой аспект запроса, поэтому проверке подлежат:

  • Тело запроса (Request Body): Данные из форм, JSON. Обычно в POST, PUT, PATCH.
  • Параметры URL (Query Parameters): Данные после ? в URL. Обычно в GET.
  • Параметры пути (Path Parameters): Динамические части URL, например, id в /users/{id}.
  • Заголовки (Headers): Например, User-Agent, Accept-Language, кастомные заголовки.
  • Cookies: Данные, хранимые на клиенте.

Пример валидации GET-параметра в FastAPI:

from fastapi import FastAPI, Query, HTTPException
import re

app = FastAPI()

@app.get("/search/")
def search_items(q: str | None = Query(None, min_length=3, max_length=50)):
    # FastAPI автоматически валидирует длину `q`
    # Добавим ручную проверку на допустимые символы
    if q and not re.match(r'^[a-zA-Z0-9s]+$', q):
        raise HTTPException(status_code=400, detail="Invalid characters in search query")

    if q:
        return {"results": f"Searching for '{q}'..."}
    return {"results": "No query provided."}

Вывод: Любая информация, поступающая извне системы, потенциально опасна и должна быть строго проверена перед использованием.