Ответ
При обработке параметров запроса в веб-приложениях необходимо защищаться от нескольких ключевых типов атак. Современные фреймворки предоставляют встроенные инструменты для их предотвращения.
-
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)
-
Межсайтовый скриптинг (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>"
-
Подделка межсайтовых запросов (CSRF, Cross-Site Request Forgery) Атака, заставляющая браузер пользователя выполнить нежелательное действие на сайте, где он уже аутентифицирован (например, изменить пароль). Защита: Использование уникальных CSRF-токенов для каждого сеанса, которые проверяются при каждом POST/PUT/DELETE запросе. Django имеет встроенную middleware для этого, в FastAPI это реализуется через сторонние библиотеки или кастомные зависимости.
-
Массовое присваивание (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
-
Недостаточная валидация данных Отсутствие проверки типов, длины, формата и диапазона значений может привести к ошибкам, отказам в обслуживании или другим уязвимостям. Защита: Использование систем валидации, таких как Pydantic в FastAPI или Django Forms, для строгой проверки всех входящих данных.