幾個禮拜以前,我談論了特徵檢測和瀏覽器檢測。這篇帖子提到了一點點嗅探User-agent,評論也跟着探討。我主張user-agent嗅探是一種很是重要的技術,在罕見場合當你須要隱藏後端接口的時候,能夠嘗試用它。在你準備作那以前,瞭解爲何user-agent字符檢測會被認爲是一項不精確的技術對你是很是有用的。爲了作到這一點,你須要看一下User-agent這幾年的進化歷史。
下面,從個人《Web開發者要掌握的專業JavaScript技術》一書中,截取了關於user-agent歷史的一段刪減部分。
早期瀏覽器
在1993年,NCSA發佈了第一個web瀏覽器,Mosaic。它的User-agent真的很簡單,採起相似這樣的格式:Mosaic/0.9
雖然,這種user-agent在不一樣的操做系統和平臺上顯示出多樣性,可是這種基本格式是簡單的直截了當的。簡寫的文字指明瞭產品的名稱(有些時候顯示NCSA Mosaic,有時候會已一些衍生名來替代),跟在/後面的內容是產品的版本。
在NC發展web瀏覽器之初,給它取了個代號:Mozilla("Mosaic Killer"的簡寫)。Netscape Navigator 2 做爲第一個公開的有效的版本,它的user-agent格式是這樣的:
Mozilla/Version [語言(language)] (兼容平臺(Platform); 安全加密(Encryption))
網景公司保留了產品名臣和版本號做爲user-agent第一部分的傳統,可是在後面接着增長了如下信息:
1.語言 - 讓瀏覽器優先使用指定的語言工做
2.平臺/操做系統 - 應用依賴的操做系統或者平臺
3.安全加密 - 安全加密的種類,它的值多是:U(128-bit加密),I(40-bit 加密),N(沒有加密)
Netscape Navigator 2 典型的user-agent格式像是這樣: Mozilla/2.02 [fr] (WinNt;I)
這個user-agent說明瀏覽器用的是Netscape Navigator 2.02 版本,用在講法語的國家,以40-bit安全加密的方式運行在Windows NT操做系統中。這時期,幾乎很容易的經過觀察user-agent中的產品名稱,瞭解目前在用什麼瀏覽器。
Netscape Navigator 3 和 IE 3
1996年,網景瀏覽器3發佈,立刻超越Mosaic成爲最流行的瀏覽器。這時期的user-agent只進行了一小點改動,移除了languag特徵,同時增長了另外一特徵:操做系統或者系統的CPU介紹。這時候的user-agent格式以下:
Mozilla/Version (Platform; Encryption [; OS-or-CPU description])
在Windows系統中運行的網景瀏覽器3的user-agent典型的例子就像這樣:
Mozilla/3.0 (Win95; U)
這串user-agent說明了網景瀏覽器3運行在Windows95中,經過128位 安全加密。你會發現,在Windows 系統中,會忽視操做系統或者CPU的介紹。
在網景瀏覽器3發佈後不就,微軟發佈了他們的第一個公開有效的瀏覽器IE3。那段時期,由於網景瀏覽器的高市場佔有率,許多服務器會優先爲網景瀏覽器提供網頁服務。所以,IE就成了收留沒法訪問頁面的菜鳥瀏覽器,就此他們決定本身創造一個user-agent,它能夠兼容網景瀏覽器user-agent。結果他們作到了,這個user-agent就像這樣: Mozilla/2.0 (compatible; MSIE Version; Operating System)
舉個例子,運行在Windows 95 平臺上的IE3.02的user-agent就像這樣:Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)
由於在那時期,大多數瀏覽器嗅探技術主要是獲取user-agent的名稱特徵,因此IE成功的把本身裝扮成Mozilla,就同網景瀏覽器同樣。這一舉動引起了許多爭論,由於它打破了瀏覽器鑑別規則。長遠來看,真實的瀏覽器信息被埋藏在了中間的字符串信息中。
Netscape Communicator 4 和 IE4-IE8
1997年8月,網景瀏覽器4發佈了(這一版本名字發生了變化,從Navigator 變成了 Communicator)。網景選擇將網景瀏覽器4的user-agent格式保持和上一版本一致。在windows 98 機器上,4版本的user-agent格式就像這樣:Mozilla/4.0 (Win98; I) 。
隨着網景發佈補丁修復瀏覽器的同時,瀏覽器版本號也隨之增長,4.79版本的user-agent就像這樣:Mozilla/4.79 (Win98; I)
當微軟發佈IE4的時候,它的user-agent作了重要跟新,獲取的格式如:Mozilla/4.0 (compatible; MSIE Version; Operating System)
舉個在Windows 98下運行的IE4瀏覽器,返回的user-agent格式就像這樣:Mozilla/4.0 (compatible; MSIE 4.0; Windows 98)
你們能夠看到,較上一版本,變更是同步返回Mozilla版本和真實的IE版本,因爲這一變更,能夠輕易的鑑別第四代瀏覽器。惋惜,IE在接下來的升級中沒有同步返回Mozilla版本。就像IE4.5(只發布在Macs上),IE版本變成了4.5,可是Mozilla版本仍舊返回是4:Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC)
在接下來的IE版本,甚至是IE7,user-agent仍舊保持一樣模式。
須要注意的是,IE8對user-agent作了些微的改變,增長了渲染引擎,Trident/Version:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)
關於Windows NT 5.1 表明什麼--》
Microsoft Windows XP (Windows NT 5.1) (2001)
增長渲染引擎信息很是重要,由於當IE8以兼容模式運行,而渲染引擎版本保持不變時,MSIE的版本會變成7.0。也是由於原始的IE7的user-agent沒有包含Trident版本,你能夠在兼容模式瀏覽下,輕易的區分IE7和IE8。
注意:目前還不清楚,隨着IE繼續發展,Mozilla版本會永遠不改變,由於這有點意思(user-agent不能絕對可靠的斷定任何事情)
Gecko (壁虎)
Gecko渲染引擎是Firefox的核心。Gecko發展之初,它被當作典型Mozilla瀏覽器(後來的網景瀏覽器6)的一部分。同時,爲網景瀏覽器6制定了一份說明書,說明在將來版本中user-agent的展示規格。新的格式相對於在4.x版本中使用的簡單格式有至關大的改動, 有點背道而馳。新的格式以下:
Mozilla/MozillaVersion (Platform; Encryption; OS-or-CPU; Language; PrereleaseVersion[預先版本])Gecko/GeckoVersion ApplicationProduct/ApplicationProductVersion
這個很是複雜的User-agent融入了不少想法。爲了更好的理解Gecko User-agent,琢磨一下如下從多種Gecko-base瀏覽器中獲取的User-agent
運行在Windows XP 上的Netscape 6.21 :
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1
運行在Linux上的SeaMonkey 1.1a
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1b2) Gecko/20060823 SeaMonkey/1.1a
運行在Windows XP上的Firefox 2.0.0.11
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
運行在Mac OS X 上的Camino 1.5.1:
Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.6) Gecko/20070809 Camino/1.5.1
全部這些user-agent都代表瀏覽器是基於Gecko渲染引擎(雖然版本不一樣)。一般狀況下,爲了尋找一款特殊瀏覽器,瞭解其是否基於Gecko渲染引擎不是一項重要指標。自從第一款基於Gecko的瀏覽器發佈後,Mozilla版本爲5.0就沒有更變過,看起來之後也不會變。
WebKit
2003年,蘋果公司發佈通告要發佈本身的web瀏覽器,稱爲Safari。Safari的渲染引擎就是WebKit,WebKit起初做爲KHTML格式渲染引擎的一個分支使用在基於Linux基準的web瀏覽器Konqueror中。幾年後,WebKit脫離出來,創建了本身的開源項目,專一發展開源引擎。
這款新瀏覽器Safari和WebKit渲染引擎的開發者們面對一個和IE3一樣面對的問題:怎麼確認瀏覽器不被流行的站點拒之門外?答案就是,在User-agent中放入足夠多的信息使站點確信這個瀏覽器是兼容其餘主流瀏覽器。這產生了一個新的User-agent格式:
Mozilla/5.0 (Platform; Encryption; OS-or-CPU; Language) AppleWebKit/AppleWebKitVersion (KHTML, like Gecko) Safari/SafariVersion
這裏舉個例子:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1
正如你所見,這是另外一個長長的user-agent字符串。他新增了兩個名目:Apple WebKit 版本和 Safari 版本。和那些基於Gecko標準的瀏覽器同樣,全部基於WebKit標準的瀏覽器都定義他們本身爲Mozilla 5.0。Safari 瀏覽器會生成一個表明性的瀏覽器版本號,這個表明性的數字沒必要非要表明當前的發佈版本。因此,即便Safari 1.25瀏覽器的User-agent中有125.1,並非和發佈版本號一一對應的。出於這個緣由,Safari瀏覽器的User-agent在第三版發佈的時候略有加強。在User-agent中用了真實的版本號信息:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5
在Safari的User-agent中,最早發佈的1.0版本中增添的"KHTML ,like Gecko"是最有趣且最受爭議的事情。蘋果公司收到了不少來自開發者的反饋,他們提出這是在糊弄用戶和服務器,使他們認爲Safari瀏覽器是基於Gecko的(即便Mozilla/5.0不起做用的狀況下)。蘋果公司的回覆相似當年微軟的遭遇:蘋果瀏覽器是爲了兼容Mozilla,並且站點不該該將蘋果瀏覽器用戶拒之門外就是由於他們彷佛使用了一個不被服務器支持的瀏覽器。
注意,這個改變只針對Safari,不針對WebKit,因此那些基於WebKit標準的瀏覽器沒有這個改變。通常來說,是否像Gecko,這是一種典型的鑑別是不是WebKit瀏覽器的方法,相比專門鑑別是不是Safari瀏覽器更有效。
Konqueror
Konqueror做爲一款捆綁在KDE Linux桌面系統中的瀏覽器,它基於KHTML開源渲染引擎。儘管僅僅是基於Linux,它仍有一批活躍的用戶基數。爲了最好的兼容性,它選擇將user-agent的格式定義成IE那樣:
Mozilla/5.0 (compatible; Konqueror/Version; OS-or-CPU)
然而,Konqueror 3.2版本引進了一個改動,這個改動同步Webkit的user-agent改動,像下面這樣定義它本身是KHTML:
Mozilla/5.0 (compatible; Konqueror/Version; OS-or-CPU) KHTML/KHTMLVersion (like Gecko)
這裏舉個例子:
Mozilla/5.0 (compatible; Konqueror/3.5; SunOs) KHTML/3.5.0 (like Gecko)
這裏面的Konqueror版本號和KHTML版本號趨於一致,或者是一丁點差別,就像Konqueror 3.5 基於 KHTML 3.5.1渲染。
Chrome
谷歌的Chrome瀏覽器採用WebKit做爲他們得渲染引擎,但用的是不一樣的Javascript引擎。Chrome 0.2做爲最初的beta發佈版本, 它的User-agent在繼承WebKit版本瀏覽器的格式的基礎上,額外的加入了Chrome的版本信息。它的格式以下:
Mozilla/5.0 (Platform; Encryption; OS-or-CPU; Language) AppleWebKit/AppleWebKitVersion (KHTML, like Gecko) Chrome/ChromeVersion Safari/SafariVersion
整個Chrome 0.2的User-agent 格式以下:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13
從這個User-agent能夠看到,Webkit的版本和Safari的版本就像是一直在同步升級的,儘管這不可靠。
Opera
在user-agent被關心以前Opera一直是備受爭議的瀏覽器。Opera的User-agent是在衆多現代瀏覽器中最合理的,他正確的代表了自身身份和版本信息。截止8.0以前,它的user-agent的格式是這樣的:
Opera/Version (OS-or-CPU; Encryption) [Language]
在Windows XP 電腦上運行的 Opera 7.54,它的User-agent格式是這樣的:
Opera/7.54 (Window NT 5.1; U) [en]
伴隨着Opera 8 的發佈,爲了更好的匹配其餘瀏覽器,它將user-agent格式中末尾的語言部分移到了括號裏面,就像這樣:
Opera/8.0 (Windows NT 5.1; U; en)
默認狀況下,Opera 迴歸了最原始的User-agent格式。當前狀況下,opera是四個主流瀏覽器中惟一一個在User-agent中經過產品名和版本號來完整的代表自身身份的瀏覽器。然而,與其餘瀏覽器比較,Opera在運用自身User-agent的過程當中遇到了很多問題。雖然它的User-agent在技術上是正確的,然而在互聯網上仍有一大堆在嗅探那些在User-agent中聲明本身是Mozilla產品的瀏覽器的嗅探器代碼。也有必定量的代碼嗅探IE和Gecko瀏覽器。面對這種狀況,Opera 經過改變自身user-agent格式將本身定義爲徹底不一樣的瀏覽器,來解決混亂的嗅探器帶來的問題。
Opera 9 中有兩種方法來改變User-agent字符串。一種是定義本身爲另外一個瀏覽器,不管是Firefox仍是IE。當作了這種選擇,User-agent看起來會像是和Firefox或者IE同樣,同時在尾部增長了"Opera"和Opera的版本號。這裏舉個例子:
像Firefox:
Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50
像IE:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50
第一個例子在保持Opera版本號的狀況下將Opera 9.5假裝爲Firefox 2。 第二個例子在保持Opera版本號的狀況下將Opera 9.5假裝成爲IE6。儘管以上這些User-agent能夠通過Firefox和IE6的校驗,同時保留了鑑別Opera的可能性。
另一種方法就是徹底將本身定義爲Firefox或者是IE。當屏蔽瀏覽器身份的時候,返回的User-agent信息和假裝對象返回的user-agent信息徹底同樣-沒有"Opera",沒有任何關於Opera版本信息。在屏蔽瀏覽器身份的狀況下,根本沒有辦法照着user-agent的字面意思去區分Opera和其餘瀏覽器。Opera面對這個問題的深一層次的想法是在不通知用戶的狀況下,根據特定狀況設定特殊的user-agent字符串,聽起來更復雜化了。
結論
這段關於瀏覽器的User-agent的歷史試圖說明了user-agent其實什麼都不是,它們很不可靠。
IE想要假裝成Netscape 4; Konqueror 和 WebKit 想要假裝成 Firefox; Chrome想要假裝成Safari。
儘管每一個瀏覽器(包括Opera這個奇葩)爲了讓本身更出衆,都給出了明確的信息讓嗅探器探測到,可是這仍是讓user-agent嗅探變得愈來愈難。關於嗅探,你須要記住的是一個瀏覽器經過巨長的user-agent來欺騙你,那是由於他們相信本身的瀏覽器是兼容他們在user-agent中所說起運行環境。在這些狀況下,甚至他們本身都不肯定哪一個是必須帶的。
舉個例子,Chrome要求索賠,由於那些能在Safari 3上運行的網站在Chrome上也能運行,因此應該沒有必要去檢測Chrome。這沒有任何意義,無異於搬起石頭砸本身的腳,因此如今Chrome惡搞Safari for Hotmail。Chrome並非惟一一個作這樣事情的,有不少因爲瀏覽器兼容的引發的發生在幕後的事情。因此,戰爭仍在繼續。
(原文出處:http://www.nczonline.net/blog/2010/01/12/history-of-the-user-agent-string/,初次翻譯,請多指正,若有正解,請直言不諱的指出,謝謝)