|
JavaScript / HTML Создание динамической разметки страниц |
30.05.2014, 22:13
|
#1
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Выполнение кода JavaScript в безопасном окружении
Хочу выполнять в контексте страницы непроверенный JavaScript код, который должен реализовывать только логику в рамках некоего предоставленного API. То есть у кода не должно быть доступа к глобальному объекту (window), код не должен уметь выкидывать алерты, вызывать eval и т. п. Это вообще возможно хотя бы в последних браузерах, на крайняк в последнем хроме? Запилил вот такой тест: http://jsfiddle.net/7Ewx5/ вроде бы всё безопасно, но JavaScript - такой язык, что там неявно что-то может ссылаться на window, а я об этом даже не подозреваю.
P.S. Скорость работы, оптимизации памяти и прочее мне не важны, главное добиться безопасного окружения.
|
(Offline)
|
|
31.05.2014, 00:22
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Выполнение кода JavaScript в безопасном окружении
Web Workers тебе в помощь - изолированный поток, и всё что тебе нужно (никакого доступа ко всяким window и т.п.).
Поддерживаемые бруозеры.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
31.05.2014, 00:31
|
#3
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Выполнение кода JavaScript в безопасном окружении
Блин, читал же про них, совсем забыл. Я ещё частично в девяностых живу, не успеваю за новыми технологиями. =)
|
(Offline)
|
|
31.05.2014, 01:03
|
#4
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Выполнение кода JavaScript в безопасном окружении
Впрочем внутри воркера мне всё равно придётся делать те же костыльные финты, чтобы закрыть доступ к функциям вроде setTimeout.
|
(Offline)
|
|
31.05.2014, 10:05
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Выполнение кода JavaScript в безопасном окружении
Сообщение от Phantom
Впрочем внутри воркера мне всё равно придётся делать те же костыльные финты, чтобы закрыть доступ к функциям вроде setTimeout.
|
А почему ты не хочешь позволить использовать setTimeout?
|
(Offline)
|
|
31.05.2014, 16:46
|
#6
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Выполнение кода JavaScript в безопасном окружении
Потому что планируется в этой песочнице выполнять полностью синхронный код. Хотя сам принцип действия воркеров асинхронен как я понял. Ещё непонятно, почему контексты воркера и функции запущенной через setTimeout отличаются:
onmessage=function(e){ console.log(this); // [object DedicatedWorkerGlobalScope] for(var key in this){ console.log(key); } setTimeout(function(){ console.log(this); // [object global] for(var key in this){ console.log(key); } },0); }
Причём оба контекста, судя по их итерации, подобно window содержат список глобальных функций (setTimeout и прочие). Получается, воркер и порождённый им таймаут выполняются в двух различных глобальных контекстах?
Кстати, а как в node.js с воркерами? Я хотел бы код, совместимый с node.js в идеале.
|
(Offline)
|
|
31.05.2014, 20:02
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Выполнение кода JavaScript в безопасном окружении
У тебя в onmessage, callback будет вызываться в контексте объекта на котором onmessage триггерит. А setTimeout глобально естественно.
Но этот глобальный контекст, локален самому воркеру.
Для node есть конечно, гугл выдаёт кучу результатов (не заставляй других гуглить): https://github.com/pgriess/node-webworker
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.06.2014, 02:47
|
#8
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Выполнение кода JavaScript в безопасном окружении
Меня сбило с толку то, что я объявляю событие onmessage прямо внутри воркера в глобальной переменной. Я ожидал, что оно будет иметь глобальный контекст воркера (это ведь его событие), а там какой-то DedicatedWorkerGlobalScope. Как по мне, странно.
А есть какая-то переменная, ссылающаяся на this воркера? Или придётся сделать global=this; ? Не то, чтобы есть такая необходимость, просто хочется знать. В гугле не нашёл.
|
(Offline)
|
|
01.06.2014, 10:10
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Выполнение кода JavaScript в безопасном окружении
Зачем тебе глобальный хэндл от воркера? И вообще зачем тебе глобальный контекст? Имхо, ты сам себя путаешь.
Web Worker выполняется как отдельный файл и общение с ним происходит путём сообщений. В том файле делай что хочешь.
Ссылаться на переменные в контекстах выше - никто не запрещает. Забей на глобальный контекст, это же JS, тут видимость контекстов "наследуется".
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:26.
|