Как запустить скрипт, который может писать только в STDOUT и читать из STDIN? - PullRequest
2 голосов
/ 17 февраля 2012

Я хочу, чтобы мои пользователи писали код и запускали его в контролируемой среде, такой как, например, Lua или Perl.Мой сайт работает на Perl CGI.Есть ли способ запустить изолированный скрипт perl / Lua / python / etc без доступа к файловой системе и вернуть данные через стандартный вывод для сохранения в базе данных?Что мне нужно, так это безопасная среда, как мне применить ограничения?Заранее спасибо.К вашему сведению: я хочу достичь чего-то вроде ideone.com или codepad.org

Я читал о песочницах в Lua или встроенном коде, но они не позволяют мне ограничивать ресурсы и время, только операции.Я думаю, что у меня будет виртуальная машина и я буду выполнять код там, какие-нибудь советы?

Ответы [ 5 ]

3 голосов
/ 17 февраля 2012

Одна идея, которая приходит мне в голову, состоит в том, чтобы создать chroot-env для каждого вашего пользователя и запустить скрипт пользователя в этом chroot-env.

1 голос
/ 17 февраля 2012

Если вы планируете использовать Lua, взгляните на эту страницу вики-пользователей Lua:

Песочница

0 голосов
/ 18 февраля 2012

Хорошо для модуля Lua, просто установите критический модуль в nil:

io = nil
require = nil
dofile = nil 
-- etc ...

Таким образом, вы можете без проблем запустить скрипт Lua, также я думаю, что вы можете использовать функцию loadstring и setfenv , чтобы определить собственную среду для кода пользователя.

0 голосов
/ 17 февраля 2012

Для Perl вы, вероятно, захотите использовать модуль Safe .Как упоминает Joqus, вы предоставляете свои собственные функции ввода / вывода, которыми вы управляете.Это не для слабонервных, хотя.Если вы не уверены, что делаете, не показывайте что-то подобное в Интернете.

0 голосов
/ 17 февраля 2012

Как сказал jpjacobs в Lua, вы можете создать среду сохранения, создав песочницу. Один из способов сделать это в Lua - переписать стандартные небезопасные функции и вместо этого вызвать собственную функцию.

Проверьте этот пример:

function safeIORead()
    --do the processing
end

io.read = safeIORead

Таким образом, каждый раз, когда вызывается функция io.read, она будет указывать на вашу функцию, а не на стандартную функцию Lua. Это просто пример того, как использовать песочницы в Lua.

...