Ответ
Существует множество векторов атак на веб-приложения. Согласно классификации 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-инъекций в любом языке программирования.
Ответ 18+ 🔞
А, ну ты смотри, какие тут у нас распиздяйства творятся в вебах-то! Овердохуища векторов атак, блядь, как грязи после дождя. Эти умники из OWASP, блядь, всё по полочкам разложили, как будто в музее. Сейчас я тебе на пальцах, но с технической точностью, ёпта, объясню, что к чему.
Вот смотри, основные способы, как тебя могут поиметь, если ты лохонулся:
Инъекции (Injections)
Это когда какой-нибудь хитрожопый уёбок вставляет свою дрянь в твои запросы. Классика жанра — SQL-инъекция. Представь: у тебя форма логина, а он туда пишет не логин, а ' OR 1=1; --. И если ты, мудак, строки тупо склеиваешь, то твоя база данных, блядь, подумает, что это команда, и откроет ему всё нахуй. Последствия? Да вселенский пиздец: данные утекут, изменятся или вообще накроются медным тазом.
Межсайтовый скриптинг (XSS) Тут уже поизящнее, блядь. Зловред втихаря засовывает свой скриптик (обычно JavaScript, падла) на страничку, которую другие юзеры смотрят. Ты заходишь такой весь такой довольный, а твои куки, сессии и прочие ништяки уже тихо так, по-английски, уплывают к этому пидарасу. Или страница вдруг начинает тебе "Привет, лох!" писать. Удивление пиздец, да?
Межсайтовая подделка запроса (CSRF) А это вообще, блядь, тонкая работа. Ты сидишь, авторизованный такой, в своём интернет-банке. А тебе на каком-нибудь левом форуме картинку подсовывают. Ты её открываешь, а она, сука, не картинка, а запрос на перевод всех твоих денег на счёт в Науру. И браузер твой, доверчивая скотина, этот запрос выполняет, потому что ты же в банке уже залогинен! Вот так, чих-пых тебя в сраку, и ты уже бомж.
Небезопасная конфигурация (Security Misconfiguration)
Ну это просто пиздец, блядь, а не пункт. Оставлять настройки по умолчанию, пароли admin/admin, логи с ошибками, которые всю подноготную вываливают, или забыть обновить какую-нибудь библиотеку десятилетней давности. Это как оставить ключи от квартиры под ковриком и удивляться, что тебя обокрали. Злоумышленник просто подбирает и заходит, как к себе домой.
Как не быть мудаком: пример с 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)
# Запрос превратится в: SELECT * FROM users WHERE username = '' OR 1=1; --'
# И вернёт ВСЕХ пользователей, потому что 1=1 всегда истинно! Пизда твоей безопасности.
А вот как делать ПРАВИЛЬНО (если не хочешь, чтобы тебя выебали): Используй параметризованные запросы, ёпта! Это когда команда SQL — это шаблон, а данные подставляются в него отдельно, и драйвер базы их сам, грамотно так, экранирует.
# БЕЗОПАСНЫЙ КОД
import sqlite3
user_input = "' OR 1=1; --"
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
# Видишь знак вопроса? Это плейсхолдер, дырка для данных.
query = "SELECT * FROM users WHERE username = ?"
# А вот тут данные передаются вторым аргументом, ОТДЕЛЬНО.
cursor.execute(query, (user_input,))
# База поймёт: "Ага, надо найти юзера, у которого username РАВЕН ТОЧНО ЭТОЙ СТРОКЕ: ' OR 1=1; --"
# И будет искать какого-то долбоёба с таким ником, а не выполнять инъекцию. Волнение ебать — ноль.
Вот и вся магия, блядь. Этот подход — как презерватив для твоего приложения. Используй везде, и будет тебе счастье. Ну, по крайней мере, от этого одного вида ебли.