Можно ли обнаружить модификацию страницы с помощью пользовательских скриптов?

Если у вас есть веб-сайт, можете ли вы как-то узнать, изменяют ли посетители ваш сайт с помощью JavaScript-скриптов?

0
nl ja de
Короткий ответ: Да. ... Дольше ответ: Обнаружение модов таким образом, что пользователь не может помешать, намного сложнее. ... В теории пользователь может помешать чему-либо, что делает сайт (за исключением темного).
добавлено автор Brock Adams, источник
Какие изменения вы хотите обнаружить и в каком браузере?
добавлено автор John Dvorak, источник

2 ответы

Короче: EEEEEEK! Не делай этого! Скорее, решите, что нуждается , чтобы охранять, и защитите , что . Избегайте опроса (периодической проверки) любой ценой. Тем более, избегайте периодических тяжелых проверок чего-либо.


Не все изменения можно отслеживать. Большинство изменений очень сложно отслеживать, так как есть много вещей, которые могут измениться.

Могут быть обнаружены изменения в DOM (новые узлы, удаленные узлы, измененные атрибуты). Другой ответ предлагает периодически проверять innerHTML , но лучше использовать not even that plays in your favor (thanks Brock Adams for noting and the link)

Вы можете обнаружить, что стандартный метод был вызван, заменив его на свой собственный (ek). Существует много методов, которые вам нужно будет использовать таким образом (eek), некоторые - браузером, а некоторые - вашими фреймворками. Тот факт, что IE (и даже firefox может быть проинструктирован, спасибо @Brock) не будет позволяет вам коснуться прототипов классов DOM, добавляет еще один «e» или два в «eek». Тот факт, что некоторые методы могут быть получены только через вызов метода (возвращаемое значение, аргументы обратного вызова), добавляет еще один «e» или два, в общей сложности «eeeek». Идея обхода по всему окну будет устранена исключениями безопасности и исключаемыми исключениями безопасности. То есть, если вы не используете iFrames, и вы не находитесь в iFrame.

Даже если вы обнаруживаете каждый вызов метода, DOM можно изменить, написав на innerHTML . Firefox и Chrome поддерживают Mutation Observers, поэтому вы можете их использовать.

Даже если вы обнаруживаете каждый вызов метода ранее существующего метода и слушаете мутации, большинство свойств не отражается ни на одном, поэтому вам нужно также следить за всеми свойствами каждого объекта. Молитесь, чтобы кто-то не добавлял неперечислимое свойство с ключом, о котором вы никогда не догадались. Кстати, это также приведет к мутациям DOM. В ES6 можно будет наблюдать набор свойств объекта. Я не уверен, если вы можете подключить сеттер к существующему объекту в ES5 (придерживаясь синтаксиса ES3). Опрос каждого объекта - eeeek.

Конечно, вы должны разрешить свои собственные скрипты внести некоторые изменения. Рабочий поток должен был установить флаг (недоступный из глобальной области!) «Я прав», выполняю вашу работу и очищаю флаг - не забудьте также обойти все свои обратные вызовы. Затем наблюдатели метода будут проверять, установлен ли флаг. У сторожевых устройств свойств будет сложнее обнаружить, если изменение действительно, но они могут быть уведомлены из сценария каждого допустимого изменения (вручную, еще раз убедитесь, что пользовательские сценарии не могут видеть этот поток уведомлений). EEEK.

Существует совершенно другая проблема, с которой я не понимал вначале: Userscripts run при загрузке страницы, но они также могут создавать iFrame. Это не совсем немыслимо (но все еще маловероятно now ), что пользовательский текст: 1) обнаруживает ваш блокбастер сценария, 2) nuke страницу с орбиты (вы не можете предотвратить document.body. innerHTML = , по крайней мере, не сильно подделать document.body ), 3) вставить один iframe с исходным URL-адресом (предотвратить двойную нагрузку на стороне сервера?) и 4) иметь много времени, чтобы воздействовать на этот пустой iframe, прежде чем ваша защита будет даже загружена.

Кроме того, см. дубликат, найденный Брок Адамсом , который показывает несколько других проверок, которые я не думал об этом.

4
добавлено
Re: пользовательские скрипты запускаются при загрузке страницы (не раньше), поэтому у вас достаточно времени для подготовки вашей защиты. ... Нет, каждый скриптовый браузер поддерживает начиная с любой загрузки страницы. Пользовательский скрипт может переопределять прототипы и скрывать все виды наблюдателей и защит. В случае с Firefox и Opera не так сложно выборочно блокировать или редактировать JavaScript страницы до того, как он когда-либо будет выполнен. Это не так просто в Chrome. Кроме того, объекты Firefox могут быть заморожены, поэтому страница не может их переопределить.
добавлено автор Brock Adams, источник
Re: Скорее, решите, что нужно охранять, и защитите это. +1 для этого. Не доверяйте клиенту. Всегда проверяйте, дезинфицируйте и перекрестно ссылайтесь на конец сервера. В конце концов, если хорошие данные (и правила игры не были нарушены для вреда других), то не имеет значения, что делает клиент или как он это делает. (Однако я подозреваю, что OP - это скриптер, который беспокоится о контрмерах).
добавлено автор Brock Adams, источник
@BrockAdams пересек это, спасибо
добавлено автор John Dvorak, источник

Если у вас нет собственного скрипта, который изменяет то, что вам холодно, сравните document.body.innerHTML и document.head.innerHTL с тем, что это было.

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

0
добавлено
Как какие изменения не будут обнаружены? Единственное, о чем я могу думать, это изменить размер окна. Все, что изменилось с помощью JS, что-то делает для свойств/значений DOM или добавляет/удаляет элементы DOM. Это изменит innerHTML
добавлено автор HMR, источник
извините, вы правы. входное текстовое значение, определенные пользователем свойства не отображаются при изменении и, вероятно, больше.
добавлено автор HMR, источник
Не говоря уже о том, что любое сравнение, которое вы пытаетесь сделать, должно будет использовать код, который может быть изменен с помощью пользовательского сценария (то есть пользовательский текст может изменить ваш элемент управления или изменить связь с сервером, если вы сравните на сервере и т. Д.),
добавлено автор Jim Deville, источник
Не все изменения могут быть обнаружены таким образом
добавлено автор John Dvorak, источник
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском