- PVSM.RU - https://www.pvsm.ru -
В наши дни веб-сервисы постоянно подвергаются самым разным атакам. Поэтому безопасность — это то, о чём стоит помнить на всех этапах жизненного цикла проектов. Авторы материала, перевод которого мы сегодня публикуем, поддерживают репозиторий [1] на GitHub, содержащий около 80 рекомендаций по обеспечению безопасности приложений, работающих на платформе Node.js. В этом материале, базой для которого послужило множество публикаций, посвящённых безопасности, собрано более двух десятков рекомендаций, касающихся Node.js, и некоторые советы общего характера. При этом данный материал покрывает топ-10 уязвимостей из списка проекта OWASP.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 2 [в закладки] 23 рекомендации по защите Node.js-приложений - 2](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-2.png)
В ходе разработки используйте плагин для линтера, ориентированный на безопасность, такой, как eslint-plugin-security [3]. Это позволяет выявлять уязвимости и проблемы безопасности очень рано — в момент написания соответствующего кода. Такой подход помогает находить слабые места в безопасности программ. Среди них — использование команды eval, вызов дочерних процессов, импорт модулей с передачей в соответствующую команду чего-то, отличающегося от строкового литерала (скажем, некоей строки, сформированной на основе данных, переданных на сервер пользователем).
→ Вот [4] полезный материал о правилах линтера
Адам Болдуин [5] говорит о линтинге следующее: «Линтер не должен быть всего лишь инструментом, педантично следящим за применением правил, касающихся количества используемых пробелов, расстановки точек с запятой и использования команды eval. ESLint даёт разработчику мощную платформу, позволяющую обнаруживать в коде широкий спектр потенциально опасных шаблонов и устранять их. Речь идёт, например, о регулярных выражениях, о проверке пользовательского ввода, и так далее. Я полагаю, что линтер даёт разработчикам, которых заботят вопросы безопасности, новый мощный инструмент, которому стоит уделить внимание».
То, что во время разработки выглядит как мелкий недочёт в системе безопасности, в продакшне становится серьёзной уязвимостью. Кроме того, если все разработчики проекта не следуют единообразным правилам безопасности при работе с кодом, это может привести к появлению в нём уязвимостей, или, например, к попаданию конфиденциальных данных в общедоступные репозитории.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 3 [в закладки] 23 рекомендации по защите Node.js-приложений - 3](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-3.png)
DoS-атаки весьма популярны среди злоумышленников, проводить их сравнительно просто. Реализовать систему ограничения количества запросов к приложению можно с использованием внешнего сервиса, такого, как облачный балансировщик нагрузки, облачный файрвол, nginx-сервер, или, для небольших приложений, не являющихся критически важными, с использованием промежуточного ПО для ограничения числа запросов вроде express-rate-limit [6].
→ Вот [7] материал о реализации системы ограничения частоты запросов к серверу
Приложение, в котором не предусмотрена система ограничения количества одновременных запросов, может быть подвергнуто атаке, которая приведёт к его отказу. Это выражается в том, что пользователи такого приложения либо будут испытывать затруднения при работе с ним, либо совсем не смогут с ним взаимодействовать.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 4 [в закладки] 23 рекомендации по защите Node.js-приложений - 4](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-4.png)
Никогда не храните конфиденциальные данные в виде обычного текста в конфигурационных файлах или в коде. Вместо этого используйте системы управления конфиденциальными данными вроде продуктов Vault или систем Kubernetes/Docker Secrets, либо применяйте для хранения таких данных переменные среды. Конфиденциальные данные, сохранённые в системе контроля версий, должны быть зашифрованы, нужно принять меры по их безопасному хранению и использованию. Среди таких мер — применение динамических ключей, использование сроков действия паролей, аудит безопасности, и так далее. Используйте системы для проверки кода перед коммитом или перед отправкой в репозиторий для предотвращения случайной отправки в общедоступный репозиторий конфиденциальных данных.
→ Вот [8] материал об управлении конфиденциальными данными
Даже если код хранится в закрытом репозитории, однажды он, по ошибке, может стать общедоступным. В этот момент все хранящиеся в нём конфиденциальные данные превратятся во всеобщее достояние. В результате доступ третьих лиц к репозиторию с кодом непреднамеренно приведёт к тому, что они получат доступ и к связанным с ним системам (базы данных, API, сервисы, и так далее).
![[в закладки] 23 рекомендации по защите Node.js-приложений - 5 [в закладки] 23 рекомендации по защите Node.js-приложений - 5](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-5.png)
Для того чтобы предотвратить SQL/NoSQL-инъекции и другие подобные атаки, всегда применяйте ORM/ODM-библиотеки или механизмы СУБД, направленные на очистку данных, или поддерживающие именованные или индексированные параметризованные запросы, и занимающиеся проверкой того, что поступает от пользователя. Никогда не пользуйтесь, для внедрения неких значений в тексты запросов, лишь шаблонными строками JavaScript, или конкатенацией строк, так как такой подход открывает ваше приложение для широкого спектра уязвимостей. Все достойные уважения библиотеки для Node.js, используемые для работы с данными (например, Sequelize [9], Knex [10], mongoose [11]) содержат встроенную защиту от атак путём внедрения кода.
→ Вот [12] материал о предотвращении инъекций с использованием ORM/ODM-библиотек
Использование в запросах непроверенных и неочищенных данных, получаемых от пользователя, может привести к атаке путём внедрения оператора при работе с NoSQL-базой данных вроде MongoDB. Если не использовать систему очистки данных или ORM-библиотеку при работе с SQL-базой данных, это приведёт к возможности осуществления атаки путём SQL-инъекции, что создаёт огромную брешь в системе безопасности приложения.
Процесс Node аварийно завершает работу при возникновении необработанной ошибки. Но во многих рекомендациях, отражающих передовой опыт разработки для Node, рекомендуется завершать процессы даже тогда, когда возникшая ошибка была перехвачена и обработана. Express, например, аварийно завершится при возникновении любой асинхронной ошибки — если только маршруты не будут обёрнуты в выражения catch. Этот факт открывает атакующим весьма привлекательную возможность. Они, обнаружив, что при поступлении определённого запроса процесс аварийно завершается, начинают отправлять ему именно такие запросы. Нет рекомендации, которая позволила бы одним махом решить эту проблему, однако, некоторые приёмы могут её смягчить. Так, при завершении процесса из-за необработанной ошибки, нужно уведомлять администратора, давая такому уведомлению высший приоритет важности. Надо проверять то, что приходит процессу в запросах и избегать ситуаций аварийного завершения процесса из-за запросов, которые, случайно или намеренно, сформированы неправильно. Все маршруты нужно оборачивать в выражения catch и настроить систему так, чтобы, если причиной ошибки является запрос, процесс не завершался бы аварийно (в противоположность тому, что происходит на глобальном уровне приложения).
Проанализируем следующую ситуацию. Имеется множество Node.js-приложений. Что произойдёт, если мы начнём отправлять им POST-запросы с пустым JSON в виде тела запроса? Это приведёт к тому, что многие из этих приложений аварийно завершатся.
Теперь, если бы мы играли роль злоумышленников, нам, для того, чтобы приложения продолжали давать сбои, достаточно было бы продолжать отправлять им подобные запросы.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 6 [в закладки] 23 рекомендации по защите Node.js-приложений - 6](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-6.png)
Приложение должно использовать HTTP-заголовки, ориентированные на безопасность, для того, чтобы не дать злоумышленникам прибегнуть к таким распространённым приёмам совершения атак, как межсайтовый скриптинг (XSS), кликджекинг, и другие. Настроить заголовки несложно с использованием специальных модулей, таких, как helmet [13].
→ Вот [14] материал об использовании безопасных заголовков
Если безопасные HTTP-заголовки не используются, злоумышленники смогут выполнять атаки на пользователей ваших приложений, что ведёт к огромным уязвимостям.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 7 [в закладки] 23 рекомендации по защите Node.js-приложений - 7](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-7.png)
В экосистеме NPM проекты, имеющие множество зависимостей — это весьма распространённое явление. Зависимости всегда нужно контролировать, учитывая обнаружение новых уязвимостей. Используйте для обнаружения, мониторинга и исправления уязвимых зависимостей инструменты вроде npm audit [15], nsp [16] или snyk [17]. Встройте эти инструменты в свою систему непрерывной интеграции. Это позволит вам обнаруживать уязвимые зависимости до того, как они попадут в продакшн.
→ Вот [18] материал о безопасности зависимостей проектов
Злоумышленник может определить используемый в проекте веб-фреймворк и провести атаки на все его известные уязвимости.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 8 [в закладки] 23 рекомендации по защите Node.js-приложений - 8](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-8.png)
Пароли или другие конфиденциальные данные (ключи API, например) нужно хранить, обрабатывая их криптографическими функциями с применением «соли», такими, как Bcrypt. Стоит использовать именно нечто подобное, а не стандартный модуль Node.js crypto из соображений безопасности и производительности.
→ Вот [19] материал о Bcrypt
Пароли или некие конфиденциальные данные, которые хранятся без применения соответствующих мер их защиты, уязвимы к атакам методом грубой силы и к атакам по словарю, которые, в итоге, приводят к раскрытию таких данных.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 9 [в закладки] 23 рекомендации по защите Node.js-приложений - 9](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-9.png)
Если в браузер пользователя отправляются некие данные из недоверенного источника, то, даже если они должны быть просто выведены на экран, такие данные могут представлять собой код, который может быть выполнен. Обычно подобное называют межсайтовым скриптингом (XSS). Снизить риск возможности проведения подобных атак можно, используя специальные библиотеки, которые обрабатывают данные так, что они не могут быть выполнены. Это называют кодированием или экранированием данных.
→ Вот [20] материал об экранировании выходных данных
Если не заботиться об экранировании данных, атакующий может, например, сохранить в вашей базе данных вредоносный JavaScript-код, который может быть передан клиентам в неизменном виде и запущен.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 10 [в закладки] 23 рекомендации по защите Node.js-приложений - 10](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-10.png)
Контролируйте содержимое тел входящих запросов, проверяя, соответствуют ли они тому, что вы ждёте увидеть в подобных запросах. Если запрос выглядит не так, как ожидается, быстро прекращайте его обработку. Для того чтобы избежать трудоёмкой операции написания кода проверки запросов для каждого маршрута, вы можете воспользоваться легковесными JSON-средствами для валидации данных, такими, как jsonschema [21] или joi [22].
→ Вот [23] материал о проверке входящих JSON-данных
Если сервер радушно принимает любые запросы, не осуществляя их тщательной проверки, это значительно увеличивает поверхность атаки приложения и вдохновляет злоумышленников на то, чтобы, опробовав множество запросов, найти такие из них, которые приводят к «падению» системы.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 11 [в закладки] 23 рекомендации по защите Node.js-приложений - 11](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-11.png)
При использовании JWT-токенов (например, если вы работаете с Passport.js [24]), по умолчанию, нет стандартного механизма для отзыва привилегий на доступ к системе для уже выпущенных токенов. Если даже вы обнаружили, что некий пользователь делает что-то явно ненормальное, у вас нет способа, через механизм токенов, закрыть ему доступ в систему, до тех пор, пока у него имеется действительный токен. Смягчить эту проблему можно, реализовав чёрный список недоверенных токенов, валидация которых производится при каждом запросе.
→ Вот [25] материал о чёрных списках JWT-токенов
Попавшие не в те руки токены могут быть использованы злоумышленником. Он сможет получить доступ к приложению и выдать себя за обычного пользователя — владельца токена.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 12 [в закладки] 23 рекомендации по защите Node.js-приложений - 12](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-12.png)
В приложениях, основанных на express, для защиты от атак методом грубой силы и от атак по словарю, стоит использовать соответствующее промежуточное ПО, такое, как express-brute [26]. Подобным образом нужно защищать особо важные маршруты, такие, как /admin или /login. Защита должна быть основана на анализе свойств запросов, таких, как использованное в запросе имя пользователя или другие идентификаторы, такие, как параметры тела запроса.
→ Вот [27] материал об ограничении количества попыток входа в систему
Если приложение не ограничивает количество попыток входа в систему, то атакующий может, в автоматическом режиме, отправить вашей системе неограниченное количество запросов на вход, например, пытаясь получить доступ к привилегированной учётной записи.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 13 [в закладки] 23 рекомендации по защите Node.js-приложений - 13](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-13.png)
Чрезвычайно распространён сценарий, при использовании которого Node.js запускается от имени root-пользователя с неограниченными привилегиями. Например, именно так всё по умолчанию настроено в контейнерах Docker. Рекомендуется создавать пользователя, не обладающего root-правами, и либо встраивать его в образ Docker, либо запускать процесс от имени этого пользователя, вызывая контейнер с флагом -u username.
→ Вот [28] материал о запуске Node.js от имени пользователя, не обладающего root-правами
Если Node.js выполняется под учётной записью root-пользователя, то атакующий, который смог запустить на сервере некий скрипт, получает неограниченные возможности на локальной машине. Скажем, он может поменять настройки iptable и перенаправить трафик на собственный компьютер.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 14 [в закладки] 23 рекомендации по защите Node.js-приложений - 14](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-14.png)
Чем больше объём данных, находящихся в теле запроса, тем сложнее однопоточному серверу такой запрос обработать. Использование запросов больших размеров даёт атакующему возможность завалить сервер ненужной работой и без отправки ему огромного числа запросов (то есть, не выполняя DoS/DDoS-атаку). Снизить риск подобных атак можно, ограничивая размер тел входящих запросов на некоей пограничной системе (на файрволе или на балансировщике нагрузки), или настроив body-parser [29] express на приём только пакетов, содержащих небольшой объём данных.
→ Вот [30] материал об ограничении объёмов данных, передаваемых в запросах
Если не ограничивать объём данных, передаваемых в запросах, злоумышленник может загрузить приложение обработкой больших запросов. В это время оно не сможет решать те задачи, на которые оно рассчитано. Это ведёт к падению производительности и делает приложение уязвимым для DoS-атак.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 15 [в закладки] 23 рекомендации по защите Node.js-приложений - 15](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-15.png)
Функция eval — это зло, так как она позволяет выполнять произвольный JS-код, переданный ей во время выполнения программы. Причём, речь тут далеко не только о том, что этот код может замедлить работу приложения. Эта функция представляет собой серьёзную угрозу безопасности, так как в неё может попасть вредоносный JS-код, отправленный на сервер злоумышленником.
Кроме того, стоит избегать конструктора new Function. Функциям setTimeout и setInterval никогда не нужно передавать динамически сформированный JS-код.
→ Вот [31] материал об eval
Если некто найдёт способ передать вредоносный JS-код, в виде текста, функции eval или какому-то другому подобному механизму JS, у него будет полный доступ к странице, ко всему тому, что можно делать с помощью JavaScript. Эту уязвимость часто связывают с XSS-атаками.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 16 [в закладки] 23 рекомендации по защите Node.js-приложений - 16](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-16.png)
Регулярные выражения, хотя они и удобны, несут в себе угрозу для JavaScript-приложений в целом, и, в частности, для платформы Node.js. Обработка с помощью регулярного выражения того, что пришло от пользователя, может создать огромную нагрузку на процессор. Например, обработка регулярных выражений может быть настолько неэффективной, что проверка десяти слов может заблокировать цикл событий на несколько секунд и сверх меры нагрузить процессор. Поэтому лучше всего пользоваться сторонними пакетами для проверки строковых данных, вроде validator.js [32], вместо написания собственных регулярных выражений. Можно воспользоваться пакетом safe-regex [33] для обнаружения уязвимых шаблонов регулярных выражений.
→ Вот [34] материал о борьбе с вредоносными регулярными выражениями
Плохо написанные регулярные выражения могут быть подвержены особому виду DoS-атак, в ходе которых полностью блокируется цикл событий. Например, в ноябре 2017 было обнаружено, что популярный пакет moment уязвим к подобным атакам.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 17 [в закладки] 23 рекомендации по защите Node.js-приложений - 17](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-17.png)
Избегайте импорта файлов, путь к которым задаётся в виде параметра, исходя из соображения, в соответствии с которым этот параметр может быть задан на основе данных, поступающих от пользователя. Это правило можно расширить, включив сюда и, в целом, доступ к файлам (с использованием fs.readFile()), и доступ к любым другим важным ресурсам с использованием параметров, получаемых от пользователя. Использование eslint-plugin-security [35] позволяет очень рано выявлять подобные небезопасные паттерны.
→ Вот [36] материал о безопасной загрузке модулей
Данные, отправленные на сервер злоумышленником, могут оказаться в параметрах, которые отвечают за импорт неких файлов, среди которых может оказаться вредоносный файл, заранее загруженный на сервер. Эти данные могут быть использованы и для доступа к уже имеющимся на компьютере системным файлам.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 18 [в закладки] 23 рекомендации по защите Node.js-приложений - 18](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-18.png)
При возникновении необходимости выполнения внешнего кода, попадающего в приложение во время его работы (например, некоего плагина), используйте «песочницу», которая изолирует и защищает основной код от кода плагина. Подобную среду можно создать, используя выделенный процесс (cluster.fork()), бессерверное окружение или выделенный npm-пакет, действующий как песочница.
→ Вот [37] материал о выполнении небезопасного кода в песочнице
Вредоносный код, содержащийся в плагине, может атаковать приложение огромным множеством способов. Среди них — бесконечные циклы, перегрузка памяти, доступ к переменным среды, содержимое которых надо держать в секрете.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 19 [в закладки] 23 рекомендации по защите Node.js-приложений - 19](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-19.png)
Избегайте, когда это возможно, использования дочерних процессов. Если же без этого не обойтись, то проверяйте и очищайте данные, переданные пользователем и используемые при запуске таких процессов для того, чтобы снизить риск атаки на командную оболочку. При этом отдавайте предпочтение команде child_process.execFile, которая, по умолчанию, не запускает командную оболочку, создавая новый процесс который соответствует запущенному исполняемому файлу, переданному ей.
→ Вот [38] материал о мерах безопасности, необходимых для работы с дочерними процессами
Необдуманное использование дочерних процессов может привести к удалённому выполнению команд или к атаке на командную оболочку, когда данные, передаваемые пользователем на сервер, в неочищенном виде, передаются системным командам.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 20 [в закладки] 23 рекомендации по защите Node.js-приложений - 20](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-20.png)
Интегрированный обработчик ошибок express, по умолчанию, скрывает сведения об ошибках. Однако, велики шансы того, что вы реализовали собственную систему обработки ошибок, создали собственный объект Error (многие рекомендуют именно такой подход). Если вы так поступили, проверьте, чтобы клиенту не отправлялся бы весь такой объект, так как он может содержать какие-либо данные приложения, которые не должны попадать в чужие руки.
→ Вот [39] материал о сокрытии сведений об ошибках от клиентов
Данные приложения, которые нельзя раскрывать посторонним, такие, как пути к файлам на сервере, сведения об используемых сторонних модулях и другие подробности о внутреннем устройстве приложения, которыми может воспользоваться атакующий, могут оказаться среди данных трассировки стека.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 21 [в закладки] 23 рекомендации по защите Node.js-приложений - 21](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-21.png)
Каждый шаг в цепочке задач, из которых состоит процесс разработки веб-проекта, должен быть защищён многофакторной аутентификацией (MFA, multi-factor authentication). Доступ к npm или Yarn может быть весьма интересен атакующему, который может узнать учётные данные разработчика. Используя их, если речь идёт о внутренних ресурсах, он может встраивать вредоносный код в библиотеки, которые используются в проектах и сервисах компании. Если же подобные библиотеки публикуются в свободном доступе, то проблема становится гораздо более масштабной. Использование двухфакторной аутентификации, например, в npm, сводит практически к нулю шансы атакующего на перехват доступа к учётной записи разработчика и на изменение кода его пакетов.
Что произойдёт, если атакующий получит доступ к учётной записи разработчика? Вот [40] история про разработчика eslint, который попал в такую ситуацию.
![[в закладки] 23 рекомендации по защите Node.js-приложений - 22 [в закладки] 23 рекомендации по защите Node.js-приложений - 22](http://www.pvsm.ru/images/2018/08/09/v-zakladki-23-rekomendacii-po-zashite-Node-js-prilojenii-22.png)
У каждого веб-фреймворка и у каждой технологии имеются известные слабости. Отличный способ помочь злоумышленнику, который хочет атаковать вашу систему — это сообщить ему о том, каким именно веб-фреймворком вы пользуетесь. Используя параметры сессии, заданные по умолчанию, что похоже на использование заголовка X-Powered-By, промежуточное ПО может подвергнуть ваше приложению риску стать объектом атаки, нацеленной на определённый модуль или фреймворк. Попытайтесь скрыть всё, что позволяет идентифицировать используемый вами стек технологий (то есть, например, Node.js и express).
→ Вот [41] материал о куки-файлах и безопасности сессии
Куки-файлы могут передаваться по незащищённым соединениям. Перехватывая их, злоумышленник может использовать данные о сессии и идентифицировать фреймворк, используемый веб-приложением, а также — применяемые в нём модули. Это даст ему возможность организовать атаку на слабые места фреймворков и модулей.
Следующий список представляет собой перечень широко известных важных мер обеспечения безопасности, которые следует использовать в любом приложении. Это — универсальные рекомендации, которые касаются не только Node.js. Здесь [42] можно найти расширенный перечень рекомендаций, сгруппированных в соответствии с классификацией OWASP [43].
Безопасности никогда не бывает слишком много. Надеемся, этот материал поможет вам в защите ваших Node.js-проектов.
Уважаемые читатели! Приходилось ли вам сталкиваться с уязвимостями веб-проектов, которые приводили к реальным проблемам в области безопасности?
Автор: ru_vds
Источник [46]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/288719
Ссылки в тексте:
[1] репозиторий: https://github.com/i0natan/nodebestpractices
[2] Image: https://habr.com/company/ruvds/blog/419719/
[3] eslint-plugin-security: https://github.com/nodesecurity/eslint-plugin-security
[4] Вот: https://github.com/i0natan/nodebestpractices/blob/master/sections/security/lintrules.md
[5] Адам Болдуин: https://medium.com/@adam_baldwin
[6] express-rate-limit: https://www.npmjs.com/package/express-rate-limit
[7] Вот: https://github.com/i0natan/nodebestpractices/blob/master/sections/security/limitrequests.md
[8] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/secretmanagement.md
[9] Sequelize: https://github.com/sequelize/sequelize
[10] Knex: https://github.com/tgriesser/knex
[11] mongoose: https://github.com/Automattic/mongoose
[12] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/ormodmusage.md
[13] helmet: https://www.npmjs.com/package/helmet
[14] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/secureheaders.md
[15] npm audit: https://docs.npmjs.com/cli/audit
[16] nsp: https://nodesecurity.io/
[17] snyk: https://snyk.io/
[18] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/dependencysecurity.md
[19] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/bcryptpasswords.md
[20] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/escape-output.md
[21] jsonschema: https://www.npmjs.com/package/jsonschema
[22] joi: https://www.npmjs.com/package/joi
[23] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/validation.md
[24] Passport.js: https://github.com/jaredhanson/passport
[25] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/revokejwt.md
[26] express-brute: https://www.npmjs.com/package/express-brute
[27] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/login-rate-limit.md
[28] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/non-root-user.md
[29] body-parser: https://github.com/expressjs/body-parser
[30] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/requestpayloadsizelimit.md
[31] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/avoideval.md
[32] validator.js: https://github.com/chriso/validator.js
[33] safe-regex: https://github.com/substack/safe-regex
[34] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/regex.md
[35] eslint-plugin-security: https://www.npmjs.com/package/eslint-plugin-security
[36] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/safemoduleloading.md
[37] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/sandbox.md
[38] Вот: https://github.com/i0natan/nodebestpractices/blob/master/sections/security/childprocesses.md
[39] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/hideerrors.md
[40] Вот: https://medium.com/@oprearocks/eslint-backdoor-what-it-is-and-how-to-fix-the-issue-221f58f1a8c8
[41] Вот: https://github.com/i0natan/nodebestpractices/blob/security-best-practices-section/sections/security/sessions.md
[42] Здесь: https://github.com/i0natan/nodebestpractices/tree/security-best-practices-section#-65-collection-of-common-generic-security-best-practices-15-items
[43] классификацией OWASP: https://www.owasp.org/images/7/72/OWASP_Top_10-2017_%28en%29.pdf.pdf
[44] Вот: https://www.owasp.org/index.php/Authentication_Cheat_Sheet#Implement_Proper_Password_Strength_Controls%5C
[45] Image: https://ruvds.com/ru-rub/#order
[46] Источник: https://habr.com/post/419719/?utm_campaign=419719
Нажмите здесь для печати.