19. Уязвимости
Как у любого творения человечества, есть уязвимости, самые распространённые - Cross-Site Scripting (далее - XSS) и его брат Cross-site request forgery (далее - CSRF). Для проверки защищённости запросов используется протокол Secure Sockets Layer или его производное HyperText Transfer Protocol Secure (Далее - SSL или HTTPS), который подтверждён доверенными провайдерами
Cross-Site Scripting (Подделка межсайтовых сценариев)
Это подвид атаки на веб-системы, при котором злоумышленник внедряет вредоносный код в контент, отображаемый веб-системой, с целью его последующего выполнения на компьютере пользователя при открытии такой страницы. Это делается либо через уязвимости в самом веб-сервере, либо через уязвимости на компьютере пользователя. Специфика XSS заключается в том, что вредоносный код может использовать авторизацию пользователя в системе для получения расширенного доступа или для кражи авторизационных данных.
Существует два основных типа XSS: отраженный (reflected XSS) и хранимый (stored XSS). Отраженный XSS срабатывает, когда пользователь переходит по специально подготовленной ссылке, содержащей вредоносный код, который затем исполняется браузером жертвы. Хранимый XSS возникает, когда злоумышленник внедряет вредоносный код на сервер, который затем автоматически исполняется при каждом обращении к оригинальной странице.
Для защиты от XSS необходимо применять ряд мер, включая валидацию и очистку входных данных, кодирование вывода для предотвращения выполнения вредоносного кода, а также использование Content Security Policy для ограничения источников загружаемого контента. Регулярное обновление программного обеспечения и применение специализированных библиотек для очистки HTML также играют важную роль в предотвращении XSS-атак.
Вот несколько эффективных методов:
- Валидация ввода - перед обработкой пользовательского ввода следует проверять его на соответствие определенным критериям, чтобы убедиться в отсутствии вредоносных HTML тегов или атрибутов. Это можно сделать с помощью регулярных выражений.
- Кодирование вывода - преобразование потенциально опасных символов в безопасные эквиваленты. В JavaScript это можно реализовать через использование свойств
textContent
илиinnerText
для безопасного отображения текста без интерпретации его как HTML. - Использование Content Security Policy (CSP) - настройка CSP позволяет указать, какие источники контента могут быть загружены страницей. Это эффективно блокирует выполнение внедренного HTML кода.
- Очистка HTML с помощью библиотек - использование специализированных библиотек, таких как
DOMPurify
для JavaScript, помогает удалить или экранировать потенциально опасные HTML теги и атрибуты. - Регулярное обновление программного обеспечения - важно регулярно обновлять ваше программное обеспечение, библиотеки и зависимости, чтобы исправлять известные уязвимости и предотвращать атаки HTML инъекций.
Применение этих методов поможет значительно снизить риск атак HTML инъекций в ваших веб-приложениях, обеспечивая безопасность пользователей и вашего приложения.
Известные сайты пострадавшие в прошлом от данного типа атак Twitter, ВКонтакте, MySpace, YouTube, Facebook и др.
Cross-site request forgery (Подделка межсайтовых запросов)
Это вид атак на веб-пользователей, использующий недостатки протокола HTTP. Злоумышленник создает ссылку или скрипт на доверенном сайте, который жертва посещает, и который отправляет скрытые запросы на целевой сайт. Эти запросы могут выполнять вредоносные операции, такие как перевод денег, изменение паролей или отправка конфиденциальной информации.
Для успешной атаки CSRF требуется, чтобы жертва была аутентифицирована на целевом сайте, и чтобы запросы не требовали явного подтверждения со стороны пользователя. Это позволяет атакующему скрипту автоматически выполнять действия от имени жертвы без ее ведома.
Защита от CSRF включает в себя механизмы, требующие подтверждения большинства действий пользователя и проверку поля HTTP_REFERER
, если оно указано в запросе. Однако, более надежным методом является использование дополнительного секретного ключа, ассоциированного с каждой сессией пользователя, который проверяется сервером перед выполнением действий. Этот ключ не должен передаваться в открытом виде, а должен быть включен в тело запроса.
Также важно защищать и других атак, которые могут позволить злоумышленнику получить доступ к секретному ключу. Спецификация HTTP/1.1
допускает наличие тела для запросов, но для некоторых методов запроса (GET, HEAD, DELETE)
семантика тела запроса не определена и должна быть проигнорирована. Поэтому ключ может быть передан только в самом URL или в HTTP-заголовке запроса.
Основные методы борьбы:
- Использование токенов (Anti-CSRF Tokens): Сервер генерирует уникальный токен для каждой сессии пользователя и включает его в форму или запрос. При отправке формы или выполнении запроса сервер проверяет наличие и валидность токена. Токен должен быть непредсказуемым и иметь ограниченное время жизни.
- Использование флагов Same-Site в cookies: Флаг Same-Site указывает, может ли cookie быть отправлен с запросами на другие домены. Установка флага
Same-Site=“Strict”
предотвращает отправку cookies с запросами на сторонние домены, что снижает риск CSRF атак. - Требование подтверждения от пользователя: Для чувствительных операций, таких как перевод денег или смена пароля, можно требовать дополнительное действие от пользователя, например ввод капчи или кода подтверждения.
- Использование фреймворков с встроенной защитой от CSRF: Многие современные фреймворки предоставляют встроенные механизмы защиты от CSRF, что упрощает процесс разработки и повышает уровень безопасности.
- Использование двух токенов: Один токен сохраняется в cookies, а другой передается в скрытом поле формы. Сервер проверяет оба токена перед выполнением запроса.
- Ограничение доступа к формам: Ограничьте доступ к формам, которые могут быть использованы для выполнения CSRF атак, используя механизмы аутентификации и авторизации.
Применение этих методов в комплексе значительно повышает уровень защиты от CSRF атак, делая веб-приложения более безопасными для пользователей.
HyperText Transfer Protocol Secure (Secure Sockets Layer)
SSL (Secure Sockets Layer) представляет собой технологию, обеспечивающую безопасное соединение между клиентом (например, браузером) и сервером. Она играет ключевую роль в защите данных, передаваемых по сети, путем шифрования трафика и аутентификации участников обмена.
SSL использует асимметричное шифрование для обеспечения конфиденциальности данных, передаваемых между клиентом и сервером. Это достигается за счет использования открытого и закрытого ключей, где открытый ключ доступен всем, а закрытый известен только владельцу. При установлении защищенного соединения клиент и сервер обмениваются сертификатами, содержащими информацию о владельце и открытом ключе.
Аутентификация в SSL обеспечивается через цифровые сертификаты, выданные доверенными центрами сертификации (ЦС). Эти сертификаты подтверждают личность владельца и обеспечивают целостность данных, гарантируя, что информация не была изменена в процессе передачи.
SSL также защищает от атак типа “человек посередине” (Man-in-the-Middle), поскольку он использует криптографические алгоритмы для проверки подлинности сторон и целостности данных. Это позволяет обеспечить высокий уровень безопасности при передаче финансовых данных, личной информации и других конфиденциальных сведений.
Современность и Терминология В настоящее время SSL заменен более современной версией - TLS (Transport Layer Security), которая предлагает улучшенные механизмы безопасности и поддерживает более широкий спектр алгоритмов шифрования. Однако термин “SSL” продолжает использоваться в обиходе для обозначения защищенных соединений, хотя технически речь идет о TLS.