Есть ли способ использовать механику W ^ X в HTML5 для борьбы с XSS? - PullRequest
2 голосов
/ 03 апреля 2019

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

element.innerHTML = "<script>XSSCode</script>"

Я думаю, что это может сделать невозможными многие атаки XSS.

Редактировать: el.innerHTML - это только один пример добавленияновый тег сценария для веб-страницы.

1 Ответ

1 голос
/ 03 апреля 2019

В вашем вопросе два разных предложения.

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

Тогда вы предотвратите разбиение кода и заставите всех связывать полные сценарии. Также есть document.head.appendChild(...), где child = document.createElement("script") - эта функциональность как бы создает скрипт для "начальной загрузки страницы" прямо в <head/>. Во многих отношениях это плохая идея, чтобы предотвратить добавление скриптов в DOM документа.

теги, которые были вставлены динамически

... это другое предложение. Если вы говорите, что браузер все еще позволяет JS создавать теги script из кода, но el.innerHTML вообще не должен разрешать тег script, это не может быть слишком ограничивающим для некоторых случаев. Вы можете достичь этого, например, переопределив Element.prototype innerHTML. Это все еще плохая идея, но может помочь предотвратить определенную атаку.

Пример кода в принятом ответе здесь: Изменение внутреннего HTML, установленного на лету

По сути, вы бы сделали:

  var originalSet = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML').set;
  Object.defineProperty(Element.prototype, 'innerHTML', {
    set: function (value) {
        // change it (ok)
        var new_value = value.toString().replace(/<script/g,"");

        //Call the original setter
        return originalSet.call(this, new_value);
    }
  });

Это не очень надежно, и я бы не использовал его в производстве. Но я могу предположить, что это может помочь обнаружить проблему со сторонним скриптом.

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