Действительно ли возможно поиграть в песочнице JavaScript, работающий в браузере?

Это свойство overflow-x, которое вы должны объявить - в обертке элемента блока (div). Я предполагаю, что вы имеете в виду что-то подобное:

<div style="overflow-x: scroll">
    <table>
        <caption>Refrences</caption>
        <thead>
            <tr>
                <th>NAME</th>
                <th>RELATIONSHIP</th>
                <th>COMPANY</th>
                <th>PHONE NUMBER</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <input type="text" id="refName1" name="refName1" placeholder="John Doe" required="">
                </td>
                <td>
                    <input type="text" id="refRel1" name="refRel1" placeholder="Relationship" required="">
                </td>
                <td>
                    <input type="text" id="refComp1" name="refComp1" placeholder="Company Name" required="">
                </td>
                <td>
                    <input type="text" id="refPhone1" name="refPhone1" placeholder="Phone #">
                </td>
            </tr>
            <tr>
                <td>
                    <input type="text" id="refName1" name="refName1" placeholder="John Doe" required="">
                </td>
                <td>
                    <input type="text" id="refRel1" name="refRel1" placeholder="Relationship" required="">
                </td>
                <td>
                    <input type="text" id="refComp1" name="refComp1" placeholder="Company Name" required="">
                </td>
                <td>
                    <input type="text" id="refPhone1" name="refPhone1" placeholder="Phone #">
                </td>
            </tr>
            <tr>
                <td>
                    <input type="text" id="refName1" name="refName1" placeholder="John Doe" required="">
                </td>
                <td>
                    <input type="text" id="refRel1" name="refRel1" placeholder="Relationship" required="">
                </td>
                <td>
                    <input type="text" id="refComp1" name="refComp1" placeholder="Company Name" required="">
                </td>
                <td>
                    <input type="text" id="refPhone1" name="refPhone1" placeholder="Phone #">
                </td>
            </tr>
            <tr>
                <td>
                    <input type="text" id="refName1" name="refName1" placeholder="John Doe" required="">
                </td>
                <td>
                    <input type="text" id="refRel1" name="refRel1" placeholder="Relationship" required="">
                </td>
                <td>
                    <input type="text" id="refComp1" name="refComp1" placeholder="Company Name" required="">
                </td>
                <td>
                    <input type="text" id="refPhone1" name="refPhone1" placeholder="Phone #">
                </td>
            </tr>
        </tbody>
    </table>
</div>
136
задан Walter Rumsby 12 October 2008 в 06:17
поделиться

8 ответов

Google Caja является переводчиком от источника к источнику, который "позволяет, Вы, чтобы поместить недоверяемый сторонний HTML и JavaScript встраиваете на своей странице и все еще быть безопасными".

54
ответ дан 23 November 2019 в 23:41
поделиться

Где является этим пользователем JavaScript, прибывающий из?

нет очень, можно сделать о пользователе, встраивающем код в страницу и затем называющем ее от их браузера (см. Механика, http://www.greasespot.net/ ). Это - просто что-то, что браузеры делают.

Однако при хранении сценария в базе данных, затем получите его и оценка () он, затем можно очистить сценарий, прежде чем он будет выполнен.

Примеры кода, который удаляет все окно. и документ. ссылки:

 eval(
  unsafeUserScript
    .replace(/\/\/.+\n|\/\*.*\*\/, '') // Clear all comments
    .replace(/\s(window|document)\s*[\;\)\.]/, '') // removes window. or window; or window)
 )

Это пытается предотвратить следование из того, чтобы быть выполняемым (не протестированный):

window.location = 'http://mydomain.com';
var w = window  ;

существует много ограничений, необходимо было бы обратиться к небезопасному пользовательскому сценарию. К сожалению, нет никакого 'контейнера песочницы', доступного для JavaScript.

-4
ответ дан 23 November 2019 в 23:41
поделиться

Можно перенести код пользователя в функцию, которая переопределяет запрещенные объекты как параметры - они затем были бы undefined при вызове:

(function (alert) {

alert ("uh oh!"); // User code

}) ();

, Конечно, умные взломщики могут обойти это путем осмотра DOM JavaScript и нахождения непереопределенного объекта, который содержит ссылку на окно.

<час>

Другая идея сканирует код пользователя с помощью инструмента как jslint. Удостоверьтесь, что это установлено не иметь никаких предварительно установленных переменных (или: только переменные, которые Вы хотите), и затем если какие-либо globals установлены или получены доступ, не позволяют сценарию пользователя использоваться. Снова, могло бы быть уязвимо для обхода DOM - возражает, что пользователь может создать литералы использования, мог бы иметь неявные ссылки на объект окна, к которому можно было получить доступ для выхода из песочницы.

-6
ответ дан 23 November 2019 в 23:41
поделиться

1) предположим, что у Вас есть код для выполнения:

var sCode = "alert(document)";

Теперь, предположите, что Вы хотите выполнить его в песочнице:

new Function("window", "with(window){" + sCode + "}")({});

Эти две строки при выполнении перестанут работать, потому что "аварийная" функция не доступна от "песочницы"

2), И теперь Вы хотите подвергнуть члена объекта окна с Вашей функциональностью:

new Function("window", "with(window){" + sCode + "}")({
    'alert':function(sString){document.title = sString}
});
<час>

Действительно можно добавить выход кавычек и сделать другую полировку, но я предполагаю, что представление является четким.

-3
ответ дан 23 November 2019 в 23:41
поделиться

Все поставщики браузера и спецификация HTML5 работают для фактического свойства песочницы для разрешения поигравшего в песочнице iframes - но это все еще ограничено iframe гранулярностью.

В целом, никакая степень регулярных выражений, и т.д. может безопасно санировать произвольного пользователя, предоставленного JavaScript, поскольку он ухудшается к проблеме остановки :-/

3
ответ дан 23 November 2019 в 23:41
поделиться

Взгляните на ADsafe Douglas Crockford:

ADsafe делает безопасным поместить гостевой код (такой как заданная сценарием реклама или виджеты третьего лица) на любой веб-странице. ADsafe определяет подмножество JavaScript, который достаточно мощен, чтобы позволить гостевому коду выполнять ценные взаимодействия, одновременно предотвращая злонамеренное или случайное повреждение или проникновение. Подмножество ADsafe может быть проверено механически инструментами как JSLint так, чтобы никакой человеческий контроль не был необходим для рассмотрения гостевого кода для безопасности. Подмножество ADsafe также осуществляет хорошие методы кодирования, увеличивая вероятность, что гостевой код будет работать правильно.

Вы видите пример того, как использовать ADsafe путем рассмотрения template.html и template.js файлы в репозиторий GitHub проекта .

32
ответ дан 23 November 2019 в 23:41
поделиться

Я работал над упрощенной песочницей js, чтобы пользователи могли создавать апплеты для моего сайта. Хотя я все еще сталкиваюсь с некоторыми проблемами с предоставлением доступа к DOM (parentNode просто не позволяет мне держать вещи в безопасности = /), мой подход заключался в том, чтобы просто переопределить объект окна с некоторыми из его полезных / безвредных членов, а затем eval () пользователем код с этим переопределенным окном в качестве области действия по умолчанию.

Мой "основной" код выглядит так ... (я не показываю его полностью;)

function Sandbox(parent){

    this.scope = {
        window: {
            alert: function(str){
                alert("Overriden Alert: " + str);
            },
            prompt: function(message, defaultValue){
                return prompt("Overriden Prompt:" + message, defaultValue);
            },
            document: null,
            .
            .
            .
            .
        }
    };

    this.execute = function(codestring){

        // here some code sanitizing, please

        with (this.scope) {
            with (window) {
                eval(codestring);
            }
        }
    };
}

Итак, я могу создать песочницу и использовать ее execute () чтобы запустить код. Кроме того, все новые объявленные переменные в коде eval'd в конечном итоге будут привязаны к области действия execute (), поэтому не будет конфликтов имен или путаницы с существующим кодом.

Хотя глобальные объекты по-прежнему будут доступны,

-5
ответ дан 23 November 2019 в 23:41
поделиться

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

Ниже приведен пример API:

jsandbox
    .eval({
      code    : "x=1;Math.round(Math.pow(input, ++x))",
      input   : 36.565010597564445,
      callback: function(n) {
          console.log("number: ", n); // number: 1337
      }
  }).eval({
      code   : "][];.]\\ (*# ($(! ~",
      onerror: function(ex) {
          console.log("syntax error: ", ex); // syntax error: [error object]
      }
  }).eval({
      code    : '"foo"+input',
      input   : "bar",
      callback: function(str) {
          console.log("string: ", str); // string: foobar
      }
  }).eval({
      code    : "({q:1, w:2})",
      callback: function(obj) {
          console.log("object: ", obj); // object: object q=1 w=2
      }
  }).eval({
      code    : "[1, 2, 3].concat(input)",
      input   : [4, 5, 6],
      callback: function(arr) {
          console.log("array: ", arr); // array: [1, 2, 3, 4, 5, 6]
      }
  }).eval({
      code    : "function x(z){this.y=z;};new x(input)",
      input   : 4,
      callback: function(x) {
          console.log("new x: ", x); // new x: object y=4
      }
  });
23
ответ дан 23 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

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