Ответ 1
Вы можете использовать Microsoft Web Sandbox или Google Caja.
Можно ли использовать javascript для песочницы, переопределяя различные функции, такие как alert
, window.location
и eval
?
Я не ищу идеального решения. Я уверен, что некоторые люди все равно найдут способ переставить divs, чтобы описать ругательства или что-то злонамеренное, но если бы я мог отключить переадресацию страниц на 100%, я был бы в основном счастлив.
Я пробовал в Chrome и делал что-то вроде
context={}; //use this to prevent `this` from being `window`
context.f=function(){
var window=null,location=null,eval=function(){};
console.log(window); //also the other two
};
context.f();
кажется многообещающим. Если я заменил строку console
на код, отправленный пользователем (проверка на балансировку пар), это была бы абсурдно плохая идея или слегка плохая идея? В Chrome я все еще могу сломать вещи, перейдя через this
к функции и переопределяя вещи, но это было бы приемлемо для меня.
Вы можете использовать Microsoft Web Sandbox или Google Caja.
Вот еще два возможных решения (отказ от ответственности: я только начал искать это сам, поэтому я не эксперт).
Это очень интересно, использует веб-работников в ненадежном коде песочницы:
https://github.com/eligrey/jsandbox
хотя, интересно, больше ли это maintaned, или если следующий атрибут iframe html5 "sandbox" заменяет его:
vm.js - это виртуальная машина javascript, реализованная в чистом coffeescript (должна работать в относительно старых браузерах) и может быть использована как легкий в -процессорная песочница. Он может разбивать бесконечные циклы и защищает глобальные объекты от модификаций.
В зависимости от того, что это нужно сделать, вы всегда можете запустить javascript в среде без контекста документа, например, через Rhino, а затем захватить результаты на стороне сервера и очистить/вставить их.
Вы также можете попробовать Douglas Crockford AdSafe, хотя он ограничивает возможности JavaScript.
Маскировка глобальных переменных локальными переменными на самом деле небезопасна. Предварительная обработка ненадежного кода с помощью таких инструментов, как Google Caja, может помочь, но это не обязательно:
Для веб-браузера достаточно просто запустить код в Worker - сейчас он довольно ограничен.. См. Обновление ниже
Для Node.js вы можете fork() в изолированном процессе и выполнить там код (используя модуль child_process).
Есть также некоторые библиотеки для упрощения песочницы, одна из созданных мной - Jailed (там также demo с помощью JS-Console, которая выполняет переданный пользователем код в песочнице).
Обновление: очевидно, я ошибался, рабочий сам по себе не защищен, так как он может обращаться к некоторым материалам того же происхождения, например, к IndexedDB. Я представил вопрос . Решение состоит в том, чтобы добавить рабочего в sasndboxed iframe, который также реализован в моей библиотеке Jailed.
Использовать атрибут iframe для "песочницы" HTML5.
Я сделал для этого функцию javascript.
function evalUnsafe(userCode) {
var vars = [];
var legal = {console: 'console', alert: 'alert'};
for(var b in this) {
if (!(b in legal)) {
vars.push(b);
}
}
var funcs = vars.join(",");
var code = "(function sandbox(" + funcs + ") {function runthis() {eval(" + JSON.stringify(userCode) + ");};var a = new runthis();})();";
eval(code);
}
И тогда вы можете сделать это
Пример 1:
evalUnsafe("alert(window);");
Пример 2 (из файла php):
evalUnsafe(<?php echo json_encode(file_get_contents("example.js"));?>);
Вы можете скачать его здесь: