Ответ
Валидировать необходимо абсолютно все входящие данные, независимо от 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."}
Вывод: Любая информация, поступающая извне системы, потенциально опасна и должна быть строго проверена перед использованием.
Ответ 18+ 🔞
А, слушай, вот это вообще классика, про которую все забывают, а потом охуевают, когда всё падает! Валидировать надо абсолютно всё, что прилетает извне, без разбора, какой там метод запроса. Принцип "никогда не доверяй пользовательскому вводу" — это не просто красивая фраза, это, блядь, священное писание для любого, кто не хочет, чтобы его сервис превратился в дырявое решето.
Представь себе, любой еблан с постманом или керликом может подделать вообще что угодно в запросе. Ему насрать на твои фронтендские ограничения. Поэтому проверяем всё, что шевелится:
- Тело запроса (
Request Body): Это твои JSON'ы, данные форм. В основном летят вPOST,PUT,PATCH. - Параметры URL (
Query Parameters): Вся хуйня после знака вопроса?в адресной строке. Классика дляGET. - Параметры пути (
Path Parameters): Эти динамические куски в самом URL, типа{id}в/users/{id}. - Заголовки (
Headers): Да-да, и их тоже!User-Agent,Accept-Language, да любые кастомные, которые ты ждёшь. - Cookies: Ну и эти печеньки, которые клиент хранит. Тоже не святые.
Вот тебе живой пример, как в FastAPI можно прищучить GET-параметр:
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."}
Итог, ёпта: Любая информация, которая пришла с улицы, из этого дикого интернета, — это потенциальный враг. Её надо досмотреть на входе, обыскать до нитки, прежде чем пускать в свою чистую, опрятную логику. Иначе — пиши пропало.