Как проверить, был ли изменен объект JS по умолчанию? - PullRequest
1 голос
/ 28 мая 2019

Как я могу проверить из своего JS-скрипта (запущенного на моей HTML-странице, который загружен в браузер пользователя), что какой-то базовый JS API был подделан пользователем (расширение браузера или что-то еще)? Как HTMLElement.prototype.appendChild() метод или screen.width свойство?

1 Ответ

1 голос
/ 28 мая 2019

Основной (но отнюдь не надежный) метод заключается в проверке, состоит ли функция из собственного кода.Если нет, то он определенно был обезьянат;если это так, то если он был обезьянечным, у него также был целенаправленно изменен метод toString, чтобы избежать такого рода обнаружения (что возможно, но, вероятно, довольно необычно):

const checkValid = () => {
  const { appendChild } = Node.prototype;
  if (appendChild.toString() === `function appendChild() { [native code] }`) {
    document.write('Might not have been modified<br>');
  } else {
    document.write('Definitely modified<br>');
  }
};


checkValid();
Node.prototype.appendChild = () => {
  console.log('My monkeypatched function');
};
checkValid();
// Check is foolable via:
const fooler = function appendChild() {
  console.log('My monkeypatched function');
};
fooler.toString = () => `function appendChild() { [native code] }`;
Node.prototype.appendChild = fooler;
checkValid();

Подобно методу HTMLElement.prototype.appendChild ()

Объект, к которому appendChild непосредственно подключен, равен Node.protoype. Еслиmonkeypatcher поместил его на HTMLElement.prototype (или на сам элемент), это легко обнаружить:

const div = document.querySelector('div');
if (HTMLElement.prototype.hasOwnProperty('appendChild')) {
  console.log('Definitely modified');
}

if (div.appendChild !== Node.prototype.appendChild) {
  console.log('Definitely modified');
}
<div></div>
...