PHP - Как проверить, если запрос для JS работника - PullRequest
1 голос
/ 19 октября 2019

После консультации с MDN для политики реферера и поиска в Google, DuckDucking и StackOverlow, возможно, вы можете помочь мне решить эту довольно простую (но иллюзорную) проблему?

Process Flow

  1. браузер делает запрос к серверу
  2. на основе заголовка HTTP_REFERER , сервер принимает решение

но почему? (вы спрашиваете)

Это часть тщательно продуманного набора проверок безопасности, в данном случае решение о том, имеет ли клиент доступ к запрошенному файлу FUBU (для нас нами).

Это не будет работать, если реферер отсутствует, но когда JavaScript выдает запрос для указанного работника - реферер (заголовок запроса) действительно отсутствует.

то, что я пробовал - и FAILED

  • настройка Referrer-Policy: same-origin для КАЖДОГО запроса
  • установка соответствующих заголовков CORS Access-Control-Allow-Headers: x-requested-with - в ответ на КАЖДЫЙ запрос.

вопрос

Как я могу узнать, был ли сделан запрос для рабочего файла JS, или просто ВЫНОСИТЬ механизм HTTP, чтобы он вел себя так, как должен?

1 Ответ

1 голос
/ 19 октября 2019

Думая «из коробки»

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

Просто подведем итог:

  • требование должно иметь возможность определить, откуда был сделан запрос
  • это может быть достигнуто либо вручную за 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 аргумента:
    1. driver ~ объект, который содержит целевую функцию / метод
    2. victim ~ имя функции / метода, который будет перехвачен
    3. 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 с чертой «обратная трассировка стека вызовов», «наблюдатель мутации» .. и щепотка (темной) материи (:

отказ от ответственности
никто не пострадал во время этого упражнения .. с жертвой все в порядке .. используйте по своему усмотрению

...