Какой риск или обязательства при использовании eval () следующим образом - PullRequest
3 голосов
/ 09 октября 2010

Я работаю над созданием одной из этих игр-роботов.Пользователь создает робота и затем помещает его на поле битвы с другими роботами.

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

На сегодняшний день единственное решение, которое я нашел, - это использовать функцию javascript eval () для выполнения кода, написанного пользователями.

Я хочу знать две вещи:

  1. У кого-нибудь есть альтернативные предлагаемые реализации, которые все еще позволяют пользователям писать в javascript?

  2. Могут ли пользователи сделать что-нибудь с этим недостатком, которыйони не могли сделать, используя инструменты отладки JavaScript Firefox?(т.е. самостоятельно, без использования функции eval ())

Примечание. Код javascript хранится в mySQL.ajax используется для извлечения jscript и отображения для пользователей.ajax используется для отправки обновлений javascript обратно в SQL.Весь код, представленный пользователями и собирающийся быть вставленным в базу данных, запускается с помощью функции "clean ()".

Ответы [ 5 ]

3 голосов
/ 09 октября 2010

То есть, по сути, вы позволите UserA писать javascript, который будет отображаться в браузере UserB?

Если так, то это звучит как довольно плохая идея;)

Вы можете использовать средний слой, такой как http://code.google.com/p/google-caja/wiki/CajaCajole, чтобы сделать его немного более безопасным.

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

Другим примером может быть внедрение тега сценария, который затем получает «полную» полезную нагрузку, которая может привести ко всем видам вреда, например, fx показывает дружественное всплывающее окно с новой эксклюзивной загружаемой игрой Portal, с которой вы заключили специальное соглашение Steam сделать доступным и т. Д. Просто скачайте и запустите! Затем он создает скрытый iframe для некоторого троянского CDN. :)

2 голосов
/ 09 октября 2010

Отличная идея.

eval имеет небольшой недостаток по сравнению с другими методами внедрения скриптов.

Вы можете создать функцию на лету с помощью Function.Попробуйте это:

var command = "alert(123)";
var doStuff = new Function(command);
doStuff();

eval выполняется в частной области, Function выполняется в глобальной области.Это означает, что если у вас есть внутреннее значение, которое боты не могут изменять, они могут иметь к нему доступ, если вы выполните их логику через eval, но не должны, если вы используете Function.Более подробная информация здесь:

замена строки на функцию в javascript (не eval)

2 голосов
/ 09 октября 2010

Я никогда не думал, что скажу это, но Проект Нарцисс может быть вам полезен.Это движок JavaScript, написанный на JavaScript.

0 голосов
/ 09 октября 2010

Самое важное, чтобы страницы, содержащие пользовательские сценарии, работали в отдельном «изолированном» домене, в котором нет файлов cookie сеанса с основного сайта, которые могут быть подключены к учетным записям пользователей и т. Д.

Это, вместе с некоторым ручным мониторингом представлений, уже отнимет много рисков внедрения скрипта.

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

Что бы я не делал, это eval() пользовательский JavaScript внутри основного домена проекта. Это открывает слишком много реальных опасностей атаки.

0 голосов
/ 09 октября 2010

Многие библиотеки AJAX могут быть настроены для автоматического выполнения возвращаемого JS. Нет необходимости в eval ().

...