日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
談?wù)凧S中的函數(shù)劫持

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

創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司一直秉承“誠信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!專注中小微企業(yè)官網(wǎng)定制,成都網(wǎng)站制作、網(wǎng)站建設(shè),塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。

基本概念

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

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

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

舉例分析

現(xiàn)在我們來舉個(gè)簡單的例子,劫持一下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...!!!') 

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

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

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

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

然后我們來劫持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ù)的功能很簡單就不詳細(xì)說明了,直接調(diào)用confirm()你就知道了。

反劫持

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

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

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

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

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

函數(shù)劫持的作用

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

后記

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

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

參考資料:

  • javascript 函數(shù)劫持 | 神奇輝
  • JavaScript函數(shù)劫持- 謝燦勇
  • Need to hook into a javascript function call, any way to do this?

當(dāng)前標(biāo)題:談?wù)凧S中的函數(shù)劫持
分享鏈接:http://www.dlmjj.cn/article/cdpcdei.html