/**
 * Track the referer to a specific Entry ID
 *
 * @access public
 * @param   int     Entry ID
 * @return  null
 */
function serendipity_track_referrer($entry = 0)
{
    global $serendipity;
    // Tracking disabled.
    if ($serendipity['trackReferrer'] === false) {
        return;
    }
    if (isset($_SERVER['HTTP_REFERER'])) {
        if (stristr($_SERVER['HTTP_REFERER'], $serendipity['baseURL']) !== false) {
            return;
        }
        if (!isset($serendipity['_blockReferer']) || !is_array($serendipity['_blockReferer'])) {
            // Only generate an array once per call
            $serendipity['_blockReferer'] = array();
            $serendipity['_blockReferer'] = @explode(';', $serendipity['blockReferer']);
        }
        $url_parts = parse_url($_SERVER['HTTP_REFERER']);
        $host_parts = explode('.', $url_parts['host']);
        if (!$url_parts['host'] || strstr($url_parts['host'], $_SERVER['SERVER_NAME'])) {
            return;
        }
        foreach ($serendipity['_blockReferer'] as $idx => $hostname) {
            if (@strstr($url_parts['host'], $hostname)) {
                return;
            }
        }
        if (rand(0, 100) < 1) {
            serendipity_track_referrer_gc();
        }
        $ts = serendipity_db_get_interval('ts');
        $interval = serendipity_db_get_interval('interval', 900);
        $suppressq = "SELECT count(1)\n                      FROM {$serendipity['dbPrefix']}suppress\n                      WHERE ip = '" . serendipity_db_escape_string($_SERVER['REMOTE_ADDR']) . "'\n                      AND scheme = '" . serendipity_db_escape_string($url_parts['scheme']) . "'\n                      AND port = '" . serendipity_db_escape_string($url_parts['port']) . "'\n                      AND host = '" . serendipity_db_escape_string($url_parts['host']) . "'\n                      AND path = '" . serendipity_db_escape_string($url_parts['path']) . "'\n                      AND query = '" . serendipity_db_escape_string($url_parts['query']) . "'\n                      AND last > {$ts} - {$interval}";
        $suppressp = "DELETE FROM {$serendipity['dbPrefix']}suppress\n                      WHERE ip = '" . serendipity_db_escape_string($_SERVER['REMOTE_ADDR']) . "'\n                      AND scheme = '" . serendipity_db_escape_string($url_parts['scheme']) . "'\n                      AND host = '" . serendipity_db_escape_string($url_parts['host']) . "'\n                      AND port = '" . serendipity_db_escape_string($url_parts['port']) . "'\n                      AND query = '" . serendipity_db_escape_string($url_parts['query']) . "'\n                      AND path = '" . serendipity_db_escape_string($url_parts['path']) . "'";
        $suppressu = "INSERT INTO {$serendipity['dbPrefix']}suppress\n                      (ip, last, scheme, host, port, path, query)\n                      VALUES (\n                      '" . serendipity_db_escape_string($_SERVER['REMOTE_ADDR']) . "',\n                      {$ts},\n                      '" . serendipity_db_escape_string($url_parts['scheme']) . "',\n                      '" . serendipity_db_escape_string($url_parts['host']) . "',\n                      '" . serendipity_db_escape_string($url_parts['port']) . "',\n                      '" . serendipity_db_escape_string($url_parts['path']) . "',\n                      '" . serendipity_db_escape_string($url_parts['query']) . "'\n                      )";
        $count = serendipity_db_query($suppressq, true);
        if ($count[0] == 0) {
            serendipity_db_query($suppressu);
            return;
        }
        serendipity_db_query($suppressp);
        serendipity_db_query($suppressu);
        serendipity_track_url('referrers', $_SERVER['HTTP_REFERER'], $entry);
    }
}
Exemple #2
0
<?php

# $Id: exit.php 2316 2008-08-22 09:20:13Z garvinhicking $
# Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team)
# All rights reserved.  See LICENSE file for licensing details
include 'serendipity_config.inc.php';
$url = $serendipity['baseURL'];
if (isset($_GET['url_id']) && !empty($_GET['url_id']) && isset($_GET['entry_id']) && !empty($_GET['entry_id'])) {
    // See if the submitted link is in our database and should be tracked
    $links = serendipity_db_query("SELECT link FROM {$serendipity['dbPrefix']}references WHERE id = " . (int) $_GET['url_id'] . " AND entry_id = " . (int) $_GET['entry_id'], true);
    if (is_array($links) && isset($links['link'])) {
        // URL is valid. Track it.
        $url = str_replace('&amp;', '&', $links['link']);
        serendipity_track_url('exits', $url, $_GET['entry_id']);
    } elseif (isset($_GET['url']) && !empty($_GET['url'])) {
        // URL is invalid. But a URL-location was sent, so we want to redirect the user kindly.
        $url = str_replace('&amp;', '&', base64_decode($_GET['url']));
    }
} elseif (isset($_GET['url']) && !empty($_GET['url'])) {
    // No entry-link ID was submitted. Possibly a spammer tried to mis-use the script to get into the top-list.
    $url = strip_tags(str_replace('&amp;', '&', base64_decode($_GET['url'])));
}
if (serendipity_isResponseClean($url)) {
    header('HTTP/1.0 301 Moved Permanently');
    header('Status: 301 Moved Permanently');
    header('Location: ' . $url);
}
exit;
/* vim: set sts=4 ts=4 expandtab : */