Я пытаюсь добавить «пространство имен вкладок» ко всем ключам локального хранилища, чтобы можно было добиться уникальности локального хранилища для сайтов между несколькими вкладками.
Допустим, на простой странице 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)
Есть ли какой-нибудь способ обнаружить, что кто-то уже перехватил локальное хранилище, и предотвратить проблему?