[= Вводные замечания =]
1. Скрипт предназначен для распознавания браузера юзера самим браузером юзера, минуя navigator.userAgent. Аналогов ему нет.
2. Нижепредставленный скрипт отличается от скрипта распознавания gemaglabin'a в первом сообщении тем, что:
А) распознает не только группу браузеров, основанных на движке Gecko (Firefox, Netscape Navigator, Mozilla), но и сами эти браузеры внутри группы;
Б) распознает конкретные версии браузеров или диапазоны версий, внутри которых наборы объектов, свойств и методов реализованной модели javascript характеризуются определенным постоянством.
В) Мда, и код у него больше.
3. В качестве признаков идентификации были взяты две особенности:
Первая: само наличие или отсутствие объектов, свойств и методов в модели javascript браузера, набор которых изменяется от версии к версии.
Вторая: возможность вывода этих объектов, свойств и методов в цикле for ... in. Даже имеющиеся объекты-методы не всегда доступны к просмотру в цикле for ... in. Этот показатель также переменен от версии к версии.
4. Разумеется, в строгом смысле скрипт нельзя назвать скриптом на javascript. В нем использованы как средства Jscript, так и фирменные возможности других браузеров, не предусмотренные стандартами javascript.
[= Скрипт =]
PHP код:
var result=''; // сюда будем записывать результат идентификации
if(window.opera)
{
result+='Opera '; // уже точно Opera
var d=new Array();
for (e in document) d.push(e);
d=d.toString();
if (window.XSLTProcessor) // 9.0-9.25
{
if (d.indexOf('execCommand')==-1) result+='9.24';
else
{
if (document.selectNodes)
{
if (d.indexOf('postMessage')==-1) result+='9.25';
else result+='9.02-9.23';
}
else
{
if (d.indexOf('onload')!=-1) result+='9.01';
else result+='9.0';
}
}
}
else
if (document.all) // 8.0-8.54
{
if (!opera.SRPNumber) result+='8.50-8.54';
else
{
if (document.postMessage) result+='8.01-8.02';
else result+='Opera 8.0';
}
}
else // 7.02-7.54
{
if (window.navigate) result+='7.50-7.54';
else
{
if (window.getComputedStyle) result+='7.20-7.23';
else
{
if (window.VXMLAudioRecording) result+='7.11';
else result+='7.02-7.1';
}
}
}
}
else if (document.layers) result+='Netscape Navigator 4.x'; // Old Netscape
else if (document.defaultCharset == undefined && !window.opera) // Gecko based
{
var a=new Array();
for (b in document.body) a.push(b);
a=a.toString();
var h=new Array();
for (i in document) h.push(i);
h=h.toString();
if (document.defaultView.globalStorage)
{
if (document.defaultView.getInterface) result+='Firefox 2.0-2.0.0.11';
else result+='Netscape Navigator 9.0-9.0.0.5';
}
else
{
if (document.defaultView.getInterface && window.Components) result+='Firefox 1.5-1.5.0.8';
else
{
if (a.indexOf('addEventListener')==-1)
{
if (h.indexOf('preferredStylesheetSet')!=-1) result+='Firefox 1.0.6-1.0.7';
else result+='Mozilla 1.7.10-1.7.13';
}
else
{
if (document.defaultView.setTransparency) result+='Netscape Navigator 8.1';
else
{
if (window.pkcs11.addmodule && window.OPEN_NEW_WIN_ONLY) result+='Netscape Navigator 8.0.2-8.0.4';
else
{
if (document.actualEncoding)
{
if (h.indexOf('preferredStylesheetSet')!=-1) result+='Firefox 1.0-1.0.4';
else result+='Firefox 0.8-0.9 or Mozilla 1.7-1.7.8 or Netscape Navigator 7.2';
}
else
if (sidebar.CHECK_ANONYMOUS) result+='Netscape Navigator 7.0-7.02';
}
}
}
}
}
}
else // IE
{
var JScript='';
/*@cc_on @*/
/*@ JScript=@_jscript_version @*/
JScript==3.0? result+='Internet Explorer 4.0': JScript==5.0? result+='Internet Explorer 5.0': JScript==5.5? result+='Internet Explorer 5.5': JScript==5.6? result+='Internet Explorer 6.0': JScript==5.7? result+='Internet Explorer 7.0': result+='Browser unknown';
}
document.write('<b><font size=4>Result of fingerprinting:</font></b> '+result+'<br /><b><font size=4>Browserinfo (navigator.userAgent):</font></b> '+window.navigator.userAgent);
//\\ LeverOne //\\
[= Заключительные замечания =]
1. О недостатках
А) Распознавание основано на предположении, что клиент использует один из тех браузеров, на которые нацелено распознавание: FireFox, Mozilla, Netscape Navigator, Opera, Internet Explorer. Остальные могут быть распознаны некорректно, хотя многое сделано, чтобы такие браузеры были обозначены отдельно как "неопознанные".
Б) Брались во внимание только финальные версии, но не альфа, бета и т.д.
В) Просмотр исходного кода страницы до распознавания может повлечь ошибку идентификации. Необходимо просматривать его после получения результата.
Г) Из-за того, что объекты-методы могут то появляться, то исчезать в новых версиях (ибо процесс расширения возможностей нелинеен во времени) скрипт может давать ошибочные результаты при распознавании более новых версий, чем заложено в нем самом. Например, Opera 9.25 ближе к 9.23, чем к 9.24.
Д) Тестировалось всё под Виндовс, как те же самые браузеры поведут в других OC, утверждать не могу.
2. Версии распознающихся браузеров:
IE: 4.0, 5.0, 5.5, 6.0, 7.0
Opera: 7.02, 7.03, 7.10, 7.11, 7.20, 7.21, 7.22, 7.23, 7.50, 7.51, 7.52, 7.53, 7.54, 8.0, 8.01, 8.02, 8.50, 8.51, 8.52, 8.53, 8.54, 9.0, 9.01, 9.02, 9.10, 9.20-9.25
_http://arc.opera.com/pub/opera/win
Firefox: 0.8, 0.9, 1.0, 1.0.1-1.0.7, 1.5, 1.5.0.1-1.5.0.8, 2.0, 2.0.0.1-2.0.0.11
Netscape Navigator: 4.x, 7.0, 7.01, 7.02, 7.2, 8.02, 8.03, 8.04, 8.1, 9.0, 9.0.0.1-9.0.0.5
_http://browser.netscape.com/downloads/archive
Mozilla: 1.7, 1.7.1-1.7.13
_http://www.mozilla.org/releases/