forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   JavaScript / HTML (http://forum.boolean.name/forumdisplay.php?f=136)
-   -   Выполнение кода JavaScript в безопасном окружении (http://forum.boolean.name/showthread.php?t=19203)

Phantom 30.05.2014 22:13

Выполнение кода JavaScript в безопасном окружении
 
Хочу выполнять в контексте страницы непроверенный JavaScript код, который должен реализовывать только логику в рамках некоего предоставленного API. То есть у кода не должно быть доступа к глобальному объекту (window), код не должен уметь выкидывать алерты, вызывать eval и т. п. Это вообще возможно хотя бы в последних браузерах, на крайняк в последнем хроме? Запилил вот такой тест: http://jsfiddle.net/7Ewx5/ вроде бы всё безопасно, но JavaScript - такой язык, что там неявно что-то может ссылаться на window, а я об этом даже не подозреваю.

P.S. Скорость работы, оптимизации памяти и прочее мне не важны, главное добиться безопасного окружения.

moka 31.05.2014 00:22

Ответ: Выполнение кода JavaScript в безопасном окружении
 
Web Workers тебе в помощь - изолированный поток, и всё что тебе нужно (никакого доступа ко всяким window и т.п.).
Поддерживаемые бруозеры.

Phantom 31.05.2014 00:31

Ответ: Выполнение кода JavaScript в безопасном окружении
 
Блин, читал же про них, совсем забыл. Я ещё частично в девяностых живу, не успеваю за новыми технологиями. =)

Phantom 31.05.2014 01:03

Ответ: Выполнение кода JavaScript в безопасном окружении
 
Впрочем внутри воркера мне всё равно придётся делать те же костыльные финты, чтобы закрыть доступ к функциям вроде setTimeout.

moka 31.05.2014 10:05

Ответ: Выполнение кода JavaScript в безопасном окружении
 
Цитата:

Сообщение от Phantom (Сообщение 281765)
Впрочем внутри воркера мне всё равно придётся делать те же костыльные финты, чтобы закрыть доступ к функциям вроде setTimeout.

А почему ты не хочешь позволить использовать setTimeout?

Phantom 31.05.2014 16:46

Ответ: Выполнение кода JavaScript в безопасном окружении
 
Потому что планируется в этой песочнице выполнять полностью синхронный код. Хотя сам принцип действия воркеров асинхронен как я понял. Ещё непонятно, почему контексты воркера и функции запущенной через setTimeout отличаются:
PHP код:

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 в идеале.

moka 31.05.2014 20:02

Ответ: Выполнение кода JavaScript в безопасном окружении
 
У тебя в onmessage, callback будет вызываться в контексте объекта на котором onmessage триггерит. А setTimeout глобально естественно.

Но этот глобальный контекст, локален самому воркеру.

Для node есть конечно, гугл выдаёт кучу результатов (не заставляй других гуглить): https://github.com/pgriess/node-webworker

Phantom 01.06.2014 02:47

Ответ: Выполнение кода JavaScript в безопасном окружении
 
Меня сбило с толку то, что я объявляю событие onmessage прямо внутри воркера в глобальной переменной. Я ожидал, что оно будет иметь глобальный контекст воркера (это ведь его событие), а там какой-то DedicatedWorkerGlobalScope. Как по мне, странно.

А есть какая-то переменная, ссылающаяся на this воркера? Или придётся сделать global=this; ? Не то, чтобы есть такая необходимость, просто хочется знать. В гугле не нашёл.

moka 01.06.2014 10:10

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

Web Worker выполняется как отдельный файл и общение с ним происходит путём сообщений. В том файле делай что хочешь.

Ссылаться на переменные в контекстах выше - никто не запрещает. Забей на глобальный контекст, это же JS, тут видимость контекстов "наследуется".


Часовой пояс GMT +4, время: 09:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot