Назовите основные векторы атак на веб-приложения и приведите пример защиты

Ответ

Существует множество векторов атак на веб-приложения. Согласно классификации OWASP (Open Web Application Security Project), к наиболее критичным и распространенным относятся:

Основные векторы атак

  1. Инъекции (Injections)

    • Описание: Внедрение недоверенных данных в команды или запросы. Самый известный пример — SQL-инъекция, когда злоумышленник изменяет SQL-запрос через пользовательский ввод.
    • Последствия: Утечка, изменение или удаление данных, отказ в обслуживании.
  2. Межсайтовый скриптинг (Cross-Site Scripting, XSS)

    • Описание: Внедрение вредоносных скриптов (обычно JavaScript) на веб-страницы, которые просматривают другие пользователи.
    • Последствия: Кража сессионных cookie, перехват данных, изменение содержимого страницы.
  3. Межсайтовая подделка запроса (Cross-Site Request Forgery, CSRF)

    • Описание: Принуждение браузера аутентифицированного пользователя выполнить нежелательное действие в веб-приложении (например, перевести деньги, изменить пароль).
    • Последствия: Несанкционированные действия от имени пользователя.
  4. Небезопасная конфигурация (Security Misconfiguration)

    • Описание: Использование настроек по умолчанию, открытые облачные хранилища, подробные сообщения об ошибках, устаревшее ПО.
    • Последствия: Предоставление злоумышленнику ненужной информации или прямого доступа к системе.

Пример защиты: Борьба с SQL-инъекциями

Ключевой принцип защиты от инъекций — никогда не доверять пользовательскому вводу и отделять данные от команд.

Неправильно (уязвимо): Конкатенация строк для создания запроса.

# УЯЗВИМЫЙ КОД! НЕ ИСПОЛЬЗОВАТЬ!
import sqlite3

user_input = "' OR 1=1; --"
conn = sqlite3.connect("example.db")
cursor = conn.cursor()

# Злоумышленник может обойти проверку, передав вредоносную строку
query = f"SELECT * FROM users WHERE username = '{user_input}'"
cursor.execute(query)

Правильно (безопасно): Использование параметризованных запросов (prepared statements). В этом случае драйвер базы данных сам безопасно экранирует все спецсимволы.

# БЕЗОПАСНЫЙ КОД
import sqlite3

user_input = "' OR 1=1; --"
conn = sqlite3.connect("example.db")
cursor = conn.cursor()

# Данные передаются отдельно от команды SQL
# Знак '?' — это плейсхолдер для данных
query = "SELECT * FROM users WHERE username = ?"
cursor.execute(query, (user_input,))

# Запрос не будет "сломан", а будет искать пользователя с буквальным именем "' OR 1=1; --"

Этот подход является фундаментальной практикой для предотвращения SQL-инъекций в любом языке программирования.