Автор оригинала: Scott Robinson.
По умолчанию Node.js довольно безопасен сам по себе. Хотя, есть определенно вещи, которые вы должны остерегаться. Если ваше узел Web-App начинает становиться все более популярным, например, вам нужно все больше думать о безопасности, чтобы убедиться, что вы сохраняете данные ваших пользователей.
Увидев некоторые вопросы о безопасности Node.js вокруг Интернета за последние несколько недель, я полагал, что было бы полезно написать краткое руководство по тому, что вы можете сделать, чтобы защитить свои приложения.
Многие, если не все, из предложений здесь действительно легко следовать и реализовывать, и в основном специфичны для самого узла или его модулей. Поэтому я не буду охватывать такие вещи, как шифрование или аутентификация пользователя, что немного не имеет возможности этой статьи. Многие из советов здесь будут сосредоточены на веб-каркасах узлов, поскольку они, как правило, являются наиболее уязвимыми для атаки.
Не запустите код с sudo
Это происходит больше, чем вы думаете, и это опасно. Поскольку он дает корневые разрешения, запуск кода с sudo может сделать раздражающие проблемы уходить, например, писать в каталог, который у пользователя нет. Но это просто простой выход, и эти ярлыки воспитывают беспорядок других проблем, которые вы не должны игнорировать.
Вместо этого найдите основную причину проблемы и выясните способ обойти его без ущерба для всей системы.
Таким образом, например, если вам нужно открыть порт 80 для веб-сервиса, но не могу не запустить root, вы должны вместо этого использовать прокси, как Nginx Переслать запросы от порта 80 на любой другой порт, на самом деле работает ваш сервис.
Если вы запускаете root, и ваше приложение взимается злоумышленниками, они могут сделать все, что они хотят с вашей системой и Ваши данные. Это худший сценарий, который вы пытаетесь защитить себя от.
Избегайте Eval на всех расходах
Хорошо, я признаю его, порой можно заманчиво сделать ваш код более динамичным, позволив ему выполнить произвольный JavaScript, используя Eval
, но поверь мне, это плохое представление.
Некоторые люди даже пытаются использовать его, когда они ленивы с анализом пользовательского ввода. В конце концов, двигатель V8 JavaScript действительно хорош в разборении таких вещей, как простые математические операции, так что заманчиво использовать это для ваших преимуществ:
var result = eval('(13 + (2 * 23.249) / 0.981)'); // result = 60.398572884811415
Есть слишком много способов, которыми это может вернуться, чтобы укусить вас. Если вы не эксперт и не знаете, как защитить себя от всех Различные виды злонамеренного JavaScript Кодекс, просто убирайся от этого.
Вот простой пример эксплуатации:
var userInput = req.body.userInput; // User entered 'process.exit()' var answer = eval(userInput); // App quits here
Запуск этого кода выключит ваше приложение, вызывая отказ в обслуживании (DOS) своим пользователям.
Добавить/удалить заголовки HTTP
Существует довольно много HTTP заголовков, которые могут помочь вам, и вам больно. Использование правильных правила – это сложная часть.
Express, по умолчанию добавляет X-Powered-by: Express
Заголовок, который действительно ничего не делает, кроме как потенциальных злоумышленников, какую веб-каркас вы используете, и поэтому как использовать ее на основе общеизвестных уязвимостей. Чем больше информации они о вашем технологическом стеке, тем больше способах они смогут атаковать его.
Вот где Шлем приходит играть в игру. Шлем – это небольшой модуль для узла, который помогает безопасным приложениям Express/Connect, добавив/удаляя различные заголовки HTTP.
Вы можете сделать что-нибудь от включения HSTS для предотвращения Щелкнуть атаки kicks Отказ Это вещи, которые мало что забирают, не работают с вашей стороны, но они могут сделать миру различий. Поэтому, если вы создаете приложение Express, это должно быть немаловым (и действительно, для любого веб-сервиса, которую вы должны сделать).
Используйте сканирующие утилиты, такие как Fenire.js
Не все программисты являются экспертами безопасности, и хотя вы должны сделать все возможное, чтобы оставаться в курсе общих подвигов, таких как XSS или SQL-инъекция, сложно их знать.
Чтобы сделать это, вы должны попробовать использовать такие инструменты, как Retire.js , который сканирует ваше узкое приложение для зависимостей, которые содержат уязвимости.
Например, Ember.js имеет определенную уязвимость XSS в нескольких разных версиях ( CVE-2014-0046 ), все из которых проверяются Retire.js. Когда вы выполняете на пенсию
В каталоге вашего проекта он будет сравнивать пакеты в node_modules
к публичному хранилищу уязвимостей и откуда вам, какие из ваших зависимостей небезопасно.
Во многих пакетах просто слишком много уязвимостей, чтобы проверить себя, поэтому вам лучше позволить инструменту, как это, сделайте это для вас.
Вы можете легко сделать эту часть вашего рабочего процесса, интегрируя его с Grunt или Glp, благодаря предоставляемым плагинам. Детали в readme.
Другой вариант – просто запустить его в Prepublish
Команда, которая будет работать до того, как NPM отправляет ваш пакет в репозиторий. Просто добавьте что-то вроде этого к вашему Package.json
:
{ "name": "myProject", "version": "0.0.1", "scripts": { "prepublish": "retire", } }
Будьте осторожны с модулем Child_Process
Как Eval
, используя Спон
и exec
от Child_Process
Модуль может быть действительно полезным, но и Действительно опасный. Любой пользовательский ввод, который пробирается в этих командах, может означать, что ваша система довольно быстро скомпрометирована (особенно если вы запускаете свое приложение с Sudo!).
Например, Image Magick является очень популярным инструментом командной строки для отображения, преобразования и редактирования изображений. С таким количеством веб-приложений, использующих изображения в эти дни, Image Magicch часто используется на заднем плане для вещей, таких как обрезки и изменение размера. Чтобы использовать этот инструмент с узлом, вы можете увидеть такой код:
child = child_process.exec('convert ' + imageFilename + ' ' + imageFilename + '.bmp', ['-depth', '24'], function(err, stdout, stderr) { console.log('Done'); });
Это может выглядеть безвредно, но с тщательно обработанным imagefilename
, вы можете выполнить любой код, который вы хотите в оболочке.
exec
следует использовать только в том случае, если он не зависит от ввода пользователя или Если аргументы сильнозиндированы. Даже лучше, проверьте NPM для библиотеки, которая управляет инструментом командной строки. Они обычно строятся с таким видом безопасности, или, по крайней мере, имеют больше глаз на коде для проверки проблем. Для Image Magick есть несколько модулей, таких как GM Отказ
Понять уязвимости
Многие уязвимости в веб-приложениях относятся ко всем услугам, независимо от языка программирования и используемых рамок. Хотя, Как Вы атакуете эти услуги, могут отличаться на основе технологического стека, который вы используете. Чтобы лучше защитить себя, вам действительно нужно узнать, как эти эксплойты работают.
Повезло за тебя, Owasp Размещает список лучших 10 рисков для веб-приложений. Просмотрите их, а затем сделайте тщательный анализ вашего сайта, чтобы увидеть, если кто-нибудь из них относится к вам.
Еще лучше, проверить Nodegoat , который является развертываемым веб-сайтом, созданным OwASP, предназначенным для обучения вам, как специально определить эти риски в узловых приложениях. Нет лучшего способа изучить эти концепции, чем на самом деле делать это сами.
Учебное пособие Предоставленные будут проходить вас через все риски, демонстрирующие конкретные примеры того, как как эксплуатировать, так и защищать от уязвимостей. Например, вот видео, предоставляемый OWASP, показывающий, как ввести JavaScript с помощью веб-формы:
Больше информации
Безопасность узла – это большая тема, поэтому было бы не разумно пытаться охватить все это здесь. Если вы заинтересованы в получении более подробностей, я предложил читать еще несколько ресурсов, как эти:
- Консультации по безопасности узла
- Анализ платформы Node.js Безопасность веб-приложения [PDF]
- Открытие файлов в Node.js считается вредным
- Node.js Безопасность Google Group
- Наверху упущенных угроз безопасности для Node.js веб-приложений [PDF]
Заключение
Слишком часто безопасность приложения является после того, как последующая мысль развивается и дизайн. Достаточно просто для того, чтобы ваш код был правильно работать, не говоря уже о безопасности для использования для ваших пользователей.
К счастью, вы не единственный, кто проходит через эти проблемы, так что означает, что есть множество инструментов и ресурсов, созданных другими, чтобы помочь вам быстро и легко защищать свои приложения. Просто найдите время, чтобы найти NPM, задайте вопросы на форумах или даже нанять эксперта. Это определенно стоит времени и денег!
Какие еще способы вы защищаете свои приложения узла? Дайте нам знать об этом в комментариях!