Какой самый безопасный способ разрешить выполнение JavaScript, написанного на клиенте, на сервере?

1

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

Изменить (подробнее):

  • Regex не является вариантом, поскольку они понадобятся, if, else, switch т.д.
  • Я хотел бы избежать создания пользовательского языка
  • Идея в том, что пользователь знает JS, они могут писать собственную логику

Я посмотрел на Stopping Infinite Loops от CodePen, где они генерируют абстрактное дерево синтаксиса с использованием Esprima, а затем регенерируют JavaScript, который мы используем Escodegen. Меня беспокоит такой подход, что кто-то все еще может ввести какой-то взлом Unicode.

  • 0
    Лучше всего будет использовать new Function() { arg1, arg2, arg3, code )(arg1, arg2, arg3) . Это создает изолированную область (за исключением глобальной области, которая может быть перезаписана путем добавления локальных переменных, ссылающихся на глобальную область). Возможно, вы захотите поместить некоторые защитные меры в часть кода (например, запретить операторы require ). Если код должен что-то возвращать, то вы можете поймать результат
  • 0
    Выполнение клиентского JS-кода на сервере? Звучит не очень хорошо. Только если вы проанализируете код и убедитесь, что вызываются только разрешенные функции, нет мертвых циклов и т. Д. Не легко.
Показать ещё 8 комментариев
Теги:
abstract-syntax-tree
esprima
escodegen

2 ответа

1

Самый безопасный способ - создать собственный анализатор/интерпретатор для некоторого подмножества javascript (или любого другого языка сценариев) или вашего собственного домена. Это большая работа, но все же намного проще и безопаснее, чем поддержка изолированной javascript VM на сервере и связь с ней.

  • 0
    спасибо за Ваш ответ. Да, я согласен, и это была моя первоначальная мысль, но вы правы, это большая работа, поэтому я подумал, что лучше сначала спросить сообщество. Кто-то должен был сделать это раньше
  • 0
    @JohnDoherty Я думаю, что есть много переводчиков игрушечных языков, но какой из них соответствует вашим конкретным требованиям («анализ строки»), мы не можем сказать.
0

Идея:

  1. пользователи пишут свои пользовательские функции на веб-странице

  2. веб-страница извлекает данные с сервера

  3. пользовательская функция применяется к данным на стороне клиента

  4. результаты отправляются обратно на сервер (убедитесь, что результаты не скомпрометированы)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню