Какой-то способ есть, чтобы скроллировать в “sandbox” eval в языке сценариев JavaScript?

Я знаю, что в годы, не существовал никакой способ использовать eval в языке сценариев JavaScript, не предоставляя доступа ко всему приложению к коду, выполненному в eval. А следовательно не возможно использовать eval с кодом возможно не заслуживающий доверия. Из-за именно этого, из-за выбор unsafe-eval существуй в CSP (content security policy), например.

Мой вопрос: Уже существует способ, чтобы делать безопаснее eval? Может быть, с ECMAScript 5 или 6?

В новом приложении, мне хотелось бы позволять пользователи использовать eval, не предоставляя всех разрешений им. Идеальное будет состоять в том, чтобы они только смогли работать с сообщением специфическая DOM, и локальных переменных.

Это сон?

23
задан 19.12.2016, 16:38
3 ответа

Решение, чтобы получать действительно изолированную среду, могло бы быть той, которую используют онлайн программные средства тип http://jsbin.com или http://jsfiddle.net.

Происходи из-за того, что использует iframes и внутри frame возвращать код в этикетке script (не является необходимым eval). В этом случае применяется политика того же источника (same-origin policy), с которым себе будет должен подавать код гость (внешняя веб-страница) под доменом или различным субдоменом страницы, приглашенной (та, которая содержит код, который хочется выполнять изолированной формы).

Пример:

Huésped: en el dominio safe.domain.com
<html>
    <body>
    <!-- código de la aplicación huesped -->
    <iframe src="//sandbox.domain.com">
    </body>
</html>

Invitado: en el dominio sandbox.domain.com
<html>
    <body>
        <script>
             <!-- Script de origen no seguro -->
        </script>
    </body>
</html>

Код script не страховка зазналась бы со стороны пользователей DB (например), и возвратилась бы динамической формы с домена sandbox.domain.com в примере.

Замечание:

Таким образом, не было бы возможно работать с результатом кода, выполненного в приглашенном frame.

16
ответ дан 01.12.2019, 08:16

Mozzilla работает в XPCOM, которые сходные с восхвалением COM Windows, чтобы позволять выполнять этот тип решений в Sandbox, настроенном посредством функции evalInSandbox

Пока он не был готов, самый реальный выбор на данный момент состоит в том, чтобы производить контент, который нужно оценивать посредством чрезмерно ограничительного parsing и с вышедшая крайне ограниченная относительно tags приемлемые, так как включенный url's и изображения могут присоединяться, что выполнимый, и очень важный код состоит в том, чтобы не обрабатывать идеально javascript, итак, если делается вставление, подвергаются риску того, что он работает, сделав F5, даже перед тем, как быть оцененным.

5
ответ дан 01.12.2019, 08:16

Предложение HTML5 (IE10+)

Признак sandbox элемента iframe он дает нам точно то, в чем мы нуждаемся, чтобы налаживать ограничения на вставленном в рамку контенте. Мы можем обучать в браузер для того, чтобы он загрузил контент одного iframe специфическое средство в среде низких привилегий.

Используя sandbox="allow-scripts" на одном iframe, мы даем возможность во вставленный в рамку документ возможности выполнять JavaScript (но не создания popups).

Когда вставленный в рамку документ происходит, что главная страница, рекомендуется настоятельно, чтобы мы не использовали allow-scripts и allow-same-origin в то же время, так как это позволило бы, что вставленный в рамку документ удалил, посредством программирования, признак sandbox.

Используя возможность API postMessage, документ отец и включение могут интерпроисходить коммуникация между ними печатая сообщения и слушая ответы.

Пример:

Я храню в архиве index.html:

<!-- Documento padre -->
<!DOCTYPE html>
<html>
  <head>
    <style>
    textarea {
      display: block;
      width: 300px;
      height: 150px;
    }
    iframe {
      display: none;
    }
    </style>
  </head>
  <body>
    <textarea id="codigo">
function sumar(a, b) {
  return a + b;
}

sumar(1, 2);
    </textarea>
    <button id="ejecutar">Ejecutar</button>
    <iframe id="sandbox" src="sandbox.html" sandbox="allow-scripts"></iframe>
    <script>
      var sandbox = document.getElementById('sandbox');
      var codigo = document.getElementById('codigo');
      // Suscribimos al click del boton
      document.getElementById('ejecutar').addEventListener('click', function () {
        // Enviamos el mensaje sin especificar el origen (*)
        sandbox.contentWindow.postMessage(codigo.value, '*');
      });
      // Escuchamos la respuesta del frame
      window.addEventListener('message', function (evt) {
        // Normalmente se debe verificar el origen del mensaje es de la fuente esperada
        if (evt.data && (
          (evt.origin === "null" && evt.source === sandbox.contentWindow) || 
          evt.origin === (window.location.protocol + "//" + window.location.host))
        ) {
          alert('Result: ' + evt.data);
        }
      });
    </script>
  </body>
</html>

Я храню в архиве sandbox.html:

<!-- Documento enmarcado -->
<!DOCTYPE html>
<html>
  <head>
    <script>
      window.addEventListener('message', function (evt) {
        // Se debe validar que el origen del mensaje sea el esperado.
        // En este caso esperamos que sea el mismo origen.
        if (evt.origin !== (window.location.protocol + "//" + window.location.host)) {
          return;
        }
        var resultado = '';
        try {
          resultado = eval(evt.data);
        } catch (e) {
          resultado = 'eval() arrojo una excepción.';
        }
        evt.source.postMessage(resultado, evt.origin);
      });
    </script>
  </head>
</html>

Оцененный код не имеет доступа к чувствительной информации как куки-файлы, не имеет доступа к DOM документа отец, не может загружать дополнения, открывать новые окна или любую из другой причиняющей беспокойство или злонамеренной активности.

Рекомендуемое чтение:

Play safely in sandboxed IFrames (на Английском языке)

5
ответ дан 01.12.2019, 08:16

Теги

Похожие вопросы