成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

談談JS中的函數劫持

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

[[172281]]

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

基本概念

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

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

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

舉例分析

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

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

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

接下來我們把這部分的內容封裝一下,成為一個通用的函數: 

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

首先我們定義了一個hijack函數,它會先把原函數給保存下來,然后執行自定義函數,而原函數將會在自定義函數內部進行調用。

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

  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. })  

這段函數的功能很簡單就不詳細說明了,直接調用confirm()你就知道了。

反劫持 

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

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

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

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

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

函數劫持的作用

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

后記

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

感謝你的閱讀,歡迎關注我的專欄,我將不定期分享自己的學習體驗,開發心得,搬運墻外的干貨。下次見啦!

參考資料:

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2022-05-18 08:00:26

函數劫持JavaScript鉤子函數

2021-04-07 09:52:46

JavaScript函數劫持攻擊

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

應用交付單邊加速太一星晨

2015-08-07 10:24:17

AndroidMaterialDes

2022-06-07 08:31:44

JavaUnsafe

2022-01-04 20:52:50

函數異步Promise

2013-06-19 09:54:37

產品設計產品功能推薦功能

2022-02-28 08:17:24

重載函數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

加密劫持網絡攻擊漏洞

2021-01-29 09:19:21

DNS劫持HTTP劫持加密
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产综合久久福利软件 | 亚洲免费视频在线观看 | 久久99网| 精品国产黄色片 | 久久久久久久久久久久久久国产 | 久久精品视频9 | 黄视频网址| 亚洲精品乱码久久久久久蜜桃91 | 一区二区三区欧美大片 | 中文在线视频 | 精品久久国产视频 | a国产视频 | 97国产超碰 | 国产乱人伦精品一区二区 | 伊人伊人伊人 | 成人午夜视频在线观看 | 热久久免费视频 | 亚洲精品乱码8久久久久久日本 | 在线观看国产视频 | 国产精品久久久久婷婷二区次 | 国产视频线观看永久免费 | 97免费在线观看视频 | 天天操天天玩 | 亚洲vs天堂 | 色网在线观看 | 亚洲第一在线 | 成人在线免费电影 | 国产精品高清一区二区 | 国产中文 | 久久久观看 | 午夜丁香视频在线观看 | 国产精品久久久久久久久久久免费看 | 国产亚洲欧美在线 | 日本免费一区二区三区四区 | 精品久久久久久久久久久久 | 国产日韩欧美激情 | 欧美h视频| 成人网av | 久久久久久久久久久高潮一区二区 | 久久综合伊人一区二区三 | 久草精品视频 |