У меня есть проект, в котором пользователи могут отправлять код JavaScript. Однако хочу проверить, что внутри представленного кода используются только методы и свойства определенного объекта javascript. например имя моего объекта - X, тогда пользователям должно быть разрешено использовать только:
X.method1();
X.method2();
X.method3(X.propertyA);
if (X.booleanPropertyB)
{
X.method(X.propertyWOW);
}
Им НЕ должно быть разрешено создавать новые переменные или использовать свойства или методы объектов javascript, таких как документ, окно или навигатор.
Что было бы хорошим подходом для проверки скриптов в соответствии с этими правилами? Либо внутри JavaScript, либо с помощью валидатора на стороне сервера, например. написано на Java.
Пока что моя идея состоит в том, чтобы использовать валидатор на стороне сервера и проверять, что первые непробельные символы после каждой точки с запятой, а также после каждой открывающей фигурной скобки равны «X». или зарезервированное слово вроде if, else, while, for и т. д.
Тем не менее, я думаю, что я чрезмерно упрощаю его, и хотел бы узнать ваши мысли о том, является ли это разумным подходом.
Спасибо.
Если вы спрашиваете об этом, я бы дважды подумал, является ли разрешение пользователям отправлять произвольный код хорошей идеей. Вам действительно нужно знать, что вы делаете, чтобы не облажаться.
В качестве примера я могу запустить свой код через jsfuck.com и преодолеть любую текстовую защиту, которую вы устанавливаете.
@MadaraUchiha Я согласен и спасибо за пример jsfuck. Я знаю риски. Но JavaScript настолько удобен, что доступны отладчики (firebug и т. д.) И множество js-движков. Я думал о других языках сценариев (groovy, python, lua), но ни один из них не был настолько мощным, портативным и широко известным. Я учту все ответы здесь, чтобы найти хорошее решение.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша проблема состоит из двух частей:
Вы можете добиться этого, высмеивая свой объект в тестах и проверяя, используются ли соответствующие методы объекта. Смотрите здесь, как это делается с Жасмин
Ограничить пользователям доступ к определенным API Самый простой способ добиться этого - запустить код пользователя внутри замыкания. например
;(function(window, document, console, eval, alert, setTimeout, setInterval){
// run user code here
// window, document etc. are inaccesible and null in this context
})(null, null, null, null, null, null);
Это, однако, не мешает пользователям объявлять свои собственные вещи, переменные, функции и тому подобное.
Может быть, здесь поможет линтер, не уверен.