Первый запуск Nodejs под IIS+(reverse proxy) для чайника

FussesDemon

Администратор
Администратор
9 Фев 2005
6.418
693
113
www.unifree.ru
В инете много чего написано ..Нооо мало у кого понятно Опять же я не буду писать как установить IIS или nodejs Где их официальные сайты и т.д. А что такое IIS и node js ...
Хочу остановиться на том как получилось у меня запустить в первый раз Где я намучался офигеть сколько времени Даже уже не считаю А несколько раз подходил к nodejs и как то все не получалась Даже не понимал в чем проблема Вроде все повторяю и не але
В инете есть два как минимум варианта запуска Один через дополнение iisnode который нужно установить дополнительно в IIS Сейчас не об iisnode - https://github.com/tjanczuk/iisnode Может потом расскажу об этом варианте Там есть свои плюсы и минусы

И так начну с того что IIS установлен и nodejs Версии сами определяйте тут этого не будет У меня самые последние на написание того текста

Все что нужно знать про nodejs Что поможет в понимании дальше настроек и запуска под IIS

Сам nodejs можно запустить по одному и тому же порту (например 3000) но с разных проектов папок одного запускного файла Чаще это server.js или main.js
Как понимаю нет какого то правила в имени файла то что запускать НО при команде npm start будет искать server.js для запуска Либо запускать через команду node имя.js Для запуска более одной сессии нужно ставить дополнительный пакет например pm2
Еще нужно знать об пакетах (модулях) Все хочу их назвать модули как называется сама папка node_modules Почему в описании часто называют пакетами? Это дополнения которые расширяют возможности NODEJS Так как по умолчанию мало что умеет

Добавлю важную информацию При установки пакетов нужных, есть два вида установки ГЛОБАЛЬНЫЙ и локальный внутренний только для конкретного проекта Физически это выглядит так что при глобальном установки дополнения закачивается в основную папку node_modules где и сам node.exe А локальная установка создаться внутри проекта папка node_modules где сам запускной файл server.js Все модули пакеты расширения )) Будут закачиваться туда и только для этого проекта использоваться Вроде можно запускать из других проектов но по умолчанию смысл таков
Команда npm install имя пакета Если нужно глобально то нужно добавить -g в конце команды

В папку в корень или нет, создаем файл например server.js

Запускать скрипт или приложение будем npm start или быстрей node server.js

Нашел на просторах инета несколько примеров
Но прежде чем перейдем к примерам нужно настроить IIS web.config обязательно Иначе примеры без iisnode работать будет только с обязательным указать порт в адресной строке браузера... А это означает что IIS участие в работе скрипта принимать не будет в том что будет на странице :wink:
XML:
<rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                       <add input="{CACHE_URL}" pattern="^(http?)://" />
                    </conditions>
                    <action type="Rewrite" url="{C:1}://address:3000/{R:1}" />
                </rule>
            </rules>
        </rewrite>
В конфиге iis настроим протокол, адрес и порт По умолчанию скрипты nodejs запускают на 3000 порту

Первый пример хочет пакет express (require("express")) Запустить из папки где скрипт командную консоль (cmd или powershell)
Напишем npm install express Должна создаться папка node_modules там где запустили cmd или powershell и загрузиться нужные пакеты в нее

Добавим в файл server.js
JavaScript:
// Настройки
  const setup = {port:3000}
  // Подключаем express
  const express = require ('express');
  // создаем приложение
  const app = express ();
  // Маршрутизируем GET-запрос http://ваш_сайт/test
  app.get('/test', (req, res) => {
    res.send('Тест');
  });
  // Слушаем порт и при запуске сервера сообщаем
  app.listen(setup.port, () => {
    console.log('Сервер: порт %s - старт!', setup.port);
  });

Запускаем скрипт npm start или быстрей node server.js из командной строки (cmd или powershell)
Пишем в браузере адрес и должны увидеть Cannot GET /
Дальше можно добавить .../test и увидим слово Тест

Загружаем еще пакет http
Добавим в файл server.js еще пример по сложнее малость .. Укажем обязательно адрес в нем
JavaScript:
const http = require("http");

const server = http.createServer((req, res) => {
  const urlPath = req.url;
  if (urlPath === "/overview") {
    res.end('Welcome to the "overview page" of the nginX project');
  } else if (urlPath === "/api") {
    res.writeHead(200, { "Content-Type": "application/json" });
    res.end(
      JSON.stringify({
        product_id: "xyz12u3",
        product_name: "NginX injector",
      })
    );
  } else {
    res.end("Successfully started a server");
  }
});

server.listen(3000, "адрес", () => {
  console.log("Listening for request");
});
Опять из командной строки (cmd или powershell) там где скрипт запускаем скрипт npm start или быстрей node server.js
После запуска скрипты загружаются в память Если отредактировать во время работы server.js то ничего не измениться в работе Будет работать тот вариант который был запущен в начале :wink:

Должны увидеть надпись Successfully started a server Если такое есть то то еще можно добавить /overview и /api ...

Идем дальше к примеру кода который показал мне о проблеме безопасности nodejs Загружаем еще пакеты fs path url и http должен уже быть
JavaScript:
// nodejs.org/api for API docs
// Node.js web server
var http = require("http"), //Import Node.js modules
url = require("url"),
path = require("path"),
fs = require("fs");

http.createServer(function(request, response) { //Create server
var name = url.parse(request.url).pathname; //Parse URL
var filename = path.join(process.cwd(), name); //Create filename

var fixwin = filename.replace('\\', '/');//Исправим путь для ОС win

fs.writeFile(fixwin, 'Hello content!', function (err) {
  if (err) throw err;
  console.log('Saved!');
});
fs.readFile(fixwin, "binary", function(err, file) { //Read file
if(err) { //Tracking Errors
response.writeHead(500, {"Content-Type": "text/plain"});
response.write(err + "n");
response.end();
return;
}
response.writeHead(200); //Header request response
response.write(file, "binary"); //Sends body response
response.end(); //Signals to server that
}); //header and body sent
}).listen(3000); //Listening port
console.log("Server is listening on port 3000."); //Terminal output
Нужно в адресной строке написать название файла (пример ../test.txt) и он создаться и читается обратно и выводится на экран содержимое файла
Вот тут самое интересное про безопасность ))) Можно создавать файлы где угодно Выходя за пределы корневой папки сайта Можно редактировать системные файлы ОС Как исправить это косяк ОГРОМНЫЙ ? Я пока не разобрался )))
 

FussesDemon

Администратор
Администратор
9 Фев 2005
6.418
693
113
www.unifree.ru
Нужно в адресной строке написать название файла (пример ../test.txt) и он создаться и читается обратно и выводится на экран содержимое файла
Вот тут самое интересное про безопасность ))) Можно создавать файлы где угодно Выходя за пределы корневой папки сайта Можно редактировать системные файлы ОС Как исправить это косяк ОГРОМНЫЙ ? Я пока не разобрался )))
Подытожу.. Если таким образом кто то запускает какие то скрипты И там есть какая уязвимость через которую достаточно попасть в папку где server.js Отредактировать его и потом даже перезагрузить и получить полный доступ к серверу )
 

FussesDemon

Администратор
Администратор
9 Фев 2005
6.418
693
113
www.unifree.ru
В инете есть два как минимум варианта запуска Один через дополнение iisnode который нужно установить дополнительно в IIS Сейчас не об iisnode - https://github.com/tjanczuk/iisnode Может потом расскажу об этом варианте Там есть свои плюсы и минусы
Время пришло.. Это полный зашквар :rofl:

Скачиваем nodejs и скачиваем iisnode И начнутся приключения с правами ))))))))))

Нужен почему то... зачем то ...права NT AUTHORITY\Прошедшие проверку На какой ? Без ответа автора программы )
Потом обязательно эти права к трем папкам nodejs iisnode и папка сайта

Нужно NT AUTHORITY\Прошедшие проверку группу добавить к всему диску ОБЯЗАТЕЛЬНО !!! Или все другие правила бессмысленны почему то )))
Еще добавить NT AUTHORITY\Прошедшие проверку к nodejs где обязательно на этом диске были NT AUTHORITY\Прошедшие проверку
Еще добавить NT AUTHORITY\Прошедшие проверку к iisnode где обязательно на этом диске были NT AUTHORITY\Прошедшие проверку
Еще добавить NT AUTHORITY\Прошедшие проверку к папку скрипта nodejs где обязательно на этом диске были NT AUTHORITY\Прошедшие проверку

Получается бредовая уязвимость :dance:При взломе одного ресурса подвергаются угрозе всего диска в целом и что на нем есть ) Не говоря о сервере :rofl:

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

Самое печальное Какой то малейший косяк с правами то в модуле iisnode сразу ошибка Весь сервер IIS ложится моментально )) Что совсем бредятина :fool:

Разработчики конечно МОЛОДЦЫ что такой модуль написали
НОооо блин!!! Ну напишите вы какое то предупреждение что модуль полон уязвимостей, он пипец какой кривой в нем много ошибок и т.д.
Что используете все это на свой страх риск Дерзайте ))) Так вместо этого сам майкрософт рекомендует этот модуль ))))

Еще добавлю последняя версия iisnode выходила в 16 году это почти 10 лет, полные 8 лет Это большой срок для подобных модулей без обновлений
А еще добавлю на гидхабе писал много багов разработчику пофиг Мож он ласты уже давно склеил Но блин опять Почему майкрософт как то не заботиться об этом?

И плюс ЕЩЕ про баги При тестировании прав различных модуль библиотеки iisnode как то кэшируется Не только в иис но во всей винде это никак не увидеть ))
И только перезагрузка помогает понять реальность Это совсем бедень :eye: За такое в огонь нах

IISNODE просто отстой полный!! По безопасности никакой критики даже не выдерживает Нах такой вариант на много хуже чем запускать скрипт без iisnode
Существование этого модуля как только тест использовать максимум или как прикол
Но не как использовать его на хостингах в коммерческих проектах.. Это банальное неуважение клиентов и подвергать риск сервера в целом

зы Нах такое бредятину В целом Nodejs хорошо но он сам это большая уязвимость его юзать Сомнительный выигрыш веб среде если сравнивать с PHP ))) Но как приложение совместное с вебом круче чем PHP Но не как публичный хостинг nodejs ))))