1 回答

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 個參數:
driver
~ 包含目標函數/方法的對象victim
~ 將被攔截的函數/方法的名稱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、一個“突變觀察者”……和一小撮(暗)物質(:
免責聲明
在此練習中沒有人受傷.. 受害者結果還好.. 自行決定使用
添加回答
舉報