黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

動力節(jié)點淺談JS中的函數(shù)劫持


  說到劫持,第一反應可能是什么不好的東西。函數(shù)劫持并不邪惡,關鍵是看使用的人。雖然這個概念在前端領域使用較少,但是在安全領域、自定義業(yè)務等場景下還是有一定的使用價值的。所以,動力節(jié)點的老師帶大家一起去了解一下JS中的函數(shù)劫持是什么,有什么用。

 

  基本概念

 

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

 

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

 

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

 

  舉例分析

 

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

 

  1.let warn = alert 

 

  2.window.alert = (t) => { 

 

  3.    if (confirm('How are you?')) warn(t) 

 

  4.} 

 

  5. 

 

  6.alert('Help me...!!!')  

 

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

 

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

 

  1.const hijack = (obj, method, fun) => { 

 

  2.  let orig = obj[method] 

 

  3.  obj[method] = fun(orig) 

 

  4.}  

 

  首先我們定義了一個hijack函數(shù),它會先把原函數(shù)給保存下來,然后執(zhí)行自定義函數(shù),而原函數(shù)將會在自定義函數(shù)內(nèi)部進行調(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ù)的功能很簡單就不詳細說明了,直接調(diào)用confirm()你就知道了。

 

  反劫持

 

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

 

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

 

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

 

  1.function (t) => { 

 

  2.    if (confirm('How are you?')) warn(t) 

 

  3.}  

 

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

 

  函數(shù)劫持的作用

 

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

 

  后記

 

  關于JS的函數(shù)劫持,也不是什么新鮮的東西,只是有同學在最近的工作中遇到了這個知識點感覺比較陌生,過來咨詢了一下,動力節(jié)點的Java老師花了一些時間總結了一下,如果同學們還有其他見解,可以關注動力節(jié)點的官方微信去調(diào)戲虎生的小師妹,給動寶兒留言。

 

  

 

上一篇:4個費勁心思卻走向編程地獄的陷阱
下一篇:JavaScript的內(nèi)部字符編碼是UCS-2還是UTF-16

開班信息

主站蜘蛛池模板: 亚洲第二页 | 欧美怡红院免费全视频 | 天天操夜夜爽 | 欧美极品另类高清videos | 久久香蕉国产线看观看亚洲片 | 亚洲伦理视频 | 韩日精品视频 | 亚洲第一成年网 | 天天看天天摸色天天综合网 | 久久狠狠色噜噜狠狠狠狠97 | 午夜高清在线观看免费6 | 亚洲七七久久精品中文国产 | 亚洲激情在线视频 | 18男同志可播放free69 | 亚洲国产精品久久网午夜 | 国产亚洲视频在线 | 五月激情综合丁香色婷婷 | 国产欧美日韩精品a在线观看 | 欧美性猛交xxx猛交 欧美性生交xxxxx久久久 | 殴美在线 | 国产午夜精品福利 | 久久18| 日本免费一区二区三区a区 日本免费一区二区三区看片 | 在线日韩中文字幕 | 国产午夜精品不卡视频 | 久久久美女视频 | 亚洲成年人在线观看 | 国产精品久久久久久久久久一区 | 国产丫丫视频私人影院 | 精品无码一区在线观看 | 91精品国产免费网站 | 久青草视频免费视频播放线路1 | 一级做a爱过程免费观看 | 最色网址 | 午夜色视频在线观看 | 国产美女在线一区二区三区 | 一级做a爱片在线播放 | 最近更新在线中文字幕一页 | 欧美一区色 | 欧美国产日韩在线 | 色我网站|