1、對於div注入的,可以初始化時檢查全部html**。
檢測是否被劫持比較簡單,但對抗就略麻煩,這個在說完第2點之後再解釋。
2、對於js注入,可以在window監聽domnodeinserted事件。
事件有srcelement,可以獲取到剛插入的dom節點。
這裡開始簡單粗暴的做正則匹配,匹配所有url。
再逐個比較是否白名單網域名稱,如果不是,則判定為劫持。可以上報,同時可以移除dom.parentnode.removechild(dom);
但這樣容易造成誤傷,因為正常頁面中可能有外部鏈結,或者一些純文字url。
後來改為
但這樣也有漏洞,如果運營商通過div+style設定背景的方式顯示廣告圖,上述**就無法檢查出來。
那麼,就還需要檢查style的情況,但style情況就更複雜了。可能是,也可能是inline樣式,最終還是要回到url識別上。
那麼做個折衷,我們繼續用最初的純文字正則匹配url的方式,但跳過純文字的情況(例如修改div的內容,替換為一段文字),只檢查插入dom的情況。
具體方法是
if (!dom.outerhtml)
回到剛才第一點的問題,監測第一點的情況,可以用一樣的做法。但是,對抗就麻煩很多,因為廣告dom節點可以插在body第一層,也可以插在某個內容div中。如果簡單粗暴的把廣告dom節點到body的全部div都移除,可能會造成大面積的誤傷。
所以,針對這個情況,我們還在做進一步的監測統計。
3、對於iframe的情況,要檢測非常簡單,只需要比較self和top是否相同。
不過,要完整解決這個巢狀劫持,就要知道運營商的小把戲。
那麼,此時在iframe中的html為什麼能夠順利載入回來呢?而不是又被劫持?
我們猜想,運營商應該在url中加了乙個引數,標記是否已經劫持過。
而實際監測發現,我們的猜想也是正確的。
呃,我們仔細看,還可以發現運營商做這個劫持也非常粗暴,如果頁面依賴hash,就會引起錯誤了。
見招拆招,這個比較好辦,我們只需要把top的位址修改為self位址即可。一來沖掉iframe,二來繞過劫持。
function checkiframehijack() else else
try catch (e) }}
}
為了安全起見,防止運營商有新招數,所以這裡只嘗試一次,用iframe_hijack_redirected引數標記,已經嘗試過。
按照統計情況來看,運營商還是挺猖狂的,平均大約有6~10個劫持上報,大概佔整個qq健康使用者的3%到5%。
HTTP劫持和DNS劫持 實際JS對抗
1 對於div注入的,可以初始化時檢查全部html 檢測是否被劫持比較簡單,但對抗就略麻煩,這個在說完第2點之後再解釋。2 對於js注入,可以在window監聽domnodeinserted事件。事件有srcelement,可以獲取到剛插入的dom節點。這裡開始簡單粗暴的做正則匹配,匹配所有url。...
HTTP劫持和DNS劫持 騰訊的實際業務分析
簡單介紹一下http劫持和dns劫持的概念,也就是運營商通過某些方式篡改了使用者正常訪問的網頁,插入廣告或者其他一些雜七雜八的東西。首先對運營商的劫持行為做一些分析,他們的目的無非就是賺錢,而賺錢的方式有兩種 1 對正常 加入額外的廣告,這包括網頁內浮層或彈出廣告視窗 在具體的做法上,一般分為dns...
DNS劫持 流量劫持,HTTP HTTPS劫持
dns劫持 dns劫持就是通過劫持了dns伺服器,通過某些手段取得某網域名稱的解析記錄控制權,進而修改此網域名稱的解析結果,導致對該網域名稱的訪問由原ip位址轉入到修改後的指定ip,其結果就是對特定的 不能訪問或訪問的是假 從而實現竊取資料或者破壞原有正常服務的目的。dns劫持通過篡改dns伺服器上...