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

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

Фон

Когда Райан Дал представил Node примерно в 2009 году, экосистема javascript пережила настоящий бум. Ведущие компании, такие как Linkedin, Walmart, Paypal, ebay, Uber и многие другие, начали его внедрять. Положительным моментом в этом было то, что теперь мы могли использовать один язык как для внутреннего, так и для внешнего интерфейса нашего приложения. Наряду с его популярностью возникли некоторые проблемы с безопасностью для Node.

Npm - одна из крупнейших экосистем пакетов с открытым исходным кодом в мире. С более чем полмиллионом пакетов и 500 новыми модулями ежедневно. Мы загружаем эти пакеты более 3 миллиардов раз в неделю. В этом масштабе безопасность экосистемы является одним из важнейших приоритетов. Пакеты в сообществе открытого исходного кода обнаружили некоторые риски безопасности.

Вашим злоумышленникам нужно сделать все правильно только один раз, в то время как вы, как разработчик приложения, должны быть правы все время.
- Source NA

Потребность в безопасности

В 2015 году пакет с именем rimrafall (на самом деле раньше был пакет с именем rimraf), опубликованный в npm, был признан вредоносным и был удален из npm. Другой пакет - валидатор, который звучит похоже на validator.js, тоже оказался угрожающим. Также был обнаружен еще один пакет socketio, который напоминает имя socket.io, а uglifyjs напоминает имя uglify-js.

Решив эти проблемы, npm начали уделять особое внимание безопасности в 2018 году, когда они выпустили npm audit, новую команду, которая выполняет моментальную проверку безопасности дерева зависимостей проекта и создает отчет о безопасности аудита npm. Отчет содержит информацию об уязвимостях безопасности в зависимостях и предоставляет команды npm и рекомендации по дальнейшему устранению неполадок. К счастью, Node.js Security Project и Snyk предоставляют рекомендации по безопасности, и обе компании предлагают платные планы подписки для запуска своих инструментов в средах CI / CD.

Способы защиты нашего приложения

Давайте разберемся, как сделать наше приложение более безопасным. Мы обсудим наиболее распространенные способы обеспечения безопасности. Большинство обсуждаемых элементов подразумевает все языки и фреймворки, а не только NodeJS.

Без использования устаревших пакетов или версий

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

Использование правил безопасности линтера

Нам нужно использовать линтер и плагины, связанные с безопасностью, как eslint-plugin-security. Использование одинаковых этих плагинов помогает нам выявлять уязвимости и проблемы безопасности как можно раньше, когда они кодируются. Это также может помочь сохранить последовательность в практике кода.

Использование строгого режима

С помощью этого флага мы можем ограничить вариант Javascript. Строгий режим - это не просто подмножество: он намеренно имеет семантику, отличную от обычного кода. Это помогает нам устранить некоторые ошибки Javascript, изменив их на ошибки, некоторые ошибки, которые затрудняют оптимизацию, этот режим иногда может работать быстрее, чем идентичный код, который не является строгим режимом, а также запрещает некоторый синтаксис, который, вероятно, будет определен в будущем ECMAScript .

Анализировать статический код

Используя JSHint, JSLint или ESLint, мы можем выявить множество потенциальных проблем на ранней стадии нашего кода.

Использование модуля Helmet

По своему названию он представляет собой предотвращение чего-либо. Helmet помогает нам защитить наше приложение, устанавливая различные HTTP-заголовки, например:

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

Безопасное использование файлов cookie

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

Защита аутентификации

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

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

Использование пакетов для дополнительной безопасности

Доступно множество пакетов, которые могут помочь нам добавить уровень безопасности в наше приложение. Вот некоторые из них:

  • Промежуточное ПО csurf для защиты от подделки межсайтовых запросов (CSRF).
  • Использование инструмента с открытым исходным кодом sqlmap для обнаружения уязвимостей SQL-инъекций в вашем приложении.
  • Использование инструментов nmap и sslyze для проверки конфигурации ваших SSL-шифров, ключей и повторного согласования, а также действительности вашего сертификата.
  • Используйте safe-regex, чтобы убедиться, что ваши регулярные выражения не подвержены атакам типа отказ в обслуживании.

Проверка вводимых пользователем данных

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

Мы можем проверять вводимые пользователем данные, популярная библиотека, которую мы можем использовать, - это joi. Joi - это язык описания схемы объектов и средство проверки для объектов JavaScript.

Обработка ошибок

Столкнувшись с ошибками в коде, мы можем утечь конфиденциальную информацию о базовой инфраструктуре, например: x-Powered-By: Express

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

Избегайте использования операторов eval

Eval - также известный как оператор evil - позволяет выполнять пользовательский код JS во время выполнения. Это не только проблема производительности, но и важная проблема безопасности из-за вредоносного кода JavaScript, который может быть получен в результате ввода данных пользователем. Еще одна языковая функция, которой следует избегать, - это new Function конструктор. setTimeout и setInterval также никогда не следует передавать динамический код JavaScript.

Защита наших регулярных выражений

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

В сочетании с тем фактом, что Node.js является однопоточным по своей природе, с помощью одного пользовательского ввода можно отключить весь сервер. Регулярные выражения, которые могут делать такие вещи, обычно называются злыми регулярными выражениями. Эти выражения содержат: группировку с повторением, внутри повторяющейся группы: повторение или чередование с перекрытием.

Примеры злого регулярного выражения: (a +) +, ([a-zA-Z] +) *, (a | aa) +

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

Npm-audit: запускаем аудит безопасности наших пакетов

Npm-shrinkwrap: эта команда перепрофилирует package-lock.json в доступный для публикации npm-shrinkwrap.json или просто создает новый. Файл, созданный и обновленный этой командой, будет иметь приоритет над любыми другими существующими или будущими package-lock.json файлами.

Requiresafe: проверка возможностей

Retire.js: этот пакет помогает нам обнаруживать использование версий модуля с известными уязвимостями. Просто установите с npm install -g retire. После этого запуск с командой retire будет искать уязвимости в вашем node_modules каталоге.

Express-security: этот пакет специфичен для экспресс-фреймворка. Если в случае, если мы хотим добавить его в ваше приложение, чтобы помочь исследователям сообщать вам об ошибках безопасности.

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

Snyk: он похож на Node Security Project, но его цель - предоставить инструмент, который может не только обнаруживать, но и исправлять связанные с безопасностью проблемы в вашей кодовой базе.

Заключение

Хотя мы не все охватили. Я надеюсь, что эта исследовательская статья помогла вам лучше понять, как работает безопасность в экосистеме Node.js, и какие шаги вы можете предпринять, чтобы сделать свои приложения Node.js более безопасными.

Если вы хотите связаться со мной, вот мой твиттер

Удачного кодирования!

Примечание из JavaScript In Plain English

Мы запустили три новых издания! Проявите любовь к нашим новым публикациям, подписавшись на них: AI на простом английском, UX на простом английском, Python на простом английском - спасибо и продолжайте учиться!

Мы также всегда заинтересованы в продвижении качественного контента. Если у вас есть статья, которую вы хотите отправить в какую-либо из наших публикаций, отправьте нам электронное письмо по адресу [email protected] с вашим именем пользователя Medium, и мы добавим вас в качестве автора. Также сообщите нам, к каким публикациям вы хотите быть добавлены.

Справочные материалы