Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript PHP-如何检查请求是否针对JS worker_Javascript_Php_Http Headers_Web Worker - Fatal编程技术网

Javascript PHP-如何检查请求是否针对JS worker

Javascript PHP-如何检查请求是否针对JS worker,javascript,php,http-headers,web-worker,Javascript,Php,Http Headers,Web Worker,在咨询了MDN和Google、DuckDucking和StackOverlow搜索之后,也许你可以帮我解决这个相当简单(但不真实)的问题 工艺流程 浏览器向服务器发出请求 服务器根据HTTP\u REFERER头决定响应 但是为什么呢?(你问) 这是一组精心设计的安全检查的一部分,在这种情况下,决定客户是否有权访问FUBU请求的文件(由我们为我们) 如果缺少referer,这将不起作用,但是当JavaScript为指定的worker发出请求时,referer(请求头)确实丢失了 我尝试过的,但失

在咨询了MDN和Google、DuckDucking和StackOverlow搜索之后,也许你可以帮我解决这个相当简单(但不真实)的问题

工艺流程
  • 浏览器向服务器发出请求
  • 服务器根据HTTP\u REFERER头决定响应
  • 但是为什么呢?(你问) 这是一组精心设计的安全检查的一部分,在这种情况下,决定客户是否有权访问FUBU请求的文件(由我们为我们)

    如果缺少referer,这将不起作用,但是当JavaScript为指定的worker发出请求时,referer(请求头)确实丢失了

    我尝试过的,但失败了
    • 为每个请求设置
      referer策略:相同来源
    • 设置相应的CORS标头
      访问控制允许标头:x-requested-with
      -以响应每个请求
    问题 我怎样才能知道是对JS worker文件发出了请求,还是仅仅强制HTTP机制按其应有的方式运行?

    跳出“框框”思考 既然“似乎”没有办法以“好”的方式做到这一点,人们总是可以运用lil的创造力来实现特定的结果

    简单回顾一下:

    • 要求是要有一种方法来识别从何处发出请求
    • 这可以通过调用
      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
      ~包含目标函数/方法的对象
    • 受害者
      ~将被拦截的函数/方法的名称
    • jacker
      ~回调函数-用于传递/更改参数
    • 原始方法被复制到可以使用或后续调用的位置
    • 回调强制(撤销)原始参数,并且可以在调用者和被调用者之间传递未更改的参数(与原始参数完全相同),但是现在您可以控制它如何发生(如果有)以及确切地传递什么;要么是一些简单的条件,要么是一些精心策划的计划(又称“邪恶计划”)
    • 为简单起见,此代码(如上)仅允许每个
      受害者进行1次拦截,但可扩展为多次拦截;通过“链中继”(回调数组)或“事件调度器+事件侦听器组合”
    如何使用 针对该问题:

    hijack(window,'Worker',function(arg){return `${arg}?worker=true`});
    
    为了解决评论中的安全问题,api密钥可能很有用;因此,如果某个
    字符串
    被传递到当前会话(或客户端)所特有的正在运行的实例(浏览器或服务器),它就足够了,例如:

    hijack(window,'Worker',function(arg){return `${arg}?worker=${window.ApiKey}`});
    
    hijack(URL,'createObjectURL',function(arg){console.log(arg); return `whatever`});
    
    。。其中,
    ApiKey
    被全局定义为
    字符串
    ,但它也可以是函数调用的结果,该函数调用从cookie或其他任何函数中获取

    有用的工具 这也可用于增强安全性。如果您担心来自devtoolsXHR请求,或者更糟的是:eval()-那么您可以使用此
    劫持
    全局拦截这些调用/调用

    例如:

    hijack(window,'Worker',function(arg){return `${arg}?worker=${window.ApiKey}`});
    
    hijack(URL,'createObjectURL',function(arg){console.log(arg); return `whatever`});
    
    如果您打算将其用作安全工具,那么它需要一些TLC,带有少量“调用堆栈回溯跟踪”,即“变异观察者”。。和一撮(暗)物质(:

    免责声明

    在这个练习中没有人受伤。受害者结果很好。根据你自己的判断使用你就是不能。你不能信任客户,它也可能提供虚假的推荐人。你不应该像你正在寻找的那样依赖HTTP\u REFERER
    ?首先,好问题!第二,附加类似
    worker.js的东西怎么样?from=worker
    我刚刚有了一个最疯狂的想法-通过为每个后续实例创建一个包装器并在结尾附加一些安全密钥来劫持
    worker
    构造函数如何-由服务器提供?…如果我知道如何创建一个工人包装器…我需要研究一下它的工作原理!天哪,你救了我。我的老板认为它是“黑客”,但也补充说它可能很有用,因为它的应用程序通常可以解决前端黑客的一些问题……使用黑客来防止黑客,你每天都会学到一些新的东西。现在,为了改变措辞hehehe:D谢谢你亲爱的陌生人。@mika-我发布了一个“前端”安全问答-与此答案相关。希望对您有所帮助。谢谢!我已经阅读了您的文章,我将尽我所能与您分享我学到的知识。