Защита веб-приложений #
Васильев Андрей Михайлович, 2025
Версии презентации
Виды информации #
В рамках веб-приложений приходится работать с разными видами информации:
- Публичная: описание товаров, статьи и т.д.
- Конфиденциальная: ФИО пользователей, пароли, банковские данные
Конфиденциальную информацию необходимо защищать:
- Компании-конкуренты могут использовать эту информацию для борьбы
- Вредители могут получить доступ к информации
- Могут воздействовать на клиентов приложения
- Могут воздействовать на владельцев веб-приложений
Безопасность и конфиденциальность #
Данные концепции являются различными, но сильно связными
- Безопасность — это процесс защиты личных данных и систем от несанкционированного доступа
- Конфиденциальность — это предоставление пользователю возможность контролировать как его данные собираются, хранятся, используются и что они не используются безответственно
В приложении необходимо корректно реализовать их вместе
- Безопасное приложение может предоставлять безопасный доступ к конфиденциальным данным других пользователей
- Конфиденциальная информация может быть скрыта от обычного пользователя, но доступна для нарушителя, т.к. передаётся по незащищённым каналам связи
Функции безопасности веб-браузера #
Рассмотрим базовые возможности по обеспечению безопасности в веб-браузерах
- Шифрование канала передачи данных
- Контроль источника запроса, CORS
- Контексты безопасности (важно для подключения JavaScript-документов)
- . . .
Многие вопросы не будут рассмотрены в данной лекции, однако рекомендуется самостоятельно ознакомиться со всеми актуальными угрозами и способами их противодействия
Информацию необходимо защищать как на стороне клиента, так и на стороне сервера
- Веб-браузеры включают в себя множество средств защиты информации
- Серверам необходимо корректно настраивать данные средства
- Серверам необходимо корректно обрабатывать запросы от других клиентов
Шифрование канала передачи данных #
Корректно зашифрованный поток передачи данных обеспечивает безопасную передачу данных между веб-браузером и сервером: если данные будут перехвачены третьей стороной, то они не смогут их проанализировать
На настоящий момент безопасным считается шифрование с помощью протокола TLS, лежащего в основе протокола HTTPS (HTTP Secure)
Для реализации шифрования необходимо:
- Зафиксировать доменное имя сервера (получить доступ или приобрести)
- Получить подписанный сертификат, являющийся основой для шифрования данных
- Можно заплатить доверенному центру сертификации за выпуск сертификата
- Можно обратиться к сервису автоматизированного управления сертификатами (Automated Certificate Management Environment, ACME), например Let’s Encrypt
- Подключить сертификат к веб-серверу либо внутри веб-приложения, либо на уровне прокси-сервера
Без корректной реализации шифрования обеспечить безопасность невозможно
Особенности шифрования #
- Веб-сервер может установить заголовок Strict-Transport-Security, чтобы указать необходимость использования HTTPS
- Прозрачность сертификатов позволяет веб-браузеру отслеживать некорректно используемые сертификаты
- Веб-браузер может отображать смешанное содержимое, т.е. когда часть данных получена по шифрованному каналу, а часть данных по незашифрованному каналу. Даже частичная передача данных по нешифрованному каналу может значительно снизить безопасность. По умолчанию такое поведение блокируется, что хорошо
- Сервер может использовать устаревшие схемы шифрования, что значительно снижает безопасность пользователя, своевременно обновляйте настройки шифрования, которые устанавливает сервер
Контроль источника запроса #
Следующие технологии используются для реализации контроля источника запроса
- Политика того же источника определяет как документ или скрипт, загруженный с одного источника может взаимодействовать с ресурсом из другого источника
- Cross-Origin Resource Sharing (CORS) — механизм, использующий дополнительные заголовки, позволяющий агенту получить разрешение на доступ к ресурсам сервера
Первая технология запрещает доступ к ресурсам сервера, если запрос был сделан со страницы, загруженной с другого домена
Особенности работы с CORS #
- При запросе дополнительных данных с того же источника они допускаются
- При запросе данных с других источников клиент обязуется передать заголовок
Origin
, указывающий с какого домена выполняется запрос- При запросе данных с другого источника клиент должен выполнить предварительный OPTIONS-запрос, для получения политик доступа
- Сервер должен ответить с заголовком
Access-Control-Allow-Origin
, указывающий политику разрешений доступа к ресурсу
Поддержка CORS в http4k #
В библиотеке http4k реализована поддержка CORS для серверных приложений
- ServerFilters.Cors — фильтр, который необходимо настроить для всего приложения
- CorsPolicy — параметры описания CORS-политики приложения
- OriginPolicy — набор подходов для обработки источника: любой из, только, шаблон или разрешить все
Защита окружения исполнения сервера #
Доступ к данным должен осуществляться только уполномоченными лицами, чтобы исключить неправомерное использование, изменение, удаление данных или нарушение работы веб-приложения
Для обеспечения безопасности на стороне сервера необходимо выполнять работу систематически над:
- Исходным кодом веб-приложения (ошибки должны остутствовать)
- Обновлениями безопасности веб-сервера и другой инфраструктуры
- Политикой хранения и обновления паролей (как приложения, так и инфраструктуры)
- Настройками безопасности клиентского кода
Это комплексная задача, корректное решение которой требует детального понимания всех аспектов работы приложения и его окружения
Типичные проблемы сверверных веб-приложений #
Кратко рассмотрим проблемы, связанные с передачей данных от пользователя
- Межсайтовый скриптинг (XSS)
- SQL-инъекции
- Подделка межсайтовых запросов (CSRF)
- Перехват нажатий мышкой от пользователя (clickjaking)
- Отказ в обслуживании (DoS)
- Раскрытие доступа к файловой системе
- Выполнение команд в рамках основной ОС
Список текущих актуальных угроз можно посмотреть на сайте OWASP
SQL-инъекция #
Уязвимости SQL-инъекций позволяют злоумышленникам выполнять произвольный SQL-код в базе данных, позволяя получать, изменять или удалять данные независимо от реализованной системы прав пользователя
Эта уязвимость присутствует, если пользовательский ввод, который передаётся в SQL-запрос, может изменить смысл оператора
Рассмотрим следующий код по подготовке SQL-запроса:
val statement = "SELECT * FROM users WHERE name = '$userName';"
Если переменная userName
передаётся от пользователя (например в параметрах запроса), то пользователь может передать туда следующую строку:
a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't
В результате выполнится SQL-код:
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM
userinfo WHERE 't' = 't';
Управление безопасностью #
- Веб-приложения, работающие в сети Интернет, находятся в небезопасном окружении, постоянно открыто для атак извне
- Атакующие постоянно находят новые подходы для обходы средств защиты
- В частности находят ошибки в уже выпущенном программном обеспечении
- Чем больше функций предоставляет приложение, тем больше возможностей есть у атакующего
- Ввод от пользователя может и будет содержать проблемные данные
- Злоумышленники будут пытаться взломать и защиту программного обеспечения, в рамках которой запущено веб-приложение
- Разработчику веб-приложений необходимо постоянно заниматься изучением новых угроз и способов их противодействию