日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

談?wù)凧S中的函數(shù)劫持

來源:https://jrainlau.github.io/#/article

談?wù)凧S中的函數(shù)劫持

 

說到劫持,第一反應(yīng)可能是什么不好的東西。函數(shù)劫持并不邪惡,關(guān)鍵是看使用的人。雖然這個概念在前端領(lǐng)域使用較少,但是在安全領(lǐng)域、自定義業(yè)務(wù)等場景下還是有一定的使用價值的。所以,這一篇文章將會和大家一起去了解一下JS中的函數(shù)劫持是什么,有什么用。

基本概念

函數(shù)劫持,顧名思義,即在一個函數(shù)運行之前把它劫持下來,添加我們想要的功能。當(dāng)這個函數(shù)實際運行的時候,它已經(jīng)不是原本的函數(shù)了,而是帶上了被我們添加上去的功能。這也是我們常見的鉤子函數(shù)的原理之一。

乍一看上去,這很像是函數(shù)的改寫。函數(shù)的改寫也可以理解為是函數(shù)劫持的一種,但是這種方式太惡心了。作為一個劫持者,在綁票獲得好處以后也應(yīng)該遵守職業(yè)道德,把人原封不動地還回去,所以我們得在合適的地方把函數(shù)原本的功能給重新調(diào)用回來。

推而廣之,其實“劫持”這一概念我們經(jīng)常會遇到,比方說某網(wǎng)站被運營商劫持了,在瀏覽該網(wǎng)站的時候會彈出運營商的廣告。

舉例分析

現(xiàn)在我們來舉個簡單的例子,劫持一下alert()函數(shù),為它增添一點小小的功能:

let warn = alert
window.alert = (t) => {
 if (confirm('How are you?')) warn(t)
}
alert('Help me...!!!')

可以打開開發(fā)者工具嘗試一下這個例子,你會發(fā)現(xiàn)只有你在confirm里面點擊了OK,才會彈出Help me...!!!。

接下來我們把這部分的內(nèi)容封裝一下,成為一個通用的函數(shù):

const hijack = (obj, method, fun) => {
 const orig = obj[method]
 obj[method] = fun(orig)
}

首先我們定義了一個hijack函數(shù),它會先把原函數(shù)給保存下來,然后執(zhí)行自定義函數(shù),而原函數(shù)將會在自定義函數(shù)內(nèi)部進行調(diào)用。

然后我們來劫持confirm()函數(shù):

hijack(window, 'confirm', (orig) => {
 return (...args) => {
 alert('HELP ME PLZ!!!')
 if (orig.Apply(this, args)) {
 alert('YOU SEEMS FINE AND I AM LEAVING, GOOD BYE!')
 } else {
 alert('HOLD ON! I AM COMING!!')
 }
 }
})

這段函數(shù)的功能很簡單就不詳細(xì)說明了,直接調(diào)用confirm()你就知道了: codepen例子

反劫持

新建一個頁面,打開你的開發(fā)者工具控制臺,輸入alert,你會看到這樣的輸出:

function alert() { [native code] }

然后使用本文開頭的那段代碼,把alert()劫持一下,再重新在控制臺輸入alert,你會看到這樣的輸出:

function (t) => {
 if (confirm('How are you?')) warn(t)
}

通過上述的例子可以知道,要看一個函數(shù)是否被劫持了,只需要直接把它打印出來即可。針對系統(tǒng)原生的函數(shù),[native code]即代表它是純凈無污染的。

函數(shù)劫持的作用

除了為函數(shù)增加功能以外,還能夠利用函數(shù)劫持去追蹤惡意用戶的信息。一般的XSS攻擊會先利用alert()等能夠輸出信息的方法進行測試,這時候我們可以先對原生alert()進行劫持,向其輸入追蹤信息的代碼,最后才把原函數(shù)釋放出去。當(dāng)惡意用戶在測試alert()的時候就會立即被我們追蹤,而他本人卻無從察覺。

后記

關(guān)于JS的函數(shù)劫持,也不是什么新鮮的東西,只是在最近的工作中遇到了這個知識點感覺比較陌生,所以花了一些時間進行了研究,并把結(jié)果記錄下來。如果發(fā)現(xiàn)有什么錯漏的地方歡迎指正!
 

分享到:
標(biāo)簽:JS
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定