天天看點

Anehta -- 打造一個Browser Sniffer

2008-11-29 11:30:58  www.hackbase.com  來源: hackeye.com 0.5.6 中加入了對BrowserSniffer的支援。一般簡單的判斷用戶端浏覽器類型的方法,都是讀取用戶端的userAgent,比如 navigator.appVersion ,navigator.userAgent 等然後從UA資訊中,取出浏覽器版本和作業系統版 ...

0.5.6 中加入了對BrowserSniffer的支援。

一般簡單的判斷用戶端浏覽器類型的方法,都是讀取用戶端的userAgent,

比如 navigator.appVersion ,navigator.userAgent 等

然後從UA資訊中,取出浏覽器版本和作業系統版本進行判斷。

比如我的userAgent 資訊大緻是這樣的:

Anehta -- 打造一個Browser Sniffer

在jQuery 中的就是這麼判斷浏覽器版本的。

但是userAgent 的資訊是可以僞造的,甚至有很多工具可以讓使用者直接修改UA資訊,這樣通過擷取UserAgent來判斷浏覽器就不再準确了。

Anehta -- 打造一個Browser Sniffer

Anehta 對用戶端浏覽器的判斷要求比較高,是以在這裡采用了Browser Sniffer技術。

其實就是通過各個浏覽器的一些DOM對象或者是方法之間的差異,進而判斷出準确的浏覽器版本。

在 anehta.detect.browser() 函數中實作如下過程:

anehta.detect.browser = function (){
    var userAgent = navigator.userAgent.toLowerCase();
 
    return {
        type : function(){
            /* 獨立于jQuery實作             //$.browser.msie/safari/opera/mozilla             if($.browser.msie){ return "msie";}             else if($.browser.mozilla){return "mozilla";}                 else if($.browser.opera){return "opera";}                     else if($.browser.safari){return "safari";}                         else {return "unknown";}             */
            //alert(navigator.userAgent);
 
            // 通過一些dom對象判斷浏覽器指紋 ie,ie7,ie8,ff2,ff3,safari,opera,chrome,maxthon,theworld,360se....
            //if (typeof document.all != "undefined"){ // msie ; firefox 在 quirks mode下也支援
            if (window.ActiveXObject){
                anehtaCache.setItem("BrowserSniffer", "MSIE 6.0 or below");
 
            // 判斷是否是IE7以上
            if (document.documentElement && typeof document.documentElement.style.maxHeight!="undefined" ){
 
                // 判斷是否是 IE8+
                if ( typeof document.adoptNode != "undefined") { // Safari3 & FF & Opera & Chrome & IE8
                    anehtaCache.setItem("BrowserSniffer", "MSIE8.0");
                }
                // 因為是精确判斷,是以改寫cache
                anehtaCache.setItem("BrowserSniffer", "MSIE7.0");
            }
 
            // 不可靠的判斷一些浏覽器
            if (userAgent.indexOf("maxthon") > -1){
                anehtaCache.appendItem("BrowserSniffer", " | "+"maybe maxthon");   
            }
            if (userAgent.indexOf("360se") > -1){
                anehtaCache.appendItem("BrowserSniffer", " | "+"maybe 360se");   
            }
            if (userAgent.indexOf("theworld") > -1) {
                anehtaCache.appendItem("BrowserSniffer", " | "+"maybe theworld");   
            }
            /*             if (userAgent.indexOf("") > -1) {                 //anehtaCache.appendItem("BrowserSniffer", " | "+"maybe greenbrowser");             }             */
 
            return "msie";
            }
            else if (typeof window.opera != "undefined") { //opera獨占
                anehtaCache.setItem("BrowserSniffer", "Opera "+window.opera.version());
                return "opera";
            }
            else if (typeof window.netscape != "undefined") { // mozilla 獨占
                anehtaCache.setItem("BrowserSniffer", "Mozilla");       
                // 可以準确識别
                if (typeof window.Iterator != "undefined") {
                anehtaCache.setItem("BrowserSniffer", "Firefox 2");
 
                if (typeof document.styleSheetSets != "undefined") { // Firefox 3 & Opera 9
                    anehtaCache.setItem("BrowserSniffer", "Firefox 3");
                }
                }
                return "mozilla";
            }
            else if (typeof window.pageXOffset != "undefined") { // mozilla & safari
                anehtaCache.setItem("BrowserSniffer", "Safari");
        try{
                if (typeof external.AddSearchProvider != "undefined") { // firefox & google chrome
                    anehtaCache.setItem("BrowserSniffer", "Google Chrome");
                    return "chrome";
                }
            } catch (e) {
                    return "safari";
            }
            }   
      else { //unknown
                anehtaCache.setItem("BrowserSniffer", "Unknown << "+userAgent+" >>");
            return "unknown";   
            }
        },
 
        // 從userAgent裡取出來的不可靠
        version : function(){
            //return $.browser.version;   
            return (userAgent.match( /.+(?:rv|it|ra|ie|me)[//: ]([/d.]+)/ ) || [])[1];
        }
    };
};
 
最終準确的判斷 結果儲存在了cache中的 “BrowserSniffer” 字段裡,是以如果XSS抓回來的UserAgent 資訊和 BrowserSniffer 資訊