От автора: JavaScript сегодня используется повсюду. Он работает как в вашем браузере, так и на сервере. Кроме того, JavaScript сильно зависит от сторонних библиотек. Следовательно, для защиты JavaScript необходимо следовать передовым методам, чтобы уменьшить площину атаки. Но как обеспечить безопасность приложений JavaScript? Давайте выясним.
1. Проверки целостности JavaScript
Как фронтенд-разработчик, вы могли использовать теги <script> для импорта сторонних библиотек. Задумывались ли вы о рисках для безопасности, связанных с этим?
Что делать, если сторонний ресурс был взломан?
Да, это может произойти, когда вы отображаете внешние ресурсы на своем сайте. В результате ваш сайт может столкнуться с уязвимостью безопасности.
В качестве меры безопасности вы можете добавить код целостности (также известный как целостность субресурсов — SRI) в свой скрипт следующим образом.
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"> </script>
Атрибут integrity позволяет браузеру проверять загрузку скрипта, чтобы убедиться, что код не будет загружен, если источник был изменен.
Примечание. Тем не менее, вы должны убедиться, что код, на который вы ссылаетесь, изначально не содержит никаких уязвимостей.
2. Распространенные тесты на уязвимости NPM
Я надеюсь, что все вы знаете, что мы можем использовать команду npm audit для обнаружения уязвимостей для всех установленных зависимостей. Она предоставляет отчеты об уязвимостях и исправления для них. Но как часто вы это делаете?
Если мы не автоматизируем это, эти уязвимости будут накапливаться, что затрудняет их исправление. Помните, что некоторые из них могут быть даже критическими, допуская серьезные эксплойты.
В качестве решения вы можете запускать NPM в своем CI для каждого запроса на интеграцию для выявления уязвимостей. Таким образом, вы можете сделать так, чтобы любые уязвимости не остались незамеченными.
Пример отчета аудита безопасности NPM
Однако есть некоторые уязвимости, для устранения которых потребуется вмешательство разработчика вручную.
Дополнительный инструмент на GitHub
Недавно GitHub представил бота с именем Dependabot, чтобы автоматически сканировать зависимости NPM и уведомлять вас по электронной почте с указанием рисков.
Такое письмо я получил для одного из моих проектов
Кроме того, предположим, что вы включили опцию «автоматических исправлений безопасности PRs». В этом случае GitHub отправит автоматический PR для устранения этих проблем, заранее устраняя риски безопасности.
Создавайте и делитесь независимыми компонентами с Bit
Bit — это ультра-расширяемый инструмент, который позволяет создавать по- настоящему модульные приложения с независимо созданными, версионированными и поддерживаемыми компонентами.
Используйте его для создания модульных приложений и систем проектирования, создания и доставки микро-интерфейсов или просто обмена компонентами между приложениями.
3. Не отключайте второстепенные обновления и обновления версий.
Вы когда-нибудь видели символ ^ или ~ перед любой версией пакета NPM? Эти символы указывают на автоматическое повышение версии для дополнительных версий и версий исправлений (в зависимости от символа).
Технически минорная версия и версия исправления обратно совместимы, что снижает риск внесения ошибок в приложение.
Поскольку большинство сторонних библиотек выпускают оперативные исправления уязвимостей в виде патчей версии исправлений, по крайней мере включение автоматических обновлений помогает снизить риски безопасности.
4. Выполняйте валидации, чтобы избежать инъекций.
Как показывает практика, мы никогда не должны полагаться только на проверки на стороне клиента, поскольку злоумышленники могут изменить их по мере необходимости. Однако некоторые инъекции JavaScript могут быть отслежены, если для каждого ввода есть валидации.
Например, если вы введете в поле комментария что-нибудь с кавычками, например <script></script>, эти кавычки будут заменены на двойные — <<script>><</script>>. Тогда введенный код JavaScript не будет выполнен. Это называется межсайтовым скриптингом (XSS).
Точно так же есть несколько других распространенных способов внедрения JavaScript.
Используйте консоль разработчика, чтобы вставить или изменить JavaScript.
Ввод «javascript: SCRIPT» в адресную строку.
Предотвращение JS-инъекций важно для обеспечения безопасности вашего приложения. Как я уже упоминал ранее, наличие валидации — один из способов предотвратить это. Например, перед сохранением любого ввода в базу данных замените все < на <, а все > на >.
Политики безопасности контента (CSP) — еще один способ избежать вредоносных инъекций. Использовать CSP довольно просто.
Content-Security-Policy: trusted-types; Content-Security-Policy: trusted-types 'none'; Content-Security-Policy: trusted-types <policyName>; Content-Security-Policy: trusted-types <policyName> <policyName> 'allow-duplicates';
Для получения дополнительной информации о CSP обратитесь к этим рекомендациям.
5. Всегда оставляйте включенным строгий режим.
Включение строгого режима ограничивает возможность написания небезопасного кода. Кроме того, включить этот режим несложно. Это так же просто, как добавить следующую строку в качестве первой в ваши файлы JavaScript.
use strict
Когда включен строгий режим:
Он указывает на ошибки, о которых раньше ничего не говорилось.
Исправляет ошибки, мешающие движкам JavaScript выполнять оптимизацию.
Запрещает использование зарезервированных слов, которые могут быть определены в будущих версиях ECMAScript.
Выдает ошибки при выполнении «небезопасных» действий (например, при получении доступа к глобальному объекту).
Все современные браузеры годами поддерживают строгий режим. Если браузер не поддерживает строгий режим, выражение просто игнорируется.
6. Делайте статический анализ (Linting) своего кода
Линтеры выполняют статический анализ вашей кодовой базы. Это помогает установить качество и избежать распространенных ошибок. Поскольку качество идет рука об руку с безопасностью, Linting помогает снизить риски безопасности. Вот несколько популярных инструментов, которые мы используем для JavaScript.
JSLint
JSHint
ESLint
Кроме того, такие инструменты, как SonarCloud, также можно использовать для выявления известных уязвимостей безопасности. Отчет SonarCloud будет выглядеть следующим образом.
Примечание. Как вы можете видеть на изображении выше, в нем есть раздел безопасности, в котором показаны уязвимости и точки доступа.
7. Минимизируйте и детализируйте свой код
Злоумышленники чаще всего будут пытаться понять ваш код, чтобы прорваться через него. Следовательно, наличие читаемого исходного кода в производственной сборке увеличивает поверхность атаки.
Как правило, если вы минимизируете и превращаете свой код JavaScript в некрасивый, сложно использовать уязвимости в написанном вами коде.
Однако, если вам нужны крайние меры, чтобы скрыть ваш код от пользователей / клиентов, его следует хранить на стороне сервера, не отправляя его в браузер вообще.
Резюме
Сосредоточение внимания на безопасности очень важно, особенно в приложениях JavaScript, чтобы сделать ваше приложение безопасным. С минимальным набором инструментов вы можете защитить JavaScript для предотвращения распространенных атак.
Кроме того, предположим, вы ищете продвинутые решения. В этом случае, есть такие инструменты, как Snyk, WhiteSource, которые специализируются на сканировании уязвимостей в коде и автоматизации его непрерывных интеграций. Спасибо за чтение!
Автор: Viduni Wickramarachchi
Источник: blog.bitsrc.io
Редакция: Команда webformyself.
Читайте нас в Telegram, VK, Яндекс.Дзен