Как предотвратить переполнение стека при перехвате локального хранилища в расширении Chrome - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь добавить «пространство имен вкладок» ко всем ключам локального хранилища, чтобы можно было добиться уникальности локального хранилища для сайтов между несколькими вкладками.

Допустим, на простой странице HTML5 веб-страница имеет следующий скрипт:

Storage.prototype._setItem = Storage.prototype.setItem;
Storage.prototype.setItem = function(key, value) {
    console.log("intercepted set local storage " + key + " = " + value);
    this._setItem(key, value);
}

Storage.prototype._getItem = Storage.prototype.getItem;
Storage.prototype.getItem = function(key) { 
    console.log("intercepted get local storage " + key);
    return this._getItem(key);
}

Это дает пользователю возможность перехватывать все операции получения / установки в локальном хранилище.

Теперь предположим, что у вас есть расширение, делающее то же самое:

var actualCode = `Storage.prototype._setItem = Storage.prototype.setItem;
Storage.prototype.setItem = function(key, value) {
    console.log("intercepted set local storage " + key + " = " + value);
    this._setItem(key, value);
}

Storage.prototype._getItem = Storage.prototype.getItem;
Storage.prototype.getItem = function(key) { 
    console.log("intercepted get local storage " + key);
    return this._getItem(key);
}

console.log("local storage get/set injector completed");
`;

var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.remove();

При включении этого расширения вы получите переполнение стека при загрузке страницы с помощью приведенного выше сценария:

Uncaught RangeError: Maximum call stack size exceeded
at Storage.getItem [as _getItem] (<anonymous>:48:37)
at Storage.getItem [as _getItem] (<anonymous>:50:17)
at Storage.getItem [as _getItem] (<anonymous>:50:17)
at Storage.getItem [as _getItem] (<anonymous>:50:17)
at Storage.getItem [as _getItem] (<anonymous>:50:17)
at Storage.getItem [as _getItem] (<anonymous>:50:17)
at Storage.getItem [as _getItem] (<anonymous>:50:17)
at Storage.getItem [as _getItem] (<anonymous>:50:17)
at Storage.getItem [as _getItem] (<anonymous>:50:17)
at Storage.getItem [as _getItem] (<anonymous>:50:17)

Есть ли какой-нибудь способ обнаружить, что кто-то уже перехватил локальное хранилище, и предотвратить проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...