Авторские статьи Определяем движок браузера

Discussion in 'Статьи' started by Goudini, 19 Nov 2007.

  1. Goudini

    Goudini Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    132
    Likes Received:
    134
    Reputations:
    91
    Я хочу вкратце рассмотреть нестандартные методы определения браузера.

    "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:
    Code:
    GET / HTTP/1.1
    [B]User-Agent: Opera/9.24 (Windows NT 5.1; U; ru)[/B] 
    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:
    Code:
    GET / HTTP/1.1
    [B]Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* [/B]
    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:
    Code:
    GET / HTTP/1.1
    [B]Host: localhost[/B]
    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:
    <?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.

    Code:
    Cookie: PHPSESSID=cedc117198a362150e7aa27ad4d6c9dc
    Cookie2: $Version=1
    Скрипт определения будет выглядеть таким образом:

    PHP:
    <?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
     
    nsz and Alexsize like this.
  2. Zedobat

    Zedobat Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    145
    Likes Received:
    34
    Reputations:
    10
    Какой у меня браузер?
    Напиши лучше как через JS определить, тк или не трогаю заголовки вообще или меняют их по полной программе.
     
  3. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    get_headers выдает заголовки независимо от серверного по , а как это дело обстоит с js - https://forum.antichat.ru/thread32325.html . На практике показало что такое "точное" определение путем игры с заголовками никчему не привело.
     
    1 person likes this.