Goudini
19.11.2007, 16:30
Я хочу вкратце рассмотреть нестандартные методы определения браузера.
"The User-Agent request-header field contains information about the user agent originating the request. This is for statistical purposes, the tracing of protocol violations, and automated recognition of user agents for the sake of tailoring responses to avoid particular user agent limitations" (с) rfc2616
Самым простым способом было бы использовать User-Agent из HTTP запроса чтобы определить тип браузера и ОС. Но это поле не всегда содержит правильную информацию. Его легко сменить с помощью плагинов, прокси-серверов.. Мы не будем рассматриват этот метод.
Посмотрим какие заголовки посылают разные браузеры.
Opera:
GET / HTTP/1.1
User-Agent: Opera/9.24 (Windows NT 5.1; U; ru)
Host: localhost
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: uk-UA,uk;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive
IE:
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: uk
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: localhost
Connection: Keep-Alive
Firefox:
GET / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
В первой строке указывается метод, путь на сервере и версия протокола. Вторая строка различается. Таким образом по второму заголовку можно определять движок браузера - Opera, Inernet Explorer, Firefox/Epiphany :
<?php
function detect_browser()
{
$headers = array_keys(apache_request_headers());
if ($headers[0] == 'User-Agent') $browser = 'Opera';
elseif ($headers[0] == 'Accept') $browser = 'Internet Explorer';
elseif ($headers[0] == 'Host') $browser = 'Mozilla';
else $browser = 'Unknown';
return $browser;
}
echo detect_browser();
?>
Скрипт будет работать только в том случае, если PHP работает в качестве модуля Apache, из-за использования функции apache_request_headers()
Различе запросов как раз и позволяет выяснить, какой софт используется на клинтской стороне. К примеру, Opera, посылает свойственный только ей заголовок Cookie2.
Cookie: PHPSESSID=cedc117198a362150e7aa27ad4d6c9dc
Cookie2: $Version=1
Скрипт определения будет выглядеть таким образом:
<?php
setcookie("foo", "bar");
if (isset($_SERVER['HTTP_COOKIE2'])) $browser = 'Opera';
echo $browser;
?>
[+] Reference:
www.php.net
www.net-square.com/whitepapers/browser_ident.pdf
www.w3.org/Protocols/rfc2616/rfc2616.html
"The User-Agent request-header field contains information about the user agent originating the request. This is for statistical purposes, the tracing of protocol violations, and automated recognition of user agents for the sake of tailoring responses to avoid particular user agent limitations" (с) rfc2616
Самым простым способом было бы использовать User-Agent из HTTP запроса чтобы определить тип браузера и ОС. Но это поле не всегда содержит правильную информацию. Его легко сменить с помощью плагинов, прокси-серверов.. Мы не будем рассматриват этот метод.
Посмотрим какие заголовки посылают разные браузеры.
Opera:
GET / HTTP/1.1
User-Agent: Opera/9.24 (Windows NT 5.1; U; ru)
Host: localhost
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: uk-UA,uk;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive
IE:
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: uk
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: localhost
Connection: Keep-Alive
Firefox:
GET / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
В первой строке указывается метод, путь на сервере и версия протокола. Вторая строка различается. Таким образом по второму заголовку можно определять движок браузера - Opera, Inernet Explorer, Firefox/Epiphany :
<?php
function detect_browser()
{
$headers = array_keys(apache_request_headers());
if ($headers[0] == 'User-Agent') $browser = 'Opera';
elseif ($headers[0] == 'Accept') $browser = 'Internet Explorer';
elseif ($headers[0] == 'Host') $browser = 'Mozilla';
else $browser = 'Unknown';
return $browser;
}
echo detect_browser();
?>
Скрипт будет работать только в том случае, если PHP работает в качестве модуля Apache, из-за использования функции apache_request_headers()
Различе запросов как раз и позволяет выяснить, какой софт используется на клинтской стороне. К примеру, Opera, посылает свойственный только ей заголовок Cookie2.
Cookie: PHPSESSID=cedc117198a362150e7aa27ad4d6c9dc
Cookie2: $Version=1
Скрипт определения будет выглядеть таким образом:
<?php
setcookie("foo", "bar");
if (isset($_SERVER['HTTP_COOKIE2'])) $browser = 'Opera';
echo $browser;
?>
[+] Reference:
www.php.net
www.net-square.com/whitepapers/browser_ident.pdf
www.w3.org/Protocols/rfc2616/rfc2616.html