Безопасен ли nodejs как есть?

#node.js

#node.js

Вопрос:

У меня есть Linux-бокс, и я только что установил nodejs. Многие примеры, которые я вижу, просто выполняют определенную функцию, но нигде не видят, что они «защищают» сервер nodejs? Например, для php я бы использовал сеансы для защиты области моего веб-сайта. Все ли в порядке с nodejs как есть? Нужны ли дополнительные настройки или код в nodejs, чтобы убедиться, что к нему обращаются только нужные люди? Или это нормально прямо «из коробки»?

Комментарии:

1. К счастью Node.js это не PHP.

Ответ №1:

Node.js сам по себе не является веб-сервером. Это механизм асинхронных событий, запрограммированный на Javascript. 🙂

PHP не обслуживает выходные данные, которые он генерирует. Эта задача возлагается на веб-сервер, такой как Apache или IIS. PHP поставляется с модулем управления сеансом (доступным через сверхглобальную переменную $_SESSION), тогда как Node.js поставляется с модулем веб-сервера («http»).

Node.js позволяет выполнять и то, и другое в одной среде, поскольку позволяет вам и вашей программе самостоятельно создавать экземпляры веб-сервера. Это позволяет очень, очень легко предоставлять функциональность в Интернете в качестве простого старого веб-сервера HTTP (s), тогда как с PHP ваша среда ограничена конфигурацией веб-сервера.

На самом деле, думайте о модуле «http» скорее как о реализации протокола HTTP в насыщенном виде. Если вам нужен «настоящий» веб-сервер, такой проект, как express, будет гораздо более подходящим для вас, потому что он поставляется с функциями, которые предоставляет веб-сервер, такой как Apache.

Кстати, express Framework уже предоставляет поддержку сеансов.

Итак, чтобы фактически ответить на ваш вопрос (ы): да, Node.js все в порядке как есть, потому что сам по себе он не является веб-сервером. Когда вы подключаете модули, вы должны учитывать их настройки. Вы полностью контролируете «взаимодействие с агентом пользователя».

Ответ №2:

Узел — это, по сути, просто веб-сервер. Он не имеет ни малейшего представления о том, кто такие «правильные люди» для доступа к нему, и по умолчанию будет обслуживать запросы всем желающим.

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

Комментарии:

1. Узел не является веб-сервером. Express — это веб-сервер на узле.

2. @Ped Express — это не веб-сервер, это веб-фреймворк. Node.js предоставляет http-сервер в своем ядре, который расширяет Express.

3. Итак, nodejs — это среда выполнения. Модуль http превращает его в веб-сервер.: )

4. Сервер — это Linux box: D

Ответ №3:

Я заметил, что примеры для http.createServer небезопасны, если вы не определяете пути как разрешенные. например: я смог получитьhttp://localhost/../../../../../etc/passwd с завитком.

Я решил проблему, не разрешив обслуживать какие-либо файлы, которых нет в текущем каталоге.

 var filename = path.normalize( path.join(process.cwd(), uri) );

if (filename.indexOf(__dirname) == 0 ) {
    path.exists(filename, function(exists) {
  

Комментарии:

1. Также было бы неплохо запустить node под учетной записью, у которой нет разрешений на доступ к тому, к чему вы этого не хотите.

2. Спасибо, я искал простой пример только одной из вещей, которые кто-то может пропустить, не используя express.js

Ответ №4:

Node.js это просто среда, в которой ваш серверный javascript будет запускаться из созданных вами модулей. Он предоставляет вам множество встроенных библиотек / модулей, таких как http / https. Все, что касается безопасности, аутентификации и авторизации, должно быть написано вами или включено с использованием модулей с открытым исходным кодом. Если вы пишете веб-приложение, посмотрите на Express как на свой фреймворк и используйте его функциональность сеанса, чтобы помочь в создании.

Что касается защиты сервера с точки зрения инфраструктуры, вы можете разместить его за обратным прокси, таким как NGiNX, и использовать брандмауэр только для открытия порта 80 или 443 NGiNX в зависимости от ваших потребностей. Обычно это удобно, поскольку вы будете запускать несколько экземпляров Node в соответствии с количеством ядер вашего процессора, а обратный прокси-сервер может выполнять циклический перебор между ними, позволяя вам сохранять порты закрытыми.

Ответ №5:

Express поддерживает сеанс, но я прочитал какую-то статью, в которой рекомендуется не использовать сеанс, если для повышения производительности он выделяет память. Я использовал sessionStorage для сохранения имени пользователя и пароля своих клиентов. Проблема в том, что хакер может получить доступ через консоль, поэтому я нахожу некоторую библиотеку javascript для расшифровки паролей, такую как sjcl (http://crypto.stanford.edu/sjcl /). Но тогда другая проблема по-прежнему заключается в том, что функция sjcl может получить доступ в консоли. итак, что я сделал, это переписал функцию, когда пользователь находится в Сети.

    #offline - sjcl can access in console
   #online - override the sjcl to prevent access in console
   window.sjcl = -> "back-off hacker!"
  

Что я сделал, так это отправил имя пользователя и пароль на сервер при его перезагрузке через sessionStorage, чтобы он проверил и ответил на соответствующую страницу (автономную или онлайн) для вас.

Но, конечно, эта защита предназначена только для обычного веб-сайта, она не рекомендуется некоторым банкам или правительствам. Я надеюсь, вы поняли идею .. ^ _^

ps. я использую angularjs и express.io

Комментарии:

1. Это не безопасность.