南昌莫非網(wǎng)絡(luò)科技:Netscape Navigator、Internet Explorer、Gecko用戶代理字符串的歷史.
用戶代理檢測(cè)通過檢測(cè)用戶代理字符串來確定實(shí)際使用的瀏覽器。在每一次HTTP請(qǐng)求過程中,用戶代理字符串是作為響應(yīng)首部發(fā)送的,而且該字符串可以通過JavaScript的navigator.userAgent屬性訪問。在服務(wù)器端,通過檢測(cè)用戶代理字符串來確定用戶使用的瀏覽器是一種常用而且廣為接受的做法。而在客戶端,用戶代理檢測(cè)一般被當(dāng)作一種萬不得已才用的做法,其優(yōu)先級(jí)排在能力檢測(cè)和(或)怪癖檢測(cè)之后。
提到與用戶代理字符串有關(guān)的爭(zhēng)議,就不得不提到電子欺騙(spoofing)。所謂電子欺騙,就是指瀏覽器通過在自己的用戶代理字符串加入一些錯(cuò)誤或誤導(dǎo)性信息,來達(dá)到欺騙服務(wù)器的目的。要弄清楚這個(gè)問題的來龍去脈,必須從Web問世初期用戶代理字符串的發(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í)中的用戶代理字符串則絕沒有如此簡(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公司介入瀏覽器開發(fā)領(lǐng)域后,遂將自己產(chǎn)品的代號(hào)定名為Mozilla(Mosaic Killer的簡(jiǎn)寫,意即Mosaic殺手)。該公司**個(gè)公開發(fā)行版,Netscape Navigator2的用戶代理字符串具有如下格式:
Mozilla/版本號(hào)[語言](平臺(tái);加密類型)
Netscape在堅(jiān)持將產(chǎn)品名和版本號(hào)作為用戶代理字符串開頭的基礎(chǔ)上,又在后面依次添加了下列信息:
口語言:即語言代碼,表示應(yīng)用程序針對(duì)哪種語言設(shè)計(jì);
口平臺(tái):即操作系統(tǒng)和(或)平臺(tái),表示應(yīng)用程序的運(yùn)行環(huán)境;
口加密類型:即安全加密的類型??赡艿闹涤蠻(128位加密)、I (40位加密)和N(未加密)。
典型的Netscape Navigator 2的用戶代理字符串如下所示:
Mozilla/2. 02 [ fr] (WinNT; 工)
這個(gè)字符串表示瀏覽器是Netscape Navigator 2.02.為法語國(guó)家編譯,運(yùn)行在Windows NT平臺(tái)下,加密類型為40位。那個(gè)時(shí)候,通過用戶代理字符串中的產(chǎn)品名稱,至少還能夠輕易地確定用戶使用的是什么瀏覽器。
2. Netscape Navigator 3和Internet Explorer 3
1996年,Netscape Navigator 3發(fā)布,隨即超越Mosaic成為當(dāng)時(shí)***的Web瀏覽器。而用戶代理字符串只作了一些小的改變,刪除了語言標(biāo)記,同時(shí)允許添加操作系統(tǒng)或系統(tǒng)使用的CPU等可選信息。于是,格式變成如下所示:
Mozilla/版本號(hào)(平臺(tái);加密類型[j操作系統(tǒng)或CPU說明])
運(yùn)行在Windows系統(tǒng)下的Netscape Navigator 3的用戶代理字符串大致如下:
Mozilla/3.0 (Win95;U)
這個(gè)字符串表示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)時(shí)占絕對(duì)市場(chǎng)份額,許多服務(wù)器在提供網(wǎng)頁之前都要專門檢測(cè)該瀏覽器。如果用戶通過IE打不開相關(guān)網(wǎng)頁,那么這個(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)在還沒有揭開——但很可能只是人為疏忽所致。
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說明])
因此,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))
換句話說,對(duì)于Windows 98中運(yùn)行的IE4而言,其用戶代理字符串為:
Mozilla/4.O(compatible; MSIE 4.O;Windows 98)
經(jīng)過此番修改,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ǎng)頁設(shè)計(jì)公司技術(shù)人員認(rèn)為,改不改這個(gè)版本號(hào),意義已經(jīng)不大了(誰也不能指望通過它得到什么可靠的結(jié)論)。
4.Gecko
Gecko是Firefox的呈現(xiàn)引擎。當(dāng)初的Gecko是作為通用Mozilla瀏覽器的一部分開發(fā)的,而**個(gè)采用Gecko引擎的瀏覽器是Netscape 6。為Netscape 6編寫的一份規(guī)范中規(guī)定了未來版本中用戶代理字符串的構(gòu)成。這個(gè)新格式與4.x版本中相對(duì)簡(jiǎn)單的字符串相比,有著非常大的區(qū)別,如下所示:
Mozilla/Mozilla版本號(hào)(平臺(tái);加密類型;操作系統(tǒng)或CPU;語言;預(yù)先發(fā)行版本)
Gecko/Gecko版本號(hào)應(yīng)用程序或產(chǎn)品/應(yīng)用程序或產(chǎn)品版本號(hào)
這個(gè)明顯復(fù)雜了很多的用戶代理字符串中蘊(yùn)含很多新想法。下表列出了字符串中各項(xiàng)的用意。
字符串項(xiàng) 必需嗎 說 明
Mozilla版本號(hào) 是 Mozilla的版本號(hào)平臺(tái) 是 瀏覽器運(yùn)行的平臺(tái)??赡艿闹蛋╓indows. 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得到的名稱相同語言是瀏覽器設(shè)計(jì)時(shí)所針對(duì)的目標(biāo)用戶語言預(yù)先發(fā)行版本 否 最初用于表示Mozilla的預(yù)先發(fā)行版本,現(xiàn)在則用來表示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的用戶代理字符串,下面我們來看幾個(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è)樣子,至今就沒有改變過;而且,看起來以后似乎也不會(huì)有什么變化。