Ограничить / проверить код JavaScript определенной библиотекой

У меня есть проект, в котором пользователи могут отправлять код 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 и т. д.

Тем не менее, я думаю, что я чрезмерно упрощаю его, и хотел бы узнать ваши мысли о том, является ли это разумным подходом.

Спасибо.

Может быть, здесь поможет линтер, не уверен.

connexo 24.10.2018 11:19

Если вы спрашиваете об этом, я бы дважды подумал, является ли разрешение пользователям отправлять произвольный код хорошей идеей. Вам действительно нужно знать, что вы делаете, чтобы не облажаться.

Madara's Ghost 24.10.2018 11:19

В качестве примера я могу запустить свой код через jsfuck.com и преодолеть любую текстовую защиту, которую вы устанавливаете.

Madara's Ghost 24.10.2018 11:21

@MadaraUchiha Я согласен и спасибо за пример jsfuck. Я знаю риски. Но JavaScript настолько удобен, что доступны отладчики (firebug и т. д.) И множество js-движков. Я думал о других языках сценариев (groovy, python, lua), но ни один из них не был настолько мощным, портативным и широко известным. Я учту все ответы здесь, чтобы найти хорошее решение.

haferblues 25.10.2018 00:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
37
1

Ответы 1

Ваша проблема состоит из двух частей:

  1. Убедитесь, что пользователи используют ваш объект X

Вы можете добиться этого, высмеивая свой объект в тестах и ​​проверяя, используются ли соответствующие методы объекта. Смотрите здесь, как это делается с Жасмин

  1. Ограничить пользователям доступ к определенным 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);
    

Это, однако, не мешает пользователям объявлять свои собственные вещи, переменные, функции и тому подобное.

Другие вопросы по теме