Современные методы защиты данных в веб приложениях: полный обзор
Практические примеры защиты данных в веб-приложениях
Защита от разных видов кибератак обеспечивает доступность и непрерывность работы web-приложений. Вычислить и предотвратить атаки помогает использование комплекса мер по информационной безопасности.
Подделка межсайтовых запросов (CSRF)
CSRF-атака возможна только в том случае, если сайт не использует защиту в виде токенов или других методов валидации запросов. Через CSRF-атаки мошенники используют учетные данные пользователя, чтобы заставить его выполнить нежелательное действие на доверенном сайте. Атака известна также под такими названиями как XSRF, Sea Surf, Session Riding, Cross-Site Reference Forgery и Hostile Linking.
Допустим, через систему проверки подлинности форм клиент входит в систему bank.com. Программа помнит логин и пароль посетителя этого веб-ресурса, поэтому доверяет любому обращению с допустимой проверкой подлинности cookie, а значит уязвим для атаки.
Атака будет включать следующие шаги:
- Создание URL-адреса или скрипта эксплойта
- Вынуждение пользователя выполнить действие с помощью социальной инженерии.
В сценарии GET операция мошеннического перевода денег может включать запрос:
GET http://bank.com/transfer.do?acct=BOB&amount=100 HTTP/1.1
Обман клиента и принуждение загрузить этот URL обычно происходит методами:
- Отправка письма на электронную почту с HTML-контентом
- Размещение URL-адреса или скрипта эксплойта на страницах, которые жертва посещает, чтобы зайти в онлайн-банкинг.
URL-адрес эксплойта можно замаскировать под обычную ссылку или как поддельное изображение.
В ПОСТ сценарии уязвимый запрос выглядит следующим образом:
POST http://bank.com/transfer.do HTTP/1.1 acct=BOB&amount=100
Такое обращение может быть доставлено с использованием тегов FORM:
<form action="http://bank.com/transfer.do" method="POST"> <input type="hidden" name="acct" value="MARIA"/> <input type="hidden" name="amount" value="100000"/> <input type="submit" value="View my pictures"/> </form>
Посетителю страницы потребуется лишь нажать кнопку «Отправить» и попасть в руки мошенников.
Как защитить сайт от CSRF-атак
Выбор защищенных фреймфорков. Некоторые веб-фреймворки имеют встроенные механизмы предотвращения CSRF-атак. Такие как .NET, Laravel.
Токены CSRF (anti-CSRF-токены) — способ охраны со стороны сервера. Сервер отправляет браузеру уникальный токен в виде непредсказуемого случайного числа с небольшим сроком жизни. В ответном запросе программы токены должны совпасть. Если нет — обращение отклоняется.
Сервер проверяет полученный от клиента токен по базе данных и так «распознает» своего пользователя:
Также можно использовать два токена. Первый сохраняется в параметрах ответа, второй — в сессионных cookies. Сервер, получая обращение от браузера, проверяет оба токена и усложняет его безопасность.
Флаг Same-Site Cookies помечает куки для одного доменного имени, в следствие чего проверке подвергается источник.
Дополнительное подтверждение действий со стороны клиента. Например, если после попытки смены пароля требуется ввести капчу.
Защита от угона сессии (Session theft, session hijacking)
Каждому посетителю при входе на веб-ресурс присваивается уникальный идентификатор сессии, который отслеживает активность, сохраняет настройки и данные формы, обеспечивая безопасность.
Мошенник может влезть в открытый канал передачи данных, украсть идентификатор сессии и получить доступ к целевой системе. Уязвимость веб-приложений возникает при недостаточной защите cookie. Например, при отсутствии шифрования.
Примеры атак:
- Подделка IP-адреса (IP spoofing).
- Подмена передаваемых данных (Man-in-the-Middle).
- Вредоносный скрипт с кражей cookie (Cross Site Scripting (XSS).
- Подмена идентификатора сессии (Session Fixation).
Защита от угона сессии требует комплексного подхода. Популярные методы включают:
- Применение HTTPS с помощью шифрования.
- Комплексные идентификаторы сессии.
- Обновление ID сессии.
- Валидация данных клиента.
SQL-инъекции
Злоумышленники внедряют вредоносный SQL в БД клиента через интернет-ресурс, чтобы украсть или нанести вред. Последствия SQL-инъекции:
- Раскрытие конфиденциальной информации, которая хранится на сервере.
- Удаление или изменение данных клиента.
- Перехват административных и общих прав к клиентской системе.
Типы внедрения SQL Injection: несанкционированный ввод без проверки или кодирования входных данных, внеполосная инъекция и слепая.
Этот класс уязвимости возможен, если входные данные могут изменить смысл оператора. Код ниже используется, чтобы перечислить всех пользователей с конкретным userName, представленным из формы HTML:
statement = "SELECT * FROM users WHERE name = '" + userName + "';"
Допустим, посетитель укажет реальное имя. Тогда оператор будет работать по плану. А злоумышленник может полностью изменить поведение оператора SQL, заменив текст полужирным шрифтом для userName.
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';
Измененный оператор через действительного оператора удаляет таблицу пользователей и забирает данные из userinfo с конфиденциальной информацией о клиентах.
Основные способы защиты от SQL-инъекции:
Белые списки. Когда разрешен определенный список символов и ключевых слов, а все остальные запрещены.
Обработка переменных. Для безопасности рекомендуем использовать подготовленные запросы (Prepared Statements) или ORM для предотвращения SQL-инъекций, удалять дополнительные пробелы (функция trim), заменять спецсимволы (функция htmlspecialchars).
Подход с нулевым доверием. Использование подхода к безопасности со строгим контролем, когда никто не заслуживает доверия и каждый подвергается проверке. Не только посетители, но и администраторы ресурса.
Использование PDO. Считается наиболее эффективным способом, в котором данные и запрос отправляются отдельно. Выглядит это так:
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass); $stmt = $db->prepare("SELECT * FROM articles WHERE id=':id'"); $stmt->bindParam(':id', $id); $stmt->execute();
Если в переменной появится дополнительная кавычка, сервер не примет ее, и попытка атаки не сработает.
Межсайтовый скриптинг (Cross-Site Scripting, XSS)
XSS — тип веб-атаки, который часто встречается на просторах Интернета и дает шанс внедрить XSS-скрипт через веб-ресурс в клиентские браузеры. Код становится доверенным и может выполнять негативные действия: позволить злоумышленнику войти на интернет-сервис под именем пользователя, получить доступ к банковским данным, сменить пароли.
Схема действия межсайтового скриптинга:
Пример XSS уязвимости
protected void Page_Load(object sender, EventArgs e) { Response.Cookies.Add(new HttpCookie("User_Cookie_Key", "User_Cookie_Value")); const string CenterAlignFormat = "<p style='text-align: center'>{0}</p>"; var userName = Request.Params["userName"]; // <= string message; if (string.IsNullOrWhiteSpace(userName)) { message = string.Format(CenterAlignFormat, "Empty 'userName' parameter"); } else { message = string.Format(CenterAlignFormat, $"'{userName}' data has been processed."); } Response.Write(message); // <= } Предупреждение PVS-Studio: V5610 Possible XSS vulnerability. Potentially tainted data in the 'message' variable might be used to execute a malicious script. Default.aspx.cs 61
Данные из параметра запроса userName напрямую используются для записи в Response:
Благодаря этому злоумышленник может подсунуть пользователю ссылку с вредоносным кодом и украсть, например, cookie.
Основные способы защиты от XSS-атаки
Использовать веб-серфер с высоким уровнем надежности, которые помогут обезопасить от некоторых XSS.
Использовать расширения безопасности браузера. Например, NoScript блокирует небезопасные скрипты и защищает от XSS.
Убедиться в возможности фильтровать вводимые коды HTML и JavaScript страницами сайта, которые принимают пользовательские данные.
Проверять веб-приложения на наличие уязвимостей и исправлять их.
Своевременно обновлять веб-ресурс и серверное ПО, чтобы получать более совершенные механизмы защиты от кибератак.
Регулярно чистить кэш, файлы cookie и историю веб-серфера, чтобы закрыть доступ к кэшированным версиям страниц.