为了账号安全,请及时绑定邮箱和手机立即绑定

PHP - 如何检查请求是否是针对 JS 工作者的

PHP - 如何检查请求是否是针对 JS 工作者的

慕婉清6462132 2021-11-25 19:34:58
在向 MDN 咨询了推荐人政策和谷歌搜索、DuckDucking 和 StackOverlow-searching 之后,也许你可以帮助我解决这个相当简单(但很虚幻)的问题?工艺流程浏览器向服务器发出请求根据HTTP_REFERER标头,服务器决定响应但为什么?(你问)这是一组精心设计的安全检查的一部分,在这种情况下,决定客户端是否可以访问请求的FUBU文件(由我们为我们提供)。如果引用者丢失,这将不起作用,但是当 JavaScript 向指定的工作人员发出请求时 -引用者(请求标头)确实丢失了。我尝试过的 - 但失败了Referrer-Policy: same-origin为每个请求设置设置适当的 CORS 标头Access-Control-Allow-Headers: x-requested-with- 响应每个请求。题我如何才能确定是否对 JS 工作文件发出了请求,或者只是强制 HTTP 机制表现得像它应该的那样
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

跳出“盒子”思考

由于“似乎”没有办法以“好”的方式做到这一点,因此人们总是可以运用微小的创造力来实现特定的结果。

简单回顾一下:

  • 要求是有办法从那里的请求时识别

  • 这可以在每次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 ~ 一个回调函数 - 用于中继/更改参数

  • 原方法复制到可以使用的地方或者后续调用

  • 回调强加(废弃)原始的,并且可以在调用者和被调用者之间传递不变的参数(与原始的完全一样),但现在你可以控制它是如何发生的(如果有的话)以及准确地传递什么;要么有一些简单的条件,要么有一些精心设计的计划(又名“邪恶计划”)

  • 为了简单起见,这段代码(上面)只允许每个 1 次拦截victim,但这可以扩展为多次拦截;通过“链中继”(回调数组)或“事件调度程序 + 事件侦听器组合”。

如何使用

具体问题:

hijack(window,'Worker',function(arg){return `${arg}?worker=true`});

为了解决评论中的安全问题,api-key可能很有用;因此,如果将 somestring传递给当前会话(或客户端)独有的正在运行的实例(浏览器或服务器),则就足够了,例如:

hijack(window,'Worker',function(arg){return `${arg}?worker=${window.ApiKey}`});

.. whereApiKey被全局定义为 a string,但它也可以是函数调用的结果 - 它从 cookie 中获取它,或以任何方式获取。

有用的工具

这也可用于增强安全性。如果您担心来自devtools或更糟的XHR请求:eval() - 那么您可以使用它来全局拦截这些调用/调用。hijack

例如:

hijack(URL,'createObjectURL',function(arg){console.log(arg); return `whatever`});

如果您打算将其用作安全工具,那么它需要一些带有“调用堆栈回溯”的 TLC、一个“突变观察者”……和一小撮(暗)物质(:

免责声明
在此练习中没有人受伤.. 受害者结果还好.. 自行决定使用


查看完整回答
反对 回复 2021-11-25
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信