безопасное выполнение стороннего javascript (обслуживаемого из некоторой БД) - PullRequest
2 голосов
/ 31 января 2012

Я создаю приложение, в котором сгенерированные пользователем функции javascript хранятся в базе данных и, в свою очередь, передаются ряду других пользователей. Сценарии должны быть проверены лицом с правами администратора (который должен быть доверяемым - но они выбираются самими пользователями, и поэтому своего рода проверка представляется необходимой)

Функции, которые будут выполняться, являются первичными только для целей расчета - доступ к DOM или (по крайней мере, на данный момент) никаких глобальных объектов не требуется.

Допустим, пользователь определяет функцию, считающую слова строки (в качестве простого примера).

Мой подход на данный момент заключается в том, чтобы обернуть функцию в замыкание, передать объект с входными свойствами и определить локальное окно var внутри него, чтобы сделать этот глобальный объект недоступным (очевидно, этого недостаточно - перебирая все свойства объекта окна и определение их локально может быть возможным, но в свою очередь может нарушить некоторые важные функции, и этого будет недостаточно)

Следующая идея заключалась в том, чтобы на лету обернуть функцию в вызов ADsave, чтобы предотвратить функциональность, которая может быть вредной (и доступ к глобальной области видимости), но для этого потребуется проверка кода с помощью опции JSLint / adsave на the-fly (и я просто не могу найти какой-либо материал о том, как это сделать ...!)

Следующий подход - использовать что-то вроде Caja (что фактически исключает возможность легкого добавления новых функций, так как код javascript должен быть «преобразован» в версию кода Caja (и это не может быть сделано моим собственное приложение на лету).

Поскольку мне придется проверять функции всякий раз, когда они возвращаются с сервера (а не только тогда, когда они были созданы на клиенте), ADsave, похоже, пока является лучшим решением

Есть ли у кого-нибудь решение упомянутых выше проблем (или, возможно, лучшее решение - я имею в виду, что выполнение стороннего jscript (обслуживаемого из некоторой БД) безопасным способом должно быть довольно распространенной задачей в наше время.

Ответы [ 2 ]

1 голос
/ 14 февраля 2013

Следующий подход - использовать что-то вроде Caja (что фактически исключает возможность легкого добавления новых функций, поскольку код javascript должен быть «преобразован» в версию кода Caja (и это не может быть сделано моим собственное приложение на лету).

В современных браузерах (с достаточно корректной реализацией стандарта ECMAScript 5) Caja не нуждается в крупных преобразованиях контента и может работать полностью на стороне клиента, включая поддержку eval().

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

Я не знаю, если вы пытаетесь избежать такого подхода, но я бы просто выполнил Javascript в <iframe>.

Используйте iframe, который загружает страницу только с необходимым Javascript, и все ваши песочницы позаботятся о вас.

Редактировать - как обсуждалось в комментариях к этому ответу, чтобы предотвратить доступ сценариев в iframe к родительскому документу, вы можете разместить страницу iframe на поддомене. Таким образом, браузеры будут использовать отдельные файлы cookie и запретят доступ к объекту window.parent.

...