Я изучаю Node.js (-awesome-), и я играю с идеей использовать его для создания MUD следующего поколения (онлайн-текстовой игры). В таких играх существуют различные команды, навыки, заклинания и т. Д., Которые можно использовать для убийства плохих парней, когда вы бегаете и исследуете сотни комнат/мест. Вообще говоря, эти функции довольно статичны - вы не можете создавать новые заклинания или создавать новые комнаты. Я бы хотел создать MUD, где код, определяющий заклинания и комнаты и т. Д., Может быть отредактирован пользователями.Модули Sandboxing Node.js - это можно сделать?
У этого есть некоторые очевидные проблемы безопасности; злоумышленник может, например, загрузить несколько JS, которые разворачивают дочерний процесс 'rm -r /'. Я не так забочусь о защите внутренних дел в игре (я стараюсь как можно больше, но на том языке, где все открыто, вы можете так много делать); Я всегда мог отслеживать изменения в коде wiki-стиля и наказывать пользователей, которые, например. сбой сервера или увеличение мощности более 9000 и т. д. Но я бы хотел прочно защитить ОС сервера.
Я рассмотрел другие ответы на подобные вопросы, и большинство людей предлагает запустить изолированную версию узла. Это не будет работать в моей ситуации (по крайней мере, не очень хорошо), потому что мне нужно, чтобы пользовательский JS взаимодействовал с движком MUD, который сам должен взаимодействовать с файловой системой, системными командами, чувствительными базовыми модулями и т. Д. И т. Д. Гипотетически все эти транзакции могут быть JSON-закодированы в движке, отправлены в обработанном песочнице, обработаны и возвращены в движок через JSON, но это дорогое дело, если каждый звонок, чтобы получить хит-очки игрока, должен быть перешел к другому процессу. Не говоря уже о синхронности, которую я бы предпочел избежать.
Так что мне интересно, есть ли способ «изолировать» единый модуль узла. Я думал, что такой песочнице нужно будет просто отключить функцию «требовать», и все будет блаженством. Так что, поскольку я не мог найти что-либо в Google/SO, я решил, что сам поставил вопрос.
Это звучит довольно аккуратно :) Как вы относитесь к запуску кода пользователя в браузере и передаете результирующие значения узлу через ajax? Таким образом, вы можете предоставить интерфейс, в котором могут быть изменены только определенные значения (например, здоровье, мана, уровень, навыки и т. Д.), Вы ограничиваете их серверами, и у вас нет шансов на запуск вредоносного кода на вашем сервере. Это похоже на то, что может сработать? – asifrc
Спасибо! :-). К сожалению, это не будет работать для того, что я ищу; это в значительной степени похоже на технологический подход с песочницей. Я хочу, чтобы предоставленный пользователем код вызывал функции, регистрировал события и т. Д. Например, комната могла зарегистрировать событие, чтобы обнаружить, когда кто-то входит, а затем автоматически включить волшебный свет (clap on ;-)). Или NPC может решить следовать за вами, бросать исцеляющие заклинания или разумно бросать элементарные заклинания на врагов на основе их слабостей и т. Д. Таким образом, эти сущности действительно должны иметь возможность взаимодействовать друг с другом на сервере. Спасибо хоть! – opensourcejunkie