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