Ответ
Существует множество векторов атак на веб-приложения. Согласно классификации OWASP (Open Web Application Security Project), к наиболее критичным и распространенным относятся:
Основные векторы атак
-
Инъекции (Injections)
- Описание: Внедрение недоверенных данных в команды или запросы. Самый известный пример — SQL-инъекция, когда злоумышленник изменяет SQL-запрос через пользовательский ввод.
- Последствия: Утечка, изменение или удаление данных, отказ в обслуживании.
-
Межсайтовый скриптинг (Cross-Site Scripting, XSS)
- Описание: Внедрение вредоносных скриптов (обычно JavaScript) на веб-страницы, которые просматривают другие пользователи.
- Последствия: Кража сессионных cookie, перехват данных, изменение содержимого страницы.
-
Межсайтовая подделка запроса (Cross-Site Request Forgery, CSRF)
- Описание: Принуждение браузера аутентифицированного пользователя выполнить нежелательное действие в веб-приложении (например, перевести деньги, изменить пароль).
- Последствия: Несанкционированные действия от имени пользователя.
-
Небезопасная конфигурация (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-инъекций в любом языке программирования.