Javascript Sandbox?

Можно ли использовать 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 к функции и переопределяя вещи, но это было бы приемлемо для меня.

Ответы

Ответ 2

Вот еще два возможных решения (отказ от ответственности: я только начал искать это сам, поэтому я не эксперт).

Это очень интересно, использует веб-работников в ненадежном коде песочницы:

https://github.com/eligrey/jsandbox

хотя, интересно, больше ли это maintaned, или если следующий атрибут iframe html5 "sandbox" заменяет его:

http://www.w3schools.com/html5/att_iframe_sandbox.asp

Ответ 3

vm.js - это виртуальная машина javascript, реализованная в чистом coffeescript (должна работать в относительно старых браузерах) и может быть использована как легкий в -процессорная песочница. Он может разбивать бесконечные циклы и защищает глобальные объекты от модификаций.

Ответ 4

В зависимости от того, что это нужно сделать, вы всегда можете запустить javascript в среде без контекста документа, например, через Rhino, а затем захватить результаты на стороне сервера и очистить/вставить их.

Ответ 5

Вы также можете попробовать Douglas Crockford AdSafe, хотя он ограничивает возможности JavaScript.

Ответ 6

Маскировка глобальных переменных локальными переменными на самом деле небезопасна. Предварительная обработка ненадежного кода с помощью таких инструментов, как Google Caja, может помочь, но это не обязательно:

  • Для веб-браузера достаточно просто запустить код в Worker - сейчас он довольно ограничен.. См. Обновление ниже

  • Для Node.js вы можете fork() в изолированном процессе и выполнить там код (используя модуль child_process).

Есть также некоторые библиотеки для упрощения песочницы, одна из созданных мной - Jailed (там также demo с помощью JS-Console, которая выполняет переданный пользователем код в песочнице).

Обновление: очевидно, я ошибался, рабочий сам по себе не защищен, так как он может обращаться к некоторым материалам того же происхождения, например, к IndexedDB. Я представил вопрос . Решение состоит в том, чтобы добавить рабочего в sasndboxed iframe, который также реализован в моей библиотеке Jailed.

Ответ 7

Использовать атрибут iframe для "песочницы" HTML5.

Ответ 8

Я сделал для этого функцию 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"));?>);

Вы можете скачать его здесь:

https://github.com/oyvindrestad/javascriptsandbox