偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

[[172281]]

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

基本概念

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

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

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

舉例分析

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

  1. let warn = alert 
  2. window.alert = (t) => { 
  3.     if (confirm('How are you?')) warn(t) 
  4.  
  5. alert('Help me...!!!' 

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

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

  1. const hijack = (obj, method, fun) => { 
  2.   let orig = obj[method] 
  3.   obj[method] = fun(orig) 
  4.  

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

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

  1. hijack(window, 'confirm', (orig) => { 
  2.   return (text) => { 
  3.     alert('HELP ME PLZ!!!'
  4.     if (orig.call(this, text)) { 
  5.       alert('YOU SEEMS FINE AND I AM LEAVING, GOOD BYE!'
  6.     } else { 
  7.       alert('HOLD ON! I AM COMING!!'
  8.     } 
  9.   } 
  10. })  

這段函數(shù)的功能很簡(jiǎn)單就不詳細(xì)說(shuō)明了,直接調(diào)用confirm()你就知道了。

反劫持 

新建一個(gè)頁(yè)面,打開(kāi)你的開(kāi)發(fā)者工具控制臺(tái),輸入alert,你會(huì)看到這樣的輸出:

  1. function alert() { [native code] } 

然后使用本文開(kāi)頭的那段代碼,把a(bǔ)lert()劫持一下,再重新在控制臺(tái)輸入alert,你會(huì)看到這樣的輸出:

  1. function (t) => { 
  2.     if (confirm('How are you?')) warn(t) 
  3.  

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

函數(shù)劫持的作用

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

后記

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

感謝你的閱讀,歡迎關(guān)注我的專欄,我將不定期分享自己的學(xué)習(xí)體驗(yàn),開(kāi)發(fā)心得,搬運(yùn)墻外的干貨。下次見(jiàn)啦!

參考資料:

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2022-05-18 08:00:26

函數(shù)劫持JavaScript鉤子函數(shù)

2021-04-07 09:52:46

JavaScript函數(shù)劫持攻擊

2009-09-02 20:18:17

域名劫持域名安全

2014-07-22 13:52:45

2013-03-14 09:54:54

jQueryJS

2016-07-15 09:58:00

應(yīng)用交付單邊加速太一星晨

2015-08-07 10:24:17

AndroidMaterialDes

2022-06-07 08:31:44

JavaUnsafe

2022-01-04 20:52:50

函數(shù)異步Promise

2013-06-19 09:54:37

產(chǎn)品設(shè)計(jì)產(chǎn)品功能推薦功能

2022-02-28 08:17:24

重載函數(shù)JS前端

2009-10-26 10:44:27

VB.NET API函

2018-07-09 13:40:24

前端javascript

2023-08-14 16:56:53

2017-07-06 10:35:54

Web前端劫持

2011-08-11 09:56:50

模式

2021-03-16 16:16:41

GeneratorWebsockets前端

2014-09-09 16:44:16

2019-12-20 13:51:30

加密劫持網(wǎng)絡(luò)攻擊漏洞

2021-01-29 09:19:21

DNS劫持HTTP劫持加密
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)