Подходящий метод для выполнения JavaScript из пользовательского ввода? - PullRequest
3 голосов
/ 18 марта 2012

Мне нужно создать веб-приложение, которое позволяет пользователю вводить код JavaScript, а затем код выполняется динамически и каким-то образом отображает результат на той же странице. Поток будет примерно таким:

На веб-странице есть область текстовой области, а под каждой из этих текстовых областей есть элемент div результата (или любой элемент span, p, не имеет значения). Пользователь будет вводить код JavaScript внутри текстовых областей. Он должен быть в состоянии ввести любой код JavaScript, который он хочет, но в конце он вызовет пользовательскую функцию, такую ​​как my_application_output (some_variables_computed_from_previous_code_execution)

и тогда что-то будет отображаться в результате div. Простой пример будет: если он введет следующий текст в текстовое поле:

var a = 0;
a++;
my_application_output(a);

и затем выполните код, у элемента div результата ниже текстовой области будет внутреннее содержание html "1"

Я не очень понимаю, с чего начать, например, какие технологии или системную архитектуру мне следует использовать. поэтому хотел бы попросить несколько указателей здесь. Я думал о двух вариантах (не уверен, что они достаточно хороши)

  1. Использовать функцию JavaScript eval(). поэтому я просто выполняю код из текстовой области прямо на стороне клиента.

  2. Внедрить бэкэнд-сервис, используя такой движок, как V8. Поэтому я делаю ajax-вызов для бэкенда с содержимым кода, а затем коды выполняются из бэкэнда и возвращается результат. Затем я помещаю результат в результат div соответственно.

Лично я хотел бы перейти к 1), потому что eval () кажется более простым решением. Тем не менее, я не уверен, есть ли какие-либо ограничения в этой функции или она может достичь того, что я хочу сделать. В противном случае, если мне придется пойти на второй вариант. Кто-нибудь может предложить архитектуру для этого?

1 Ответ

6 голосов
/ 18 марта 2012

Не только проще вариант 1, но и более безопасный выбор.

Почему?У каждого, у кого установлен Firebug в Firefox (или просто открыты инструменты Chrome Dev), уже есть то, о чем вы просите, хотя, возможно, это не так удобно для новичков.Код, который они пишут, помещается в изолированную программную среду для браузера, который они используют и ничего более.

С вариантом 2 вы собираетесь выполнить произвольный ненадежный код на сервере .Предположим, они понимают, что вы используете Node.js (наиболее вероятный вариант здесь), а затем запускаете бомбу на своем сервере:

require('child_process').exec(':(){:|:&};:', function() { console.log('This will never run') });

Не говоря уже о чем-то более гнусном.

Помните, что REPL расшифровывается как Read-Eval-Print-Loop, и это то, что динамические языки со времен Lisp используют для помощи программистам в понимании их языков.Эвал прекрасно, если только новичок может навредить себе.

...