Повышение безопасности в JavaScript

Каждый язык программирования имеет свой набор уязвимостей безопасности, и JavaScript не является исключением. Использование уязвимостей JavaScript может привести к манипуляции данными, захвату сеанса, несанкционированному доступу к данным и другим проблемам. Хотя JavaScript обычно ассоциируется с клиентской функциональностью, угрозы безопасности JavaScript также могут представлять значительные угрозы в средах серверной части.

Для любого приложения доверие клиента имеет большое значение. Поддержание этого доверия требует защиты данных клиента и обеспечения безопасности приложений. К счастью, внедрение соответствующих мер безопасности может смягчить эти риски и улучшить безопасность вашего приложения.

В этой статье мы рассмотрим некоторые из наиболее распространенных угроз безопасности JavaScript и обсудим эффективные инструменты и стратегии для защиты вашего приложения от потенциальных атак.

Межсайтовый скриптинг

Межсайтовый скриптинг (XSS) – это уязвимость безопасности, которая позволяет злоумышленнику внедрить вредоносный код на стороне клиента на веб-сайт. Согласно списку десяти наиболее распространенных уязвимостей 2021 года от Проекта безопасности веб-приложений OWASP, XSS занимает третье место в списке наиболее распространенных векторов атак.

Как смягчить XSS

Проверка ввода

Убедитесь, что ввод пользователя соответствует ожидаемым типам данных, форматам и диапазонам. Удалите или экранируйте потенциально вредоносные символы, чтобы предотвратить инъекции.

JavaScript

 

function validateInput(input) {
  return input.replace(/[^a-zA-Z0-9]/g, ''); // Allow only alphanumeric characters
}

Кодирование вывода

Преобразуйте специальные символы в выводе в их эквиваленты HTML-сущностей, чтобы нейтрализовать потенциально вредоносные скрипты перед рендерингом.

JavaScript

 

function encodeHTML(input) {
  return input.replace(/&/g, '&')
    .replace(/</g, '<')
    .replace(/>/g, '>')
    .replace(/"/g, '"')
    .replace(/'/g, ''');
}

Кликджекинг

Кликджекинг — это обманный атака, которая заставляет пользователей кликать на элемент, с которым они не намерены взаимодействовать. Эта техника включает в себя встраивание легитимного сайта в вредоносный — часто с использованием невидимого или вводящего в заблуждение HTML <iframe> — чтобы перехватить действия пользователя. В результате злоумышленники могут украсть учетные данные для входа, получить несанкционированные разрешения или даже обмануть пользователей, заставив их незаметно установить вредоносное ПО.

Один из распространенных способов добиться этого — использовать CSS для добавления перекрывающей кнопки с opacity, установленным почти на 0. Это заставляет пользователя нажимать на непреднамеренную кнопку или ссылку.

Как предотвратить кликджекинг

X-Frame-Options указывает браузеру, может ли сайт быть встроен в iframe. Он имеет три варианта:

  1. DENY — полностью предотвращает отображение страницы в iframe
  2. SAMEORIGIN — позволяет встраивать страницу только в том случае, если запрос исходит из того же домена
  3. ALLOW-FROM — позволяет встраивать страницу только с конкретного, доверенного домена

В Node.js вы можете использовать helmet, чтобы установить эти параметры, как показано ниже:

JavaScript

 

const helmet = require("helmet");
const app = express();
app.use(
  helmet({
    xFrameOptions: { action: "sameorigin" },
  }),
);

Эффективная защита от кликджекинга заключается в реализации заголовка Политики безопасности контента (CSP). CSP предоставляет детальный контроль над тем, как и где может быть встроен контент, предотвращая несанкционированное фреймирование.

Чтобы снизить риски кликджекинга, включите директиву frame-ancestors в ваш заголовок CSP. Например:

HTML

 

Content-Security-Policy: frame-ancestors 'self' https://www.example.org;

Эта политика гарантирует, что защищенный документ может быть встроен только своим собственным источником ('self') и явно разрешенными доменами, такими как example.org. Она блокирует все несанкционированные попытки фреймирования контента, защищая пользователей от атак кликджекинга.

Примечание: Если и frame-ancestors, и X-Frame-Options установлены, то браузеры, поддерживающие frame-ancestors, проигнорируют X-Frame-Options.

Межсайтовая подделка запросов (CSRF)

CSRF (иногда также называется XSRF) использует доверие, которое сайт имеет к браузеру пользователя, делая несанкционированные запросы от имени пользователя. Злоумышленники обманывают пользователей, заставляя их выполнять действия без их ведома, что может привести к утечкам данных или нежелательным транзакциям. Несколько примеров: обновление личных данных жертвы, инициирование перевода средств с банковского счета жертвы или даже перенаправление доставки посылки на другой адрес.

Рассмотрим конкретный пример этого. Вы посещаете сайт вашего банка и вошли в свою учетную запись. Допустим, вы получаете электронное письмо о розыгрыше, притворяющееся вашим банком. Ссылка ведет на, казалось бы, безобидную веб-страницу. За кулисами срабатывает POST-запрос, который отправляется в законное банковское приложение.

PowerShell

 

curl --location --request POST 'https://acmebank.com/transfer?routing=852363&fromAccountNumber=123456789&toAccountNo=987654321' \
--header 'Cookie: session=acmebanksessionvalue'

На стороне приложения acmebank.com тег “script” отправляет форму, как только пользователь загружает страницу, без какой-либо валидации со стороны пользователя или даже без его ведома о происходящем, как показано ниже.

HTML

 

<html>
  <body>
    <form action="https://acmebank.com/transfer" method="POST">
      <input type="hidden" routing="852363" fromAccountNo="123456789" toAccountNo="987654321" amount="5000" />
    </form>
    <script>
  	window.addEventListener("DOMContentLoaded", () => {
    document.querySelector("form").submit();
  	});
	</script>
  </body>
</html>

Форма выше создает следующий запрос к фактическому приложению, acmebank. Запрос содержит сессионный cookie законного пользователя, но содержит наш номер банковского счета! Поскольку ваша сессия с банком все еще активна, перевод суммы пройдет, если не предусмотрена другая валидация.

Как защититься от CSRF

Установите атрибут SameSite в значение Strict. Это управляет тем, отправляется ли cookie с межсайтовыми запросами.

  • Такие сессионные cookie должны иметь короткий срок действия. Требуйте повторной аутентификации для чувствительных действий, чтобы снизить риски.

Используйте токены, уникальные для сеанса CSRF. Этот токен затем может быть включен в форму, которую отправляет браузер. Для каждого запроса сервер сравнивает токен, отправленный клиентом, с его сохраненным значением для сеанса. Используйте библиотеку csrf-csrf для настройки уникальных токенов.

Кража данных сеанса

Перехват сеанса происходит, когда злоумышленник крадет токен сеанса пользователя, позволяя ему выдавать себя за пользователя и получать несанкционированный доступ к его учетной записи.

Как предотвратить перехват сеанса

Используйте безопасные файлы cookie

Установите флаги Secure и HttpOnly для файлов cookie сеанса, чтобы предотвратить несанкционированный доступ. Установка атрибута Secure предотвращает передачу файлов cookie сеанса в открытом виде и позволяет их передавать только через защищенные соединения HTTPS. Установка атрибута Http-Only обеспечиваетбраузеру запрет на доступ к файлу cookie из DOM что предотвращает доступ к файлу cookie со стороны клиентских скриптовых атак, направленных на получение доступа к хранящимся в них чувствительным данным.

Включите многофакторную аутентификацию (MFA)

Добавьте дополнительный уровень безопасности для проверки пользователей. Это очень распространенный метод, с которым вы столкнетесь в большинстве защищенных приложений. Легкие интеграции доступны через такие провайдеры, как Okta и Duo.

Реализуйте истечение сессии

Автоматически завершайте неактивные сессии, чтобы сократить окна для атак.

Практики кодирования и инструменты для высокого уровня безопасности

Сканирование уязвимостей

Сканер уязвимостей поддерживает безопасность вашего приложения. Сканирование ваших библиотек, сети, приложений и устройств помогает выявить слабые места, которые могут использовать злоумышленники. Инструменты, такие как Snyk и Sonarqube, могут легко интегрироваться в кодовые базы JavaScript. Эти инструменты работают параллельно с известными списками уязвимостей, поддерживаемыми OWASP. С безупречной интеграцией в процесс разработки эти сканеры предоставляют разработчикам и командам безопасности реальное и точное представление о уязвимостях кода и способы их устранения.

Тестирование на проникновение и оценка

Разработчики могут принять практики тестирования на проникновение, чтобы активно исследовать и эксплуатировать потенциальные уязвимости в приложении. Этические хакеры симулируют атаки реального мира для оценки уровня безопасности веб-приложений путем манипулирования кодом JavaScript и взаимодействия с пользователем.

Для достижения этой цели разработчики могут написать пользовательский JS-код для имитации сценариев, либо воспользоваться специализированными инструментами тестирования на проникновение, которые используют JavaScript для автоматизации процесса сканирования общих уязвимостей, таких как XSS, с использованием OWASP ZAP. Более подробную информацию о тестировании на проникновение можно найти в официальном руководстве OWASP.

Брандмауэр веб-приложений (WAF)

По мере роста приложений увеличивается и веб-трафик, что увеличивает уязвимость к атакам. Внедрение брандмауэра веб-приложений (WAF) помогает защититься от злонамеренного трафика путем фильтрации и мониторинга HTTP-запросов. Это включает интеграцию с поставщиками сторонних брандмауэров, такими как Cloudflare или AWS WAF. С помощью WAF можно определить правила, такие как:

  • Страна или географическое местоположение, откуда поступают запросы.
  • IP-адрес, диапазон CIDR и доменные имена, откуда поступают запросы.
  • Ограничение длины запроса и параметров запроса для предотвращения атак внедрения.
  • SQL-код, склонный быть злонамеренным. Злоумышленники пытаются извлечь данные из вашей базы данных, внедряя злонамеренный SQL-код в веб-запрос. Это известно как SQL-инъекция.
  • Обнаружение и блокирование встроенных скриптов, которые могут быть частью атак XSS.

WAF также может помочь смягчить атаки распределенного отказа в обслуживании (DDoS), обеспечивая доступность приложения.

Защита целостности данных

Реализация надежных мер по обеспечению целостности данных необходима при хранении или доступе к защищенной информации. Лучшие практики включают:

  • Наложение строгих политик паролей и поощрение использования менеджера паролей. Кроме того, поощряйте ваших пользователей использовать менеджер паролей, чтобы они могли использовать более сложные пароли и не беспокоиться о их запоминании (Используйте LastPass или 1Password).
  • Защита от атак методом перебора на страницах входа с ограничением скорости, блокировкой учетных записей после определенного числа неудачных попыток и вызовами CAPTCHA.
  • Используя заголовки HTTP, такие как:

Заключение

Безопасность JavaScript — это непрерывный процесс, который требует проактивного подхода для защиты приложений от развивающихся угроз. Реализация лучших практик, таких как валидация ввода, заголовки CSP, безопасное управление сессиями и сканирование уязвимостей, может значительно снизить риск атак, таких как XSS, CSRF и перехват сессий.

Кроме того, использование инструментов безопасности, таких как WAF, тестирование на проникновение и многофакторная аутентификация, укрепляет устойчивость приложений. Приоритизация безопасности на каждом этапе разработки позволит разработчикам создавать надежные приложения, вызывающие доверие пользователей, которые останутся защищенными от современных киберугроз.

Source:
https://dzone.com/articles/enhancing-security-in-javascript