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

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

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

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

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

    кря

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

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

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

    Собственно, все это работает через MutationObserver, а код можете подглядеть тут
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 11

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

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

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

            0
            Таки правда
            +1
            Насколько я понял из чтения кода, либа не предотвращает создание, а удаляет свежесозданное. Не успеет ли что-то нежелательное произойти в промежутке между созданием и удалением?
              0
              На всех браузерах не тестировал, но в хроме выглядит так, что вызов события происходит синхронно.
                0
                В фаерфоксе все поплыло)))
                  0
                  вернее script успел запустицо
                  правд не понимаю, это из за того, что удаление происходит после позже запуска, или таки там асинхронно…
                  0

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

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

                  Only users with full accounts can post comments. Log in, please.