@starwars9isgreatlol

Как изолировать(sandbox) часть приложения на nodejs?

Привет, решил начать пет-проект для обучения и развлечения, что то типа cms как
Для разработки решил взять nodejs и vue

Встала задача как то изолировать недоверенный код от клиентов от доверенного кода.
К примеру

<template>
  <component :is="component" v-for="component in page" />
</template>

<script>
export default {
  async serverPrefetch() {
    //Получаем список компонентов для страницы
    const data = axois.get('/page/' + this.userId)

    //Возвращаем компоненты, загружая их из папки пользователя
    this.page = data.map(component => {
        return () => import('~/UNTRUSTED_CODE/'+ this.userId +'/components/' + component + '.vue')
    })
  },
}
</script>


То есть пользователь может редактировать файлы внутри своей папки /UNTRUSTED_CODE/$userId/
А поскольку хочется сделать серверный рендеринг, то получается что мне нужно исполнять на сервере недоверенный код,
который может читать файлы, сделать white(true), в общем это дыра

Возможно ли как то изолировать такой код от основного приложения?
То есть что бы при чтении файлов читалась бы только папка этого пользователя.
Что бы пользователь не мог прочитать другие исходники, например код выше.
Что бы при переполнении памяти или бесконечной рекурсии не падало бы все приложение.

Доверенный код должен как то взаимодействовать с недоверенным

Гуглил про песочницы вроде vm2, но они ненадежны, с докером опыта работы у меня нет
Какие вообще есть подходы к этому?

Спасибо!
  • Вопрос задан
  • 241 просмотр
Пригласить эксперта
Ответы на вопрос 1
Robur
@Robur
Знаю больше чем это необходимо
Возможно ли как то изолировать такой код от основного приложения?
То есть что бы при чтении файлов читалась бы только папка этого пользователя.
Что бы пользователь не мог прочитать другие исходники, например код выше.
Что бы при переполнении памяти или бесконечной рекурсии не падало бы все приложение.


Запускайте в отдельном процессе с ограниченными привилегиями. Но все равно - сделать настоящую песочницу весьма сложно.

Другой вопрос - что так как вы хотите - вообще делать не надо.
Если это cms - то пользователь должен управлять контентом а не кодом.
Если пользователю действительно надо управлять кодом - то виртуалки и пользовательские сервера ваш путь. Можете сделать предустановленные докер-файлы например где вся среда уже развернута и просто копируются дополнительные пользовательские файлы или еще что придумать, насколько знаний и фантазии хватит.

Хотя, если вы самостоятельно напишите реальную песочницу для выполнения там отдельных файлов nodejs - то это будет проект заметно круче какой-то там cms.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы