Думая «из коробки»
Поскольку «кажется» нет способа сделать это «хорошим» способом, всегда можно применить творческий подход к достижению определенного результата.
Просто подведем итог:
- требование должно иметь возможность определить, откуда был сделан запрос
- это может быть достигнуто либо вручную за
Worker
вызов, либо автоматически - любая безопасность проблемы, кажется, решаются в других местах
- , изменяя
Worker
URL-адрес при вызове может быть полезен для автоматической обработки
Работоспособное решение
Вот оболочка, которую можно использовать для "перехвата" некоторых вызовов классов или методов:
const hijack = function(driver,victim,jacker)
{
if(((typeof driver)=='string')&&!victim){return this.plan[driver]}; // recap
if(victim in this.plan){return}; // only jack once? .. less cruel
this.plan[victim]={victim:driver[victim],jacker:jacker}; // plan the heist
let con = {enumerable:false,configurable:false,writable:false,value:function()
{
let car=hijack((this.mask||this.name||this.constructor.name)); let m=this.mask;
let arg=car.jacker.apply(null,arguments); if(!Array.isArray(arg)){arg=[arg]};
if(!m){return new (Function.prototype.bind.apply(car.victim,[null].concat(arg)))()}
else{return car.victim.apply(this,arg)};
}};
try{con.value.prototype = Object.create(driver[victim].prototype)} // blend in
catch(oops){Object.defineProperty(driver,'mask',{value:victim});}; // recover
Object.defineProperty(driver,victim,con);
}.bind({plan:{}});
... гвоздь встречает молот
Как это работает
- Требуется 3 аргумента:
driver
~ объект, который содержит целевую функцию / метод victim
~ имя функции / метода, который будет перехвачен jacker
~ callback-функция, которая используется для ретрансляции / изменения аргументов
- Исходный метод копируется туда, где его можно использовать или последующие вызовы
- Обратный вызов налагает (удаляет) оригинал и может либо передавать неизменяемые аргументы между вызывающим абонентом и вызываемым абонентом (точно так же, как оригинал), но теперь вы можете контролировать, как это происходит (если вообще происходит) и что точно передавать;либо с каким-либо простым условием (ями), либо с какой-то сложной схемой (так называемый «злой план»)
- Для простоты этот код (см. выше) допускает только 1 перехват на
victim
, но это можно расширить длямножественные перехваты;либо с помощью "chain-relay" (массив обратных вызовов), либо "combo (s) Event-dispatcher + Event-Listener".
Как использовать
Специфично для вопроса:
hijack(window,'Worker',function(arg){return `${arg}?worker=true`});
Для решения проблем безопасности в комментариях может быть полезен api-ключ ;поэтому, если некоторое количество string
было передано в работающий экземпляр (браузер или сервер), который является уникальным для текущего сеанса (или клиента), этого может быть достаточно, например:
hijack(window,'Worker',function(arg){return `${arg}?worker=${window.ApiKey}`});
.. где ApiKey
было определено глобально как string
, но это также может быть результатом вызова функции, который получает его из cookie или как угодно.
Полезный инструмент
Это также можетиспользоваться для повышения безопасности . Если вас беспокоит XHR запросов от devtools или еще хуже: eval () - затем вы можете использовать это hijack
для перехвата этих вызовов / вызовов в глобальном масштабе.
Например:
hijack(URL,'createObjectURL',function(arg){console.log(arg); return `whatever`});
Если вы планируете использовать это в качестве инструмента безопасности, тогданужен некоторый TLC с чертой «обратная трассировка стека вызовов», «наблюдатель мутации» .. и щепотка (темной) материи (:
отказ от ответственности
никто не пострадал во время этого упражнения .. с жертвой все в порядке .. используйте по своему усмотрению