Пример #1
0
 function bbc_marker()
 {
     if (_BBC_PHP < 410) {
         global $HTTP_SERVER_VARS;
     }
     global $BBC_CACHE_PATH, $BBC_COUNTER_PREFIX, $BBC_COUNTER_SUFFIX, $BBC_IGNORE_IP, $BBC_SEP, $BBC_TIMESTAMP, $BBC_TIME_OFFSET, $DOCUMENT_ROOT, $HTTP_HOST, $HTTP_X_REMOTECLIENT_IP, $LOCAL_ADDR, $PATH_INFO, $PHP_SELF, $SCRIPT_FILENAME, $SERVER_NAME;
     $this->sep = $BBC_SEP;
     $this->ignored = false;
     $this->filename = $this->bbc_counter_file($BBC_CACHE_PATH, $BBC_COUNTER_PREFIX, $BBC_COUNTER_SUFFIX);
     $time = $BBC_TIMESTAMP + $BBC_TIME_OFFSET * 60;
     // loads of initialisations
     $hdr = array("DOCUMENT_ROOT", "HTTP_USER_AGENT", "LOCAL_ADDR", "REMOTE_HOST", "REMOTE_ADDR", "HTTP_HOST", "HTTP_REFERER", "HTTP_X_REMOTECLIENT_IP", "ORIG_PATH_INFO", "ORIG_PATH_TRANSLATED", "ORIG_SCRIPT_FILENAME", "PATH_INFO", "PATH_TRANSLATED", "HTTP_PC_REMOTE_ADDR", "PHP_SELF", "SCRIPT_FILENAME", "SERVER_NAME", "SERVER_ADDR");
     foreach ($hdr as $str) {
         ${$str} = _BBC_PHP < 410 ? !empty($HTTP_SERVER_VARS[$str]) : !empty($_SERVER[$str]) ? bbc_clean(_BBC_PHP < 410 ? $HTTP_SERVER_VARS[$str] : $_SERVER[$str], $BBC_SEP) : false;
     }
     // determine whether we got the "ORIG_" prefix
     foreach (array("PATH_INFO", "PATH_TRANSLATED", "SCRIPT_FILENAME") as $env) {
         ${$env} = !empty(${"ORIG_" . $env}) ? ${"ORIG_" . $env} : ${$env};
     }
     $filename = empty($PATH_TRANSLATED) || $PATH_TRANSLATED == $DOCUMENT_ROOT ? basename($SCRIPT_FILENAME) : basename($PATH_TRANSLATED);
     $REMOTE_ADDR = stristr(PHP_OS, "darwin") !== false && !empty($HTTP_PC_REMOTE_ADDR) ? $HTTP_PC_REMOTE_ADDR : $REMOTE_ADDR;
     $REQUEST_URI = $this->bbc_filter_uri($filename, $PATH_INFO, $PHP_SELF);
     $SERVER_ADDR = empty($SERVER_ADDR) ? $LOCAL_ADDR : $SERVER_ADDR;
     $SERVER_ADDR = $this->bbc_valid_ip($SERVER_ADDR) ? $SERVER_ADDR : "127.0.0.1";
     $HTTP_USER_AGENT = empty($HTTP_USER_AGENT) ? "unknown" : $HTTP_USER_AGENT;
     $HTTP_REFERER = empty($HTTP_REFERER) ? "unknown" : $this->bbc_filter_ref($HTTP_HOST, $HTTP_REFERER, $SERVER_NAME, $SERVER_ADDR);
     // Use a page name even if the user didn't specify it
     $page = defined("_BBC_PAGE_NAME") ? bbc_clean(_BBC_PAGE_NAME, $BBC_SEP) : $this->bbc_auto_page_name($REQUEST_URI);
     $prx = $this->bbc_parse_headers();
     if (!empty($prx)) {
         $prx_addr = $this->bbc_get_remote_addr($REMOTE_ADDR, $HTTP_X_REMOTECLIENT_IP);
         if (($this->ignored = $this->bbc_is_ignored($BBC_IGNORE_IP, $prx_addr)) !== false) {
             return;
         } else {
             $REMOTE_ADDR = bbc_clean($prx, $BBC_SEP);
         }
     } else {
         $prx_addr = "unknown";
         $REMOTE_ADDR = $this->bbc_get_remote_addr($REMOTE_ADDR, $HTTP_X_REMOTECLIENT_IP);
     }
     if (($this->ignored = $this->bbc_is_ignored($BBC_IGNORE_IP, $REMOTE_ADDR)) !== false) {
         return;
     }
     // "unknown" is meant as a placeholder for the hostname, which will be processed at a different location
     $this->string = $time . $this->sep . $prx_addr . $this->sep . $REMOTE_ADDR . $this->sep . "unknown" . $this->sep . $HTTP_USER_AGENT . $this->sep . $HTTP_REFERER . $this->sep . $REQUEST_URI . $this->sep . $page . "\n";
 }
Пример #2
0
function bbc_get_keywords($ref)
{
    global $BBC_CUSTOM_CHARSET, $access;
    $var_sep = array("&", "|");
    $word_sep = array("+", " ", "/");
    $match = array("ara", "busca", "pesquis", "search", "srch", "seek", "zoek", "result", "szuka", "cherch", "such", "find", "trouve", "trova", "pursuit", "keres", "katalogus", "alltheinternet.com", "mamma.com", "baidu.com", "heureka.hu", "kartoo.com", "ask.com", "aport.ru", "google", "yahoo");
    foreach ($match as $key) {
        // if string occurs at the beginning strpos() returns integer 0, if it can't be
        // found at all, however, it returns boolean false => definition required which
        // considers 0 as true
        $is_search = strpos(strtolower($ref), $key) !== false ? true : false;
        if ($is_search) {
            break;
        }
    }
    if (!$is_search) {
        return false;
    }
    $ref = str_replace("&amp;", "&", urldecode($ref));
    $is_query = strrpos($ref, "?");
    $ref = $is_query !== false ? substr($ref, ++$is_query) : substr($ref, strpos($ref, "://") + 3);
    $get_vars = bbc_get_sep($ref, $var_sep);
    $raw_search = bbc_get_search($get_vars);
    if ($raw_search === false) {
        return false;
    }
    // Conversion of keywords, if applicable
    $from = extension_loaded("mbstring") ? bbc_get_encoding($raw_search) : false;
    $char = !empty($BBC_CUSTOM_CHARSET) ? $BBC_CUSTOM_CHARSET : false;
    $raw_search = $from !== false || extension_loaded("recode") ? bbc_convert_lang($raw_search, $from, $char) : $raw_search;
    $flt_search = bbc_get_sep($raw_search, $word_sep);
    for ($i = 0, $j = count($flt_search); $i < $j; $i++) {
        // Filter search engine cache indicator
        if (strlen($flt_search[$i]) > 50 || strlen($flt_search[$i]) < 2 || preg_match("#^(cache|tbn)\\:[a-z0-9_\\-]{8,16}\\:#", $flt_search[$i])) {
            unset($flt_search[$i]);
            continue;
        }
        // strtolower messes up UTF-8 so we leave things case sensitive if it's
        // requested as charset
        $flt_search[$i] = !$char || stristr($char, "UTF") === false ? strtolower(bbc_clean($flt_search[$i])) : bbc_clean($flt_search[$i]);
        $access['key'][$flt_search[$i]] = !isset($access['key'][$flt_search[$i]]) ? 1 : ++$access['key'][$flt_search[$i]];
    }
    return !empty($flt_search) ? $flt_search : false;
}
Пример #3
0
function bbc_add_new_connections_to_old()
{
    global $BBC_IGNORE_AGENT, $BBC_IGNORE_BOTS, $BBC_MAXTIME, $BBC_MAXVISIBLE, $BBC_NO_DNS, $BBC_NO_HITS, $BBC_PURGE_SINGLE, $access, $last;
    // Checking whether we have new connections
    if (!($new_access = bbc_counter_to_array())) {
        return false;
    }
    // cleanup if requested
    !empty($BBC_PURGE_SINGLE) ? bbc_purge_single() : "";
    !empty($access['time']) && is_array($access['time']) ? bbc_time_offset() : "";
    // Upgrade from older versions. We need to erase the "last" data.
    if (isset($access['last'])) {
        unset($access['last']);
    }
    //check for broken 0.4.2 referrer counting and apply fix if necessary
    if (isset($access) && !isset($access['bugs']['ref_fix']) && isset($access['referer']['not_specified'])) {
        bbc_fix_refer_stat(array_sum($access['referer']));
    }
    // fix wrong browser assignments
    foreach (array("java", "wwwc", "libwww") as $what) {
        if (isset($access) && isset($access['stat']['browser'][$what])) {
            $access['stat']['robot'][$what] = $access['stat']['browser'][$what];
            $access['stat']['os']['other'] -= $access['stat']['robot'][$what];
            unset($access['stat']['browser'][$what]);
        }
    }
    $nb_new_access = !empty($new_access) && is_array($new_access) ? count($new_access) : 0;
    $nb_last_access = !empty($last['traffic']) && is_array($last['traffic']) ? count($last['traffic']) : 0;
    foreach ($new_access as $connect) {
        $connect = bbc_update_connect($connect);
        // the "last reset on" flag initialisation
        if (!isset($access['time']) && !isset($access['time']['reset'])) {
            $access['time']['reset'] = $connect['time'];
        }
        // Stop processing if bots are completely ignored
        if (!empty($BBC_IGNORE_BOTS) && $BBC_IGNORE_BOTS == 2) {
            if (!empty($connect['robot'])) {
                --$nb_new_access;
                continue;
            }
        }
        // Omit referrers coming from robots
        $connect['referer'] = !empty($connect['robot']) ? "unknown" : $connect['referer'];
        $this_connect = $connect['time'];
        $last_connect = !empty($access['time']['last']) ? $access['time']['last'] : 0;
        // Hits as base for time stats if desired
        if (empty($BBC_NO_HITS)) {
            bbc_update_time_stat($this_connect, $last_connect);
        }
        // The script viewed
        $connect = isset($connect['page']) ? bbc_update_page_stats($connect) : $connect;
        $prev_recorded = 0;
        // Check if a similar connection has been recorded yet
        for ($l = $nb_last_access - 1; $l >= 0 && $connect['time'] - $last['traffic'][$l]['time'] < $BBC_MAXTIME; $l--) {
            if (!empty($BBC_IGNORE_AGENT) ? $connect['ip'] == $last['traffic'][$l]['ip'] : $connect['ip'] == $last['traffic'][$l]['ip'] && $connect['agent'] == $last['traffic'][$l]['agent']) {
                $last['traffic'][$l]['page'] = $connect['page'];
                $last['traffic'][$l]['time'] = $this_connect;
                $last['traffic'][$l]['visits']++;
                $access['stat']['totalvisits']++;
                $BBC_MAXVISIBLE > 0 ? bbc_update_visits($connect['time'], $connect['page'], $l) : "";
                $prev_recorded = 1;
                break;
            }
        }
        // Add new connection if it hasn't been recorded yet
        if (!$prev_recorded) {
            if (empty($access['stat']['totalvisits'])) {
                $access['stat']['totalvisits'] = 0;
            }
            if (empty($access['stat']['totalcount'])) {
                $access['stat']['totalcount'] = 0;
            }
            $connect['dns'] = !empty($BBC_NO_DNS) ? $connect['ip'] : bbc_clean(gethostbyaddr($connect['ip']));
            $connect['ext'] = bbc_get_extension($connect['dns'], $connect['ip']);
            $last['traffic'][$nb_last_access] = bbc_update_access($connect);
            // Visit stats
            $last['traffic'][$nb_last_access]['views'][] = $last['traffic'][$nb_last_access]['time'] . "|" . $last['traffic'][$nb_last_access]['page'] . "|1";
            // Unique visits as base for time stats if desired
            if (!empty($BBC_NO_HITS)) {
                bbc_update_time_stat($this_connect, $last_connect);
            }
            // Referrers collection will be updated all along with the keywords if available
            if (isset($connect['referer'])) {
                bbc_update_referer_stat($connect['referer']);
                $flt_search = bbc_get_keywords($connect['referer']);
            }
            // The search as a whole in $last
            $last['traffic'][$nb_last_access]['search'] = $flt_search !== false ? implode(" ", $flt_search) : "-";
            // The host listing
            if (isset($connect['dns']) && isset($connect['ip'])) {
                bbc_update_host_stat($last['traffic'][$nb_last_access]);
            }
            $access['stat']['totalvisits']++;
            $access['stat']['totalcount']++;
            $nb_last_access++;
        }
    }
    return $nb_new_access;
}