Недавно сидя на диване, я решил поиграться с MutationObserver. Это достаточно знатная фича, с помощью которой можно слушать DOM дерево. Сейчас достаточно распространена.

Так же с помощью MutationObserver можно не только лишь слушать, но и по факту предотвращать изменения DOM дерева. Подумав об этом, я сделал библиотечку, которая может блокировать ненужные теги и атрибуты, которыми вы все равно не стали пользоваться.

Выглядит это вот так:

{
    "tagsType": "blacklist",
    "tags": [
        "script"
    ],
    "attributesType": "blacklist",
    "attributes": {
        "*": ["onerror"]
    }
}

кря

С помощью манифеста мы для примера отрезали все теги script, и все атрибуты onerror, которые не должно выйти добавить после запуска strict_dom. Т.е. по сути так можно вырезать многие потенциальные XSS уязвимости на сайте (в данном варианте не особо на самом деле), или отучить себя и свою команду использовать какие-либо устарелые HTML теги и атрибуты.

Манифест может иметь следующие параметры:

  • outdatedUrl — ссылка на которую будет редиректить, если браузер старый (по умолчанию отключено)
  • tagsType — выбираем принцип блеклиста или вайтлиста для удаления тегов
  • tags — список ненужных тегов
  • attributesType — выбираем принцип блеклиста или вайтлиста для удаления атрибутов к тегам
  • attributes — список ненужных атрибутов

Собственно, все это работает через MutationObserver, а код можете подглядеть тут
Поделиться с друзьями
-->

Комментарии (11)


  1. rPman
    18.07.2017 10:47

    код расширений браузера так можно заблокировать?


    1. floatbreaker
      18.07.2017 16:17

      тот код, который инсертится экстеншном на страницу, думаю можно


    1. mitinsvyat
      18.07.2017 16:24

      Есть проблемка в том, что если запустить 2 обзервера, которые конфликтуют, то страница просто зависнет, пока обзерверы будут друг другу ДОМ менять.

      Но вообще, расширения обычно запускаются в изолированном мире, и их код не конфликтует. Но часто чтобы войти в контекст страницы экстеншены инжектят код. Такое обрезать можно.


  1. justboris
    18.07.2017 12:26
    +1

    Забавный пример, но загрузку нежелательных скриптов и картинок лучше запрещать через CSP


    1. mitinsvyat
      18.07.2017 16:25

      Таки правда


  1. Sirion
    18.07.2017 13:14
    +1

    Насколько я понял из чтения кода, либа не предотвращает создание, а удаляет свежесозданное. Не успеет ли что-то нежелательное произойти в промежутке между созданием и удалением?


    1. mitinsvyat
      18.07.2017 16:26

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


    1. mitinsvyat
      18.07.2017 16:37

      В фаерфоксе все поплыло)))


    1. mitinsvyat
      18.07.2017 16:40

      вернее script успел запустицо
      правд не понимаю, это из за того, что удаление происходит после позже запуска, или таки там асинхронно…


  1. ReklatsMasters
    19.07.2017 11:47

    Только приготовился читать статью как она тут же кончилась.


    1. mitinsvyat
      19.07.2017 11:58

      Да чет расписывать не нашлось ничего особо ?\_(?)_/?