2011-08-10 143 views

回答

1

不可靠,沒有。任何人都可以僞造實際的客戶。

行爲良好的機器人將使用自己的用戶代理。無論如何,你不應該關心那些表現不好的機器人。

0

同意用戶代理不可靠且容易被欺騙。但是,您可能可以構建一些JavaScript來使欺騙更難一些。它當然可以區分那些沒有JavaScript引擎的東西。看到我的答案在這裏:https://stackoverflow.com/a/12571513/399704

0

有不止是試圖用JavaScript或通過用戶代理字符串檢測它。

我做了一些研究,如何在僞造用戶代理字符串時識別瀏覽器。我發現許多瀏覽器(有時幾乎沒有版本差異,有時與大的差異)以不同的順序發送不同的標題信息。通常,通過檢測標題信息發送到服務器的順序,可以區分所有大型瀏覽器(Firefox,IE,Chrome,...)。儘管這一切都可以被欺騙。

欲瞭解更多信息,請閱讀這裏:http://hide.network/why-does-changing-your-user-agent-almost-come-to-nothing/

這是一個有點棘手檢測,但有可能。在PHP中,您可以簡單地使用函數getallheaders()來完成此任務。正如我測試的那樣,它會爲您提供與瀏覽器發送相同的標題信息順序。你只需要檢測每個鍵的實際索引。

<?php 
    foreach (getallheaders() as $name => $value) 
    { 
     echo "$name: $value<br />\n"; 
    } 
?> 

編輯:

我寫了一個腳本來檢測PHP一些主要的瀏覽器。起初,我忘記了將通過單擊頁面鏈接發送的引用者。我在列表中添加了IE和FF引用標頭,也許這對任何事情都有幫助。我還將腳本上傳到了hide.network/header.php,但不能發佈兩個以上的鏈接。

<?php 
    $headerInformation = array(); 

    // declaring and filling pre-defined header orders of browsers 
    $browserInformation = array 
          (
           "browserNames" => array 
           (
            "Mozilla Firefox 37.0", 
            "Mozilla Firefox 37.0 with referer", 
            "Internet Explorer 11", 
            "Internet Explorer 11 with referer", 
            "Internet Explorer 8", 
            "Google Chrome 42", 
            "SRWare Iron 37" 
           ), 
           "headerInformation" => array 
           (
            array("host", "user-agent", "accept", "accept-language", "accept-encoding", "connection", "cache-control"), 
            array("host", "user-agent", "accept", "accept-language", "accept-encoding", "referer", "connection", "cache-control"), 
            array("accept", "accept-language", "user-agent", "accept-encoding", "host", "dnt", "connection"), 
            array("accept", "referer", "accept-language", "user-agent", "accept-encoding", "host", "dnt", "connection"), 
            array("accept", "accept-language", "user-agent", "accept-encoding", "host", "connection"), 
            array("host", "connection", "cache-control", "accept", "user-agent", "accept-encoding", "accept-language"), 
            array("host", "connection", "accept", "user-agent", "accept-encoding", "accept-language") 
           ), 
           "identScore" => array(0, 0, 0, 0, 0) 
          ); 

    // parsing all header values 
    foreach (getallheaders() as $name => $value) 
    { 
     array_push($headerInformation, strtolower($name)); 
    } 

    // calculating possibility for each browser 
    for($i = 0; $i < count(10); $i++) 
    { 
     for($j = 0; $j < count($browserInformation["browserNames"]); $j++) 
     { 
      $currentPossibility = count(array_intersect_assoc($browserInformation["headerInformation"][$j], $headerInformation))/count($headerInformation) * 100; 
      $currentPossibility = round($currentPossibility, 2); 
      $browserInformation["identScore"][$j] = $currentPossibility; 
     } 
    } 

    // sort array 
    array_multisort($browserInformation["identScore"], SORT_DESC, SORT_NUMERIC, 
        $browserInformation["browserNames"], $browserInformation["headerInformation"]); 

    // output 
    for($i = 0; $i < count(10); $i++) 
    { 
     for($j = 0; $j < count($browserInformation["browserNames"]); $j++) 
     { 
      echo "possibility " . $browserInformation["browserNames"][$j] . ": " . $browserInformation["identScore"][$j] . " %<br />"; 
     } 
    } 

    // output original sent header 
    echo "<pre>"; 
    var_dump($headerInformation); 
    echo "</pre>"; 
?>