Ответ
Валидировать необходимо абсолютно все входящие данные, независимо от 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."}
Вывод: Любая информация, поступающая извне системы, потенциально опасна и должна быть строго проверена перед использованием.