Какие типы 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."}

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

Ответ 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."}

Итог, ёпта: Любая информация, которая пришла с улицы, из этого дикого интернета, — это потенциальный враг. Её надо досмотреть на входе, обыскать до нитки, прежде чем пускать в свою чистую, опрятную логику. Иначе — пиши пропало.