Какие основные уязвимости существуют при обработке параметров HTTP-запроса в веб-фреймворках?

Ответ

При обработке параметров запроса в веб-приложениях необходимо защищаться от нескольких ключевых типов атак. Современные фреймворки предоставляют встроенные инструменты для их предотвращения.

  1. SQL-инъекция (SQL Injection) Атака, при которой злоумышленник внедряет вредоносный SQL-код в запрос, чтобы получить несанкционированный доступ к базе данных. Защита: Использование ORM (Object-Relational Mapping) или параметризованных запросов, которые автоматически экранируют пользовательский ввод.

    # Django ORM (безопасно)
    # Ввод пользователя передается как параметр, а не встраивается в строку запроса.
    User.objects.filter(username=request.GET.get('username'))
    
    # Небезопасный сырой SQL-запрос
    # Прямая конкатенация строки открывает путь для инъекции.
    query = f"SELECT * FROM users WHERE username = '{request.GET.get('username')}'"
    cursor.execute(query)
  2. Межсайтовый скриптинг (XSS, Cross-Site Scripting) Внедрение вредоносного JavaScript-кода на страницу, который выполняется в браузере другого пользователя. Защита: Экранирование (escaping) всех данных, выводимых в HTML-шаблоны.

    # Django и Jinja2 делают это автоматически для переменных в {{ ... }}
    # <div>{{ user_provided_comment }}</div>
    
    # При ручной генерации HTML нужно использовать специальные функции
    from markupsafe import escape
    html_output = f"<p>{escape(user_input)}</p>"
  3. Подделка межсайтовых запросов (CSRF, Cross-Site Request Forgery) Атака, заставляющая браузер пользователя выполнить нежелательное действие на сайте, где он уже аутентифицирован (например, изменить пароль). Защита: Использование уникальных CSRF-токенов для каждого сеанса, которые проверяются при каждом POST/PUT/DELETE запросе. Django имеет встроенную middleware для этого, в FastAPI это реализуется через сторонние библиотеки или кастомные зависимости.

  4. Массовое присваивание (Mass Assignment) Уязвимость, при которой злоумышленник может изменять защищенные поля модели (например, is_admin или balance), передавая их в теле запроса. Защита: Явное определение полей, которые разрешено изменять, с помощью DTO (Data Transfer Objects) или форм.

    # FastAPI с Pydantic (безопасно)
    # Модель определяет, какие поля можно принять от клиента.
    class UserUpdate(BaseModel):
        name: str
        email: str
        # Поле is_admin отсутствует, его нельзя будет изменить через этот эндпоинт
    
    @app.patch("/users/{user_id}")
    def update_user(user_id: int, user_data: UserUpdate):
        # ... логика обновления
        pass
  5. Недостаточная валидация данных Отсутствие проверки типов, длины, формата и диапазона значений может привести к ошибкам, отказам в обслуживании или другим уязвимостям. Защита: Использование систем валидации, таких как Pydantic в FastAPI или Django Forms, для строгой проверки всех входящих данных.