update 2: я получил эту работу, и она живет:)
обновление: Пожалуйста, проверьте комментарии, @ikegami ответ работает, но с небольшой проблемой. Возможно, я делаю что-то довольно простое.
Недавно я решил, что мне нужно хорошо изучить Linux/Perl, а затем я начал создавать этот www.tryperl.com в качестве учебного проекта. Это Cloud IDE.
(Прошло всего несколько месяцев с тех пор, как я впервые положил руки на perl, linux, bash, osx, поэтому, пожалуйста, пройдите на меня)
В настоящее время я код eval с Safe.pm, но мой план игры:
Отдельная виртуальная машина Amazon EC2, которая будет проверять perl-код небезопасный и возвращает результат. Виртуальная машина будет заблокирована из Интернета и сбалансирована. Я могу затем reset эту машину из моментального снимка время от времени.
Это в основном код, который я буду использовать для кода perl на сервере, я использую Time:: Out для управления тайм-аутом:
my $code = ..
my $arg = ..
#create a file with random name
my $filename = rand().".pl";
open(FILE,">$filename")
print FILE $code;
close(FILE);
#use Time::Out to timeout after 10 secs
my $ret = timeout 10 => sub {
#run the file just created with $arg as an argument. << This is IMP
my $r = `perl $filename $arg`;
return $r;
};
if ([email protected]){
return [email protected];
}
return $ret;
Мои Проблемы
-
Могу ли я как-то избежать создания физического файла и передать $code с помощью $arg? Как). Это было решено @ikegami в комментариях.open(FILE,"perl <some_magic> | ")
. Может показаться глупым, но я должен был спросить: ( -
Я не могу использовать Capture:: Tiny. Я попытался сделать это внутри блока тайм-аута:
my ($stdout, $stderr, $count) = capture { system('echo Hello') };
Но я продолжал получать пустые строки!:( Это потому, что он находится в таймауте? (Мне все равно не слишком много об этом) -
Есть ли другие недостатки безопасности, которых я не вижу? Должен ли я делать предел fork? Как мне начать это делать? (Ссылки и некоторые указатели были бы хороши)
-
Автор http://www.perltuts.com говорит в этой статье, он использует qemu и debian чтобы запустить его код. Помимо ограничения fork, Является ли его подход семантически похожим на мои? (Простите мое невежество здесь снова, Помните, что я коснулся окна Linux всего несколько месяцев назад)
Мой блок разработчика - OSX 10.8, производственный сервер - RHEL для интерфейсов и Ubuntu для Perl eval Machine. Я бегу по EC2. Подробнее см. Полный стек здесь.
Любой подробный ответ будет оценен и вознагражден репутацией и единорогом:)