Недавно сидя на диване, я решил поиграться с MutationObserver. Это достаточно знатная фича, с помощью которой можно слушать DOM дерево. Сейчас достаточно распространена.
Так же с помощью MutationObserver можно не только лишь слушать, но и по факту предотвращать изменения DOM дерева. Подумав об этом, я сделал библиотечку, которая может блокировать ненужные теги и атрибуты, которыми вы все равно не стали пользоваться.
Выглядит это вот так:
С помощью манифеста мы для примера отрезали все теги script, и все атрибуты onerror, которые не должно выйти добавить после запуска strict_dom. Т.е. по сути так можно вырезать многие потенциальные XSS уязвимости на сайте (в данном варианте не особо на самом деле), или отучить себя и свою команду использовать какие-либо устарелые HTML теги и атрибуты.
Манифест может иметь следующие параметры:
Собственно, все это работает через MutationObserver, а код можете подглядеть тут
Так же с помощью MutationObserver можно не только лишь слушать, но и по факту предотвращать изменения DOM дерева. Подумав об этом, я сделал библиотечку, которая может блокировать ненужные теги и атрибуты, которыми вы все равно не стали пользоваться.
Выглядит это вот так:
{
"tagsType": "blacklist",
"tags": [
"script"
],
"attributesType": "blacklist",
"attributes": {
"*": ["onerror"]
}
}
С помощью манифеста мы для примера отрезали все теги script, и все атрибуты onerror, которые не должно выйти добавить после запуска strict_dom. Т.е. по сути так можно вырезать многие потенциальные XSS уязвимости на сайте (в данном варианте не особо на самом деле), или отучить себя и свою команду использовать какие-либо устарелые HTML теги и атрибуты.
Манифест может иметь следующие параметры:
- outdatedUrl — ссылка на которую будет редиректить, если браузер старый (по умолчанию отключено)
- tagsType — выбираем принцип блеклиста или вайтлиста для удаления тегов
- tags — список ненужных тегов
- attributesType — выбираем принцип блеклиста или вайтлиста для удаления атрибутов к тегам
- attributes — список ненужных атрибутов
Собственно, все это работает через MutationObserver, а код можете подглядеть тут
Поделиться с друзьями
Комментарии (11)
Sirion
18.07.2017 13:14+1Насколько я понял из чтения кода, либа не предотвращает создание, а удаляет свежесозданное. Не успеет ли что-то нежелательное произойти в промежутке между созданием и удалением?
mitinsvyat
18.07.2017 16:26На всех браузерах не тестировал, но в хроме выглядит так, что вызов события происходит синхронно.
mitinsvyat
18.07.2017 16:40вернее script успел запустицо
правд не понимаю, это из за того, что удаление происходит после позже запуска, или таки там асинхронно…
rPman
код расширений браузера так можно заблокировать?
floatbreaker
тот код, который инсертится экстеншном на страницу, думаю можно
mitinsvyat
Есть проблемка в том, что если запустить 2 обзервера, которые конфликтуют, то страница просто зависнет, пока обзерверы будут друг другу ДОМ менять.
Но вообще, расширения обычно запускаются в изолированном мире, и их код не конфликтует. Но часто чтобы войти в контекст страницы экстеншены инжектят код. Такое обрезать можно.