6 ошибок безопасности в JavaScript, о которых важно помнить

Авторка: Катерина Иваненко, Invicti Brand Manager

JavaScript – мощный и широко распространенный язык программирования для создания веб-приложений. Однако в нем могут совершать типичные ошибки безопасности, способные повысить риск успешных кибератак.

Отсутствие Content Security Policy (CSP)

Content Security Policy (CSP) – это HTTP-заголовок, позволяющий владельцу сайта указать, из каких источников разрешена загрузка контента (скриптов, стилей, изображений и т.п.).

Он защищает от атак типа XSS (межсайтовый скриптинг) и некоторых инъекций, поэтому его присутствие важно.

Чтобы избежать этой ошибки, нужно всегда внедрять строгие CSP-заголовки, например default-src ‘self’; script-src ‘self’; object-src ‘none’.

Небезопасное хранение данных в LocalStorage/SessionStorage

Хранение конфиденциальных данных (например, токенов) в незашифрованном виде в LocalStorage/SessionStorage доступно через JavaScript.

К примеру, это может привести к краже токенов, XSS и несанкционированному доступу к аккаунту.

Лучше хранить чувствительные данные в HTTP-only cookies с атрибутами Secure и SameSite. Они не доступны для JavaScript, а следовательно не уязвимы к, например, XSS.

Отсутствие проверки входящих данных пользователя

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

Это может привести к критическим уязвимостям, таким как SQL-инъекции, инъекции системных команд, XSS-атаки, а также несанкционированное создание или модификация данных.

Необходимо обязательно реализовывать валидацию входящих данных и рассматривать любые данные, полученные от пользователя как потенциально опасные.

Хранение CSRF-токенов в cookie

Если аутентификация пользователей в приложении основана на cookie, злоумышленник может получить доступ к cookie сессии и действовать от его имени. Такие CSRF-атаки являются одними из самых распространенных уязвимостей JavaScript.

Эту проблему можно избежать, передавая дополнительный токен с каждым HTTP-запросом. Поскольку CSRF-токены не хранятся в cookie, злоумышленник не может перехватить их. Эти токены можно добавлять к формам, AJAX-вызовам, HTTP-заголовкам, скрытым полям и другим элементам.

Ниже приведен пример CSRF-токена из проекта OWASP, который можно добавить в форму как скрытое поле:

**
<form action="/transfer.do" method="post">
<input type="hidden" name="CSRFToken" value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjJjZDE1ZDZMGYwMGEwOA==">
[...]
</form>
**

Небезопасная передача cookie

Чтобы дополнительно повысить безопасность cookie, следует убедиться, что они передаются только через защищенный протокол, как HTTPS, шифрующий данные между клиентом и сервером. Можно принудительно требовать использования защищенного протокола, добавляя флажок ;secure к свойству Document.cookie, которое предоставляет доступ к cookie документа.

Его можно использовать вместе с флажком ;samesite, который позволяет контролировать передачу cookie при межсайтовых запросах. Например, применение значения lax дает возможность передавать cookie при всех запросах в пределах одного сайта и навигации верхнего уровня методом GET. Это позволяет осуществлять отслеживание пользователя, но одновременно предотвращает значительную часть CSRF-атак.

Использование устаревших или уязвимых библиотек

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

Возможные последствия включают произвольное выполнение кода (Remote Code Execution), межсайтовый скриптинг (XSS), подделку межсайтовых запросов (CSRF) и другие атаки.

Рекомендуется использовать инструменты для анализа программных компонентов (Software Composition Analysis, SCA), как Mend.io, для обнаружения уязвимых библиотек.

Дополнительная рекомендация

Для проверки безопасности своих веб-сайтов важно использовать веб-сканеры DAST, такие, как Invicti. Решение эффективно находит все уязвимости и подтверждает существование ключевых из них.

Чтобы убедиться в этом, вы можете бесплатно протестировать Invicti, для этого обратитесь к нам удобным для вас способом.

Подписаться на новости