Mindestenssechszeichen...keine Panik!

Adnxs-Skript

25. Mai 2016 von Yhoko
Es ist immer wieder spannend, wenn man eine Webseite besucht und statt des Inhalts ein Quelltext erscheinen. Dieser hier tauchte neulich auf heise.de auf und scheint von Adnxs zu stammen (hier unter Einbindung von Google Doubleclick). Es setzt Cookies und erzeugt ggf. die berüchtigten "Tracking-Pixel".
<?php
/**
 * Redirect-Script
 *
 * Aufgabe:
 * - Umgebungsdaten ermitteln
 * -- Cookie gesetzt?
 * -- Cookie übergeben?
 */
// definierte Werte die per se für mich gelten und von der Generator-Routine gesetzt werden
define('CustomerID', '494');
define('TagID', '1428');

define('COOKIE_NAME', 'axd');

if (!defined('COOKIE_DOMAIN')) {
    define('COOKIE_DOMAIN', '.theadex.com');
}
define('TS_DMPSTART', 1378591200);

function _schemaExplode($a) {
    $ud = array();
    while (list($k,$v) = each($a)) {
        if (strpos($v, ':') > 0) {
            list($Sub, $Time) = explode(":", $v);
            $ud[$Sub] = $Time;
        }
    }
    return $ud;
}

function _schemaImplode($a) {
    $ud = array();
    while (list($k, $time) = each($a)) {
        $ud[] = $k.':'.$time;
    }
    return $ud;
}

/**
 * Converts a timestamp to adex-days
 * 
 * @param integer $timestamp
 * 
 * @return integer
 */
function toAdexDays($timestamp) {
    return floor(($timestamp - TS_DMPSTART) / (60*60*24));
}

/**
 * Converts from adex days to a unix timestamp
 * 
 * @param integer $AdexDays
 * 
 * @return integer
 */
function fromAdexDays($AdexDays) {
    return floor(TS_DMPSTART + ($AdexDays * 60*60*24));
}

/**
 * Speichert zeitbezogene Zustandsdaten in einem Cookie - getrennt nach $key; separiert per | und :
 * @param string  $key  SubIdentifier
 * @param integer $days Gültigkeitsdauer
 * 
 * @return boolean
 */
function stateInformationOlderThan($key, $days, $setState = false) {
    $now = toAdexDays(time());
    $expected = $now  + $days;
    $Cookie = 'tis';
    $SubParts = array();
    if (isset($_COOKIE[$Cookie])) {
        // nach schema zerhacken
        $parts = explode("|", $_COOKIE[$Cookie]);
        $SubParts = _schemaExplode($parts);

        if (isset($SubParts[$key]) && $SubParts[$key] * 1 > $now) {
            return false;
        }
    }

    if ($setState) {
        $SubParts[$key] = $expected;

        $implode = array();
        $implode = _schemaImplode($SubParts);
        setcookie($Cookie, join("|", $implode), fromAdexDays($now + 3000), '/', COOKIE_DOMAIN, false, false);
        $_COOKIE[$Cookie] = join("|", $implode);
    }

    return true;
}

if (isset($_SERVER['QUERY_STRING'])) {
    define("QS", substr($_SERVER['QUERY_STRING'], 0, 1) == '?' ? substr($_SERVER['QUERY_STRING'], 1) : $_SERVER['QUERY_STRING']);
} else {
    define("QS", "");
}

if (isset($_GET['c']) && trim($_GET['c']) !== '') {
    define('COOKIE', $_GET['c']);
} elseif (!empty($_COOKIE[COOKIE_NAME])) {
    define('COOKIE', $_COOKIE[COOKIE_NAME]);
} else {
    // kein Cookie, kein redirect
    ?>
    <html><head></head><body></body></html>
    <?php
    exit;
}

$SSLon = false;
if (!empty($_SERVER['HTTPS'])) {
    $SSLon = true;
}

if(isset($_SERVER['HTTP_X_PROTO']) && $_SERVER['HTTP_X_PROTO'] == 'SSL') {
    $SSLon = true;
}

header('P3P:CP="CAO PSA OUR"');
ob_start();
if (!$SSLon) {
    # no SSL
    ?>
    <html>
        <body>
            <?php if (stateInformationOlderThan("EP1",7)) { ?>
<img width='1' height='1' src='http://ib.adnxs.com/getuid?http%3A%2F%2Fdmp.theadex.com%2Fd%2F494%2Fi%2F2.gif%3Fc%3D<?= COOKIE ?>%26axd_pid%3D1%26axd_fuid%3D%24UID' />
<?php } ?>
<?php if (stateInformationOlderThan("EP8",7)) { ?>
<img width='1' height='1' src='http://cm.g.doubleclick.net/pixel?google_nid=theadex_dmp&google_cm&axd_cuid=494&c=<?= COOKIE ?>' />
<?php } ?>
        </body>
    </html>
    <?php
} else {
    # SSL
    ?>
    <html>
        <body>
            <?php if (stateInformationOlderThan("EP1",7)) { ?>
<img width='1' height='1' src='https://secure.adnxs.com/getuid?https%3A%2F%2Fdmp.theadex.com%2Fd%2F494%2Fi%2F2.gif%3Fc%3D<?= COOKIE ?>%26axd_pid%3D1%26axd_fuid%3D%24UID' />
<?php } ?>
<?php if (stateInformationOlderThan("EP8",7)) { ?>
<img width='1' height='1' src='https://cm.g.doubleclick.net/pixel?google_nid=theadex_dmp&google_cm&axd_cuid=494&c=<?= COOKIE ?>' />
<?php } ?>
        </body>
    </html>
    <?php
}
ob_end_flush();
Warum das angezeigt wurde? Vielleicht ein Fehler in der Serverkonfiguration. Interessant sind jedenfalls die Definitionen von CustomerID und TagID zu Beginn, die aber im Skript nicht genutzt werden (stattdessen findet man die Zahlen selbst), und natürlich die deutschen Kommentar (Zitat: "nach schema zerhacken").

Viel Spass damit und vergesst nicht, gewisse Hosts im DNS-Filter einzutragen.

2 Kommentare

ToSensei / 26.05.2016
Der abschließende ?> "fehlt" nicht. Es ist schon viele Jahre best practice, ihn wegzulassen. herrührend aus der Unix-Philosophie, dass eine Textdatei immer mit einem \n endet. Und mit einem ?>\n würde dieses an den Browser ausgegeben werden - was schon eine Vielzahl von Programmierern bei der Fehlersuche zur Weißglut getrieben hat.
Yhoko / 27.05.2016
Interessant, aber irgendwie unsauber. Tatsächlich definiert der POSIX-Standard eine Textzeile mit abschliessendem \n, ich könnte jedoch keine PHP-Skripte akzeptieren, die "einfach so" ohne Abschluss aufhören. Allerdings speichere und bearbeite ich meine Skripte auch direkt in einer Datenbank, somit sind es keine Textdateien und müssen nicht mit \n enden. Jedenfalls danke für den Einwand!

Kommentar schreiben

Name:
E-Mail:
Beitragstext: