Скорее всего, вы слышали и использовали полифиллы. Код, добавленный в среду выполнения, который переопределяет или расширяет собственное поведение. Полифилы используют возможность изменять хост и нативные объекты в среде javascript. Но что, если мы в какой-то момент захотим восстановить нативную функциональность?

Пример кода, переопределяющего нативную функцию:

(function () {
  const e = window.eval
  window.eval = (...args) => {
    console.log(...args)
    e(...args)
  }
})()
eval('console.log(123)')
// outputs
// 'console.log(123)'
// 123

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

Одним из способов защиты нативной функциональности является сохранение ссылок на нативный код до того, как что-либо еще запустится на странице:

const originalEval = window.eval

Просто, эффективно, но в некоторых случаях невозможно. В основном, если вы не можете полностью контролировать загрузку javascript на веб-странице. Это часто бывает, когда вы предоставляете сценарии для встраивания. В этом случае остальная часть кода javascript на веб-сайте может быть полностью загружена или находится в процессе загрузки.

Восстанавливаю окружающую среду как босс

<iframe id="iframe" src="some-page-from-the-same-domain.html"></iframe>

Создайте новый iframe с чистым содержимым из того же домена. Сделайте это с помощью HTML или javascript. Затем сохраните ссылки на нативные объекты из только что загруженной среды:

const freshEnvironment = document.querySelector('#iframe').contentWindow
const nativeEval = freshEnvironment.eval

Это дает вам ссылку на вашу нативную функцию! В качестве источника iframe выберите страницу, которая не содержит логики javascript, которая может переопределить собственное поведение. Попробуйте страницы с ошибками, 404 и т. д. Лучше всего использовать медиа-объект, обслуживаемый из этого домена, например изображение. Таким образом, есть небольшой шанс, что вы получите какой-нибудь скрипт, который может переопределить поведение (вы всегда можете проверить…).

Убедитесь, что у вас есть собственная функция, используя:

const stringified = nativeEval.toString()
const isNative = stringified === "function eval() { [native code] }"
isNative(stringified)

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

Если у вас есть какие-либо комментарии, критика или улучшения для этого подхода, не стесняйтесь обращаться!