Ответ
При обработке параметров запроса в веб-приложениях необходимо защищаться от нескольких ключевых типов атак. Современные фреймворки предоставляют встроенные инструменты для их предотвращения.
-
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, для строгой проверки всех входящих данных.
Ответ 18+ 🔞
А, слушай, вот это тема — про безопасность в вебах. Ну, типа, как не проебаться, когда к тебе всякие умники лезут с запросами. Сейчас разжую, но без паники, всё как есть.
Первое, что у всех на слуху — это SQL-инъекция. Представь, чувак в твою форму логина вписывает не admin, а какую-нибудь хуйню вроде ' OR '1'='1. И если ты тупо склеиваешь строку для запроса, то он у тебя всю базу вытащит, как из кармана. Пиздец, а не ситуация. Защита проще пареной репы — используй ORM или параметризованные запросы. Они сами всё заэкранируют, как надо.
# Вот так делает адекватный человек (Django ORM)
User.objects.filter(username=request.GET.get('username'))
# А вот так делает еблан, который хочет проблем
query = f"SELECT * FROM users WHERE username = '{request.GET.get('username')}'"
cursor.execute(query)
Дальше — XSS (Межсайтовый скриптинг). Это когда какой-то пидор в комментарий на твоём сайте вставляет <script>alert('ЛОХ');</script>. И если ты это без обработки выведешь, скрипт выполнится у всех, кто страницу откроет. Может куки украсть, может ещё какую дичь устроить. Защита — экранируй всё, что летит в HTML. Хорошие фреймворки (Django, Jinja2) это делают автоматом в шаблонах через {{ переменная }}. Если руками пишешь — юзай escape().
Третья страшилка — CSRF (Подделка межсайтовых запросов). Сидит пользователь у тебя на сайте, авторизовался. А в это время он где-то на левом форуме картинку посмотрел, которая тихонечко от его имени на твой сайт запрос шлёт — типа «переведи все деньги сюда». И браузер, сука, куки твои подставит, запрос выполнится. Чтобы такого не было, используй CSRF-токены. Это такие уникальные печенюшки, которые фреймворк в форму зашивает и потом проверяет. В Django это из коробки, в других фреймворках тоже решается.
Четвёртое — Массовое присваивание. Допустим, у тебя модель пользователя с полями name, email и, охуенно, is_superuser. И есть форма для смены имени. Чувак через DevTools или Postman может добавить в запрос поле "is_superuser": true и, если ты не следишь, стать админом. Защита — явно указывай, какие поля можно обновлять. Не принимай всё подряд, что пришло.
# FastAPI + Pydantic — чётко видно, что можно апдейтить
class UserUpdate(BaseModel):
name: str
email: str
# А поля is_superuser тут нет — его и не изменишь
@app.patch("/users/{user_id}")
def update_user(user_id: int, user_data: UserUpdate):
# ... логика
pass
И наконец, Недостаточная валидация. Это вообще основа основ. Если ты не проверяешь, что тебе пришло — жди беды. Число там, где строка должна быть? Длина пароля два символа? Email вида я@дебил? Всё это — дыры. Валидируй всё, всегда и жёстко. Pydantic, Django Forms — бери и пользуйся. Они и по типам пройдутся, и по формату, и по длине.
Короче, суть в чём: не доверяй ни одному байту, который пришёл от пользователя. Проверяй, экранируй, фильтруй. А фреймворки тебе в этом помогут — только не выключай их встроенные защиты, а то будет как в том анекдоте: «зачем тебе эта кнопка?» — «а я её нажал и охуел».