南昌莫非網(wǎng)絡(luò)科技:Netscape Navigator、Internet Explorer、Gecko用戶代理字符串的歷史.
用戶代理檢測通過檢測用戶代理字符串來確定實際使用的瀏覽器。在每一次HTTP請求過程中,用戶代理字符串是作為響應(yīng)首部發(fā)送的,而且該字符串可以通過JavaScript的navigator.userAgent屬性訪問。在服務(wù)器端,通過檢測用戶代理字符串來確定用戶使用的瀏覽器是一種常用而且廣為接受的做法。而在客戶端,用戶代理檢測一般被當(dāng)作一種萬不得已才用的做法,其優(yōu)先級排在能力檢測和(或)怪癖檢測之后。
提到與用戶代理字符串有關(guān)的爭議,就不得不提到電子欺騙(spoofing)。所謂電子欺騙,就是指瀏覽器通過在自己的用戶代理字符串加入一些錯誤或誤導(dǎo)性信息,來達(dá)到欺騙服務(wù)器的目的。要弄清楚這個問題的來龍去脈,必須從Web問世初期用戶代理字符串的發(fā)展講起。
用戶代理字符串的歷史
HTTP規(guī)范(包括1.0和1.1版)明確規(guī)定,瀏覽器應(yīng)該發(fā)送簡短的用戶代理字符串,指明瀏覽器的名稱和版本號。RFC 2616(即HTTP l.1協(xié)議規(guī)范)是這樣描述用戶代理字符串的:
“產(chǎn)品標(biāo)識符常用于通信應(yīng)用程序標(biāo)識自身,由軟件名和版本組成。使用產(chǎn)品標(biāo)識符的大多數(shù)領(lǐng)域也允許列出作為應(yīng)用程序主要部分的子產(chǎn)品,由空格分隔。按照慣例,產(chǎn)品要按照相應(yīng)的重要程度依次列出,以便標(biāo)識應(yīng)用程序。”
上述規(guī)范進(jìn)一步規(guī)定,用戶代理字符串應(yīng)該以一組產(chǎn)品的形式給出,字符串格式為:標(biāo)識符/產(chǎn)品版本號。但是,現(xiàn)實中的用戶代理字符串則絕沒有如此簡單。
1.早期的瀏覽器
1993年,美國NCSA (National Center for Supercomputing Applications,國家超級計算機(jī)中心)發(fā)布了世界上**款Web瀏覽器Mosaic。這款瀏覽器的用戶代理字符串非常簡單,類似如下所示:
Mosaic/0.9
盡管這個字符串在不同操作系統(tǒng)和不同平臺下會有所變化,但其基本格式還是簡單明了的。正斜杠前面的文本表示產(chǎn)品名稱(有時候會出現(xiàn)NCSA Mosaic或其他類似字樣),而斜杠后面的文本是產(chǎn)品的版本號。
Netscape Communications公司介入瀏覽器開發(fā)領(lǐng)域后,遂將自己產(chǎn)品的代號定名為Mozilla(Mosaic Killer的簡寫,意即Mosaic殺手)。該公司**個公開發(fā)行版,Netscape Navigator2的用戶代理字符串具有如下格式:
Mozilla/版本號[語言](平臺;加密類型)
Netscape在堅持將產(chǎn)品名和版本號作為用戶代理字符串開頭的基礎(chǔ)上,又在后面依次添加了下列信息:
口語言:即語言代碼,表示應(yīng)用程序針對哪種語言設(shè)計;
口平臺:即操作系統(tǒng)和(或)平臺,表示應(yīng)用程序的運(yùn)行環(huán)境;
口加密類型:即安全加密的類型。可能的值有U(128位加密)、I (40位加密)和N(未加密)。
典型的Netscape Navigator 2的用戶代理字符串如下所示:
Mozilla/2. 02 [ fr] (WinNT; 工)
這個字符串表示瀏覽器是Netscape Navigator 2.02.為法語國家編譯,運(yùn)行在Windows NT平臺下,加密類型為40位。那個時候,通過用戶代理字符串中的產(chǎn)品名稱,至少還能夠輕易地確定用戶使用的是什么瀏覽器。
2. Netscape Navigator 3和Internet Explorer 3
1996年,Netscape Navigator 3發(fā)布,隨即超越Mosaic成為當(dāng)時***的Web瀏覽器。而用戶代理字符串只作了一些小的改變,刪除了語言標(biāo)記,同時允許添加操作系統(tǒng)或系統(tǒng)使用的CPU等可選信息。于是,格式變成如下所示:
Mozilla/版本號(平臺;加密類型[j操作系統(tǒng)或CPU說明])
運(yùn)行在Windows系統(tǒng)下的Netscape Navigator 3的用戶代理字符串大致如下:
Mozilla/3.0 (Win95;U)
這個字符串表示Netscape Navigator 3運(yùn)行在Windows 95中,采用了128位加密技術(shù)。可見,在Windows系統(tǒng)中,字符串中的操作系統(tǒng)或CPU說明被省略了。
Netscape Navigator 3發(fā)布后不久,微軟也發(fā)布了其**款贏得用戶廣泛認(rèn)可的Web瀏覽器,即Internet Explorer 3。由于Netscape瀏覽器在當(dāng)時占絕對市場份額,許多服務(wù)器在提供網(wǎng)頁之前都要專門檢測該瀏覽器。如果用戶通過IE打不開相關(guān)網(wǎng)頁,那么這個新生的瀏覽器很可能就會夭折。于是,微軟決定將IE的用戶代理字符串修改成兼容Netscape的形式,結(jié)果如下:
Mozilla/2.0(compatible; MSIE版本號;操作系統(tǒng))
例如,Windows 95平臺下的Internet Explorer 3 .02帶有如下用戶代理字符串:
Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)
由于當(dāng)時的大多數(shù)瀏覽器嗅探程序只檢測用戶代理字符串中的產(chǎn)品名稱部分,結(jié)果IE就成功地將自己標(biāo)識為Mozilla,從而偽裝成Netscape Navigator。微軟的這一做法招致了很多批評,因為它違反了瀏覽器標(biāo)識的慣例。更不規(guī)范的是,IE將真正的瀏覽器版本號插入到了字符串的中間。
字符串中另外一個有趣的地方是標(biāo)識符Mozilla 2.0(而不是3.0)。畢竟,當(dāng)時的主流版本是3.0,改成3.0應(yīng)該對微軟更有利才對。但真正的謎底到現(xiàn)在還沒有揭開——但很可能只是人為疏忽所致。
3. Netscape Communicator 4和Internet Explorer 4-8
1997年8月,Netscapte Communicator4發(fā)布(這一版將瀏覽器名字中的Navigator換成了Communicator)。Netscape繼續(xù)遵循了第3版時的用戶代理字符串格式:Mozilla/版本號(平臺;加密類型[;操作系統(tǒng)或CPU說明])
因此,Windows 98平臺中第4版的用戶代理字符串如下所示:
Mozilla/4.O(Win98;工)
Netscape在發(fā)布補(bǔ)丁時,子版本號也會相應(yīng)提高,用戶代理字符串如下面的4.79版所示:
Mozilla/4. 79 (Win98;工)
但是,微軟在發(fā)布Internet Explorer4時,順便將用戶代理字符串修改成了如下格式:
Mozilla/4.O(compatible; MSIE版本號j操作系統(tǒng))
換句話說,對于Windows 98中運(yùn)行的IE4而言,其用戶代理字符串為:
Mozilla/4.O(compatible; MSIE 4.O;Windows 98)
經(jīng)過此番修改,Mozilla版本號就與實際的IE版本號一致了,為識別它們的第四代瀏覽器提供了方便。但令人遺憾的是,兩者的一致性**于這一個版本。在Internet Explorer 4.5發(fā)布時(只針對Macs),雖然Mozilla版本號還是4,但I(xiàn)E版本號則改成了如下所示:
Mozilla/4.O (compatible; MSIE 4.5;Mac_PowerPC; Trident/4.O)
此后,lE的版本一直到7都沿襲了這個模式。而IE 8的用戶代理字符串中添加了呈現(xiàn)引擎(Trident)
的版本號①:
Mozilla/4.O(compatible; MSIE 8.0;Windows NT 5 .1; Trident/4.O)
至于IE的后續(xù)版本會不會修改Mozilla版本號,目前還無從知曉;南昌網(wǎng)頁設(shè)計公司技術(shù)人員認(rèn)為,改不改這個版本號,意義已經(jīng)不大了(誰也不能指望通過它得到什么可靠的結(jié)論)。
4.Gecko
Gecko是Firefox的呈現(xiàn)引擎。當(dāng)初的Gecko是作為通用Mozilla瀏覽器的一部分開發(fā)的,而**個采用Gecko引擎的瀏覽器是Netscape 6。為Netscape 6編寫的一份規(guī)范中規(guī)定了未來版本中用戶代理字符串的構(gòu)成。這個新格式與4.x版本中相對簡單的字符串相比,有著非常大的區(qū)別,如下所示:
Mozilla/Mozilla版本號(平臺;加密類型;操作系統(tǒng)或CPU;語言;預(yù)先發(fā)行版本)
Gecko/Gecko版本號應(yīng)用程序或產(chǎn)品/應(yīng)用程序或產(chǎn)品版本號
這個明顯復(fù)雜了很多的用戶代理字符串中蘊(yùn)含很多新想法。下表列出了字符串中各項的用意。
字符串項 必需嗎 說 明
Mozilla版本號 是 Mozilla的版本號平臺 是 瀏覽器運(yùn)行的平臺。可能的值包括Windows. Mac和XII(指Unix的X窗口系統(tǒng))
加密類型是加密技術(shù)的類型:U表示128位、I表示40位、N表示未加密操作系統(tǒng)或CPU 是 瀏覽器運(yùn)行的操作系統(tǒng)或計算機(jī)系統(tǒng)使用的CPU。在Windows平臺中,這一項指Windows的版本(如WinNT、Win95,等等)。如果平臺是Macintosh.這一項指CPU(針對PowerPC的68K、PPC,或
Maclntel)。如果平臺是Xll,這一項是Unix操作系統(tǒng)的名稱,與使用Unix命令uname- sm得到的名稱相同語言是瀏覽器設(shè)計時所針對的目標(biāo)用戶語言預(yù)先發(fā)行版本 否 最初用于表示Mozilla的預(yù)先發(fā)行版本,現(xiàn)在則用來表示Gecko呈現(xiàn)引擎的版本號Gecko版本號 是 Gecko呈現(xiàn)引擎的版本號,但由yyyymmdd格式的日期表示應(yīng)用程序或產(chǎn)品 否 使用Gecko的產(chǎn)品名。可能是Netscape、Firefox,等等
應(yīng)用程序或產(chǎn)品版本號 否 應(yīng)用程序或產(chǎn)品的版本號;用于區(qū)分Mozilla版本號和Gecko版本號為了幫助讀者更好地理解Gecko的用戶代理字符串,下面我們來看幾個從基于Gecko的瀏覽器中取得的字符串。
Windows XP下的Netscape 6.21:
Mozilla/5.O(Windows;U;Windows NT 5 .1; en-US; rv:0.9.4)Gecko/20011128 Netscape6/6.2.1
Linux下的SeaMonkey l.la:
Mozilla/5.0(X11;U;Linux i686; en-US; rv:1.8.1b2) Gecko/20060823 SeaMonkey/l. la
Windows XP下的Firefox 2.0.0.11:
Mozilla/5.0(Windows;U;Windows NT 5.1;en-US; nr:1.8.1.ll) Gecko/20071127 Firef ox/2.0.0.11
Mac OSX下的Camin0 1.5.1:
Mozilla/5.0(Macintosh;U;Intel Mac Os X;en; nr:1.8.1.6)Gecko/2 0070809 Camino/l.5.1
以上這些用戶代理字符串都取自基于Gecko的瀏覽器(只是版本有所不同)。南昌網(wǎng)絡(luò)公司技術(shù)員認(rèn)為很多時候,檢測特定的瀏覽器還不如搞清楚它是否基于Gecko更重要。每個字符串中的Mozilla版本都是5.O,自從**個基于Gecko的瀏覽器發(fā)布時修改成這個樣子,至今就沒有改變過;而且,看起來以后似乎也不會有什么變化。