access_log auslesen

Ricci2007

Mitglied
Erst mal ein Hallo aus Osnabrück,

ich möchte gerne nur die Webseiten - Referer welche in meiner access_log enthalten sind auslesen. Wäre nett wenn einer mir sagen könnt wie ich des anstelle, oder mir einen link zukommen lässt, wo ich sowas nachlesen kann.

Sollte mir einer sagen können, ob ich zum Beispiel einen ordner überwachen kann und die Zugriffe auf diesen - mit dessen Herkunft (z.B. verlinkung ) in einer datenbank speichern kann... würde ich mich auch sehr freuen!

Ich bin schon seit 2 Tagen am googlen und Kaffee trinken und find nichts.

Sag schon mal Danke an alle ....

Ricci
 
Zuletzt bearbeitet:
Ich bin schon seit 2 Tagen am googlen und Kaffee trinken und find nichts.
Dann solltest du erstmal schlafen gehen ;)

ich möchte gerne nur die Webseiten - Referer welche in meiner access_log enthalten sind auslesen. Wäre nett wenn einer mir sagen könnt wie ich des anstelle, oder mir einen link zukommen lässt, wo ich sowas nachlesen kann.
Das kommt a) auf das Operating System und b) auf die Serversoftware und c) auf die Konfiguration an. Ein paar mehr Informationen wären nicht schlecht.

ob ich zum Beispiel einen ordner überwachen kann und die Zugriffe auf diesen - mit dessen Herkunft (z.B. verlinkung ) in einer datenbank speichern kann...
So gesehen, bräuchte man dazu einen Daemon, der sich vor, zwischen oder nach dem Request einklinkt und die Daten loggt. Um einen solchen Hintergrunddienst nicht in Anspruch nehmen oder modifizieren zu müssen, kannst du natürlich auch den Zugriff auf Verzeichnisse und / oder Dateien über ein Script steuern lassen, welches die Zugriffe loggt.
Das erzeugt dann jedoch einen gewissen Overhead, den du in Kauf nehmen solltest. Für eine Lösung über das OS oder die Serversoftware solltest du gezielt in den entsprechenden Referenzen nachschlagen.

Eine PHP-Lösung könnte zB folgendermaßen aussehen:
PHP:
// request.php
$path = &$_GET['path'];
if (is_readable($path) AND is_dir($path)) {
    // Logging über das $_SERVER Array
    // Listing des Verzeichnisses
} else {
    // Logging gewünschter Daten, à la
    mysql_query("INSERT INTO `table` ( `message` ) VALUES ('Client (refer: abc, ip: 123.123.123.123) tried to access none existing \'{$path}\');");
    // obwohl `ip`, `action`, `message`, `referuri`, ... von besserer Architektur sein würden ;)
}

Vor Direktzugriffen schützt das aber nicht wirklich. Hier könnte ein bisschen Gespiele mit mod_rewrite oder ähnlichen Servermodulen nötig sein, um zB unerlaubte HTTP-Zugriffe umzulenken auf eben das gewünschte Script. Die Request-URI bleibt ja nichtsdestotrotz beim gegenwärtigen Request erhalten.
 
hi maeTimmae ,

erst mal danke für Deine Antwort.

Ich habe 2 Server gemietet und stelle immer wieder fest, das Bilder auf irgendwelche Seiten verlinkt werden. Ich möchte einfach nur herausfinden wo meine Bilder liegen.

Wird also ein Bild von meinem Server gezogen, möchte ich in einer log datei die internetadresse angezeigt bekommen.

Das sollte doch irgendwie machbar sein, oder nicht ?

Ricci
 
Habe mal schnell ein paar Zeilen geschrieben, die das ganz gut via PHP loggen können, ohne dass der Client groß was mitbekommt. Die Zeilen kannst du noch weiter anpassen, wie zB einen 403 oder 404 Header senden statt der exits, oder auch eine Alternativgrafikfür bestimmte Request URIs, etc.

Voraussetzung ist, dass dein Server mod_rewrite unterstützt oder du anderweitig den Zugriff auf ein bestimmtes Verzeichnis auf das Script umlenken kannst...

Erstmal die Codezeilen:

PHP:
<?php
/**
 * logimageaccess.php
 */

// Log schreiben
if ($fp = @fopen('/pfad/zur/log.txt', 'a')) {
    $log = "<< " . date('Y-m-d h:i:s') . " >>\t"
         . "'{$_SERVER['HTTP_USER_AGENT']}'\n\r"
         . "refer: '{$SERVER['HTTP_REFERER']}'\n\r"
         . "request-uri: '{$_SERVER['REQUEST_URI']}{$_SERVER['QUERY_STRING']}\n\r\n\r";
    @fwrite($fp, $log);
    fclose($fp);
}
// $fp to null
$fp = null;

// Verzeichnis, in dem die sichtbaren Dokumente lagern
$httpdocsdirectory = "/srv/www/mypage/httpdocs/";
// realer Pfad zum Requestfile
$realpath = realpath($httpdocsdirectory . $_SERVER['REQUEST_URI']);

// Sicherheitsüberprüfung um nicht auf Dokumente außerhalb des HTTPDocs Verzeichnis zuzugreifen
if (strpos($realpath, $httpdocsdirecotry) === false) {
    exit;
}

// Wenn Datei gelesen werden kann und ein Bild ist ...
if (is_readable($realpath) AND is_file($realpath) AND $finfo = getimagesize($realpath)) {
    if (empty($finfo)) {
        exit;
    }

    switch ($finfo[2]) {
        case 1:
            header('Content-Type: image/gif');
            break;
        case 2:
        default:
            header('Content-Type: image/jpeg');
            break;
        case 3:
            header('Content-Type: image/jpeg');
            break;
    }

    // Daten ausgeben
    if ($fp = @fopen($realpath, 'r')) {
        @fpassthru($fp);
        exit;
    }
}

Und nun zur .htaccess: Lege diese, falls noch nicht vorhanden, im HTTP-Docs Directory an und füge folgende Zeilen (falls noch nicht vorhanden) hinzu:
Code:
RewriteEngine On
RewriteRule ^pfad/zum/bilderverzeichnis/(.*)$    pfad/zur/logimageaccess.php

Ich habe es jetzt nicht probiert, aber sollte doch einigermaßen funktionieren ^^
 
hey,

des find ich ja klasse, wollt gerade meine augen pflegen gehen... schreib mich doch über pn an , dann können übers tel. drüber quatschen.. werd es morgen früh gleich mal testen.

erst mal danke und gute nacht!

ricci
 
Guten Morgen,

sobald ich die .htaccess in /html draufspiele zeigt er mir die Bilder im Ordner ned mehr an.

PHP:
// Log schreiben -- ordner und datei auf 777 gesetzt //
if ($fp = @fopen('/secret/logimagessecret.txt', 'a')) {

// Verzeichnis, in dem die sichtbaren Dokumente lagern //
$httpdocsdirectory = "/var/www/web10/html/";

hab ich was übersehen ?
 
Dann ist ein wenig Pseudodebugging notwendig. Setze am Anfang des Scripts einfach mal
PHP:
<?php
header('Content-Type: text/plain');
print_r($_SERVER);
ein und schau nach, dass sämtliche Werte korrekt sind und auch korrekt übergeben werden. Wenn zB die Request-URI nicht korrekt übergeben wird, wäre es sinnvoll, diesen Wert in der htaccess über einen GET-Index an das PHP-Script zu übergeben, ähnlich verhält es sich mit anderen Werten.

Des Weiteren solltest du schauen, dass die Pfade korrekt sind (über var_dump oder so ausgeben und überprüfen) und ansonsten auch alles passt. Bisher habe ich eher selten mit fpassthru gearbeitet, und ich weiß auch nicht, ob es es sinnvoll ist, damit Bilddaten auszugeben, aber eigentlich sollte es daran nicht liegen.

PHP:
<?php
/**
 * logimageaccess.php
 */

header('Content-Type: text/plain');
print_r($_SERVER);

// Log schreiben
if ($fp = @fopen('/pfad/zur/log.txt', 'a')) {
    print("Logfile geöffnet\n");
    $log = "<< " . date('Y-m-d h:i:s') . " >>\t"
         . "'{$_SERVER['HTTP_USER_AGENT']}'\n\r"
         . "refer: '{$SERVER['HTTP_REFERER']}'\n\r"
         . "request-uri: '{$_SERVER['REQUEST_URI']}{$_SERVER['QUERY_STRING']}\n\r\n\r";
    @fwrite($fp, $log);
    print("Logbit geschrieben\n");
    fclose($fp);
    print("Logfile geschlossen\n");
}
// $fp to null
$fp = null;

// Verzeichnis, in dem die sichtbaren Dokumente lagern
$httpdocsdirectory = "/srv/www/mypage/httpdocs/";
print("HTTP Docs in '{$httpdocsdirectory}' - Verzeichnis vorhanden: ");
var_dump(is_dir($httpdocsdirecotry));

// realer Pfad zum Requestfile
$realpath = realpath($httpdocsdirectory . $_SERVER['REQUEST_URI']);
print("Zugriff auf '{$realpath}' - Datei vorhanden: ");
var_dump(is_dir($realpath));

// Sicherheitsüberprüfung um nicht auf Dokumente außerhalb des HTTPDocs Verzeichnis zuzugreifen
if (strpos($realpath, $httpdocsdirecotry) === false) {
    print("Datei nicht gefunden...\n");
    exit;
}

// Wenn Datei gelesen werden kann und ein Bild ist ...
if (is_readable($realpath) AND is_file($realpath) AND $finfo = getimagesize($realpath)) {
    print("Datei lesbar und Bildinformationen gespeichert\n");
    if (empty($finfo)) {
        print("Keine Bildinformationen vorhanden\n");
        exit;
    }

    print("Sende CT Header");
    switch ($finfo[2]) {
        case 1:
            header('Content-Type: image/gif');
            break;
        case 2:
        default:
            header('Content-Type: image/jpeg');
            break;
        case 3:
            header('Content-Type: image/jpeg');
            break;
    }

    // Daten ausgeben
    if ($fp = @fopen($realpath, 'r')) {
        print("Daten ausgeben ...\n");
        @fpassthru($fp);
        exit;
    }
}

Bis wohin gibt das Script denn was aus? Und was gibt es aus? (Sensible Daten bitte, sofern vorhanden, rausstreichen)
 
hu hu und hallo,

ok also ich hab die .htaccess in meinen html - hauptordner geschmissen.

text im .htaccess :

PHP:
RewriteEngine On
RewriteRule ^bilder/(.*)$    bilder/logimageaccess.php

danach kann ich keine bilder vom ordner bilder mer sehen ((( heul )))

die logimagessecret.txt hab ich in einen odner namens secret gelegt.

Die logimageaccess.php liegt ebenso im ordner bilder drin.

hier die ausgabe der logimageaccess.php


Array
(
[DOCUMENT_ROOT] => /var/www/web10/html
[GATEWAY_INTERFACE] => CGI/1.1
[HTTP_ACCEPT] => image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_ACCEPT_LANGUAGE] => de
[HTTP_CONNECTION] => Keep-Alive
[HTTP_HOST] => http://www.xxxxxx.de
[HTTP_UA_CPU] => x86
[HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
[PATH] => /bin:/usr/bin
[QUERY_STRING] =>
[REDIRECT_STATUS] => 200
[REMOTE_ADDR] => xx.xxx.xxx.xx
[REMOTE_PORT] => xxxxxx
[REQUEST_METHOD] => GET
[REQUEST_URI] => /bilder/logimageaccess.php
[SCRIPT_FILENAME] => /var/www/web10/html/bilder/logimageaccess.php
[SCRIPT_NAME] => /bilder/logimageaccess.php
[SERVER_ADDR] => xxx.xxx.xxx.xx
[SERVER_ADMIN] => [no address given]
[SERVER_NAME] => http://www.xxxxxx.de
[SERVER_PORT] => xxxx
[SERVER_PROTOCOL] => HTTP/1.1
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache/2.0.55 (Debian)
[downgrade_1_0] => 1
[force_response_1_0] => 1
[nokeepalive] => 1
[ssl_unclean_shutdown] => 1
[PHP_SELF] => /bilder/logimageaccess.php
[argv] => Array
(
)

[argc] => 0
)
Logfile geöffnet
Logbit geschrieben
Logfile geschlossen
HTTP Docs in '/var/www/web10/html/bilder' - Verzeichnis vorhanden: bool(false)
Zugriff auf '/var/www/web10/html/bilder/bilder/logimageaccess.php' - Datei vorhanden: bool(false)
Datei nicht gefunden...

warum hat er denn auf einmal den ordner bilder doppelt

meine logimageaccess.php sieht wie folgt aus:

PHP:
<?php
/**
 * logimageaccess.php
 */

header('Content-Type: text/plain');
print_r($_SERVER);

// Log schreiben liegt im ordner bilder
if ($fp = @fopen('../secret/logimagessecret.txt', 'a')) {
    print("Logfile geöffnet\n");
    $log = "<< " . date('Y-m-d h:i:s') . " >>\t"
         . "'{$_SERVER['HTTP_USER_AGENT']}'\n\r"
         . "refer: '{$SERVER['HTTP_REFERER']}'\n\r"
         . "request-uri: '{$_SERVER['REQUEST_URI']}{$_SERVER['QUERY_STRING']}\n\r\n\r";
    @fwrite($fp, $log);
    print("Logbit geschrieben\n");
    fclose($fp);
    print("Logfile geschlossen\n");
}
// $fp to null
$fp = null;

// Verzeichnis, in dem die sichtbaren Dokumente lagern
$httpdocsdirectory = "/var/www/web10/html/bilder";
print("HTTP Docs in '{$httpdocsdirectory}' - Verzeichnis vorhanden: ");
var_dump(is_dir($httpdocsdirecotry));

// realer Pfad zum Requestfile
$realpath = realpath($httpdocsdirectory . $_SERVER['REQUEST_URI']);
print("Zugriff auf '{$realpath}' - Datei vorhanden: ");
var_dump(is_dir($realpath));

// Sicherheitsüberprüfung um nicht auf Dokumente außerhalb des HTTPDocs Verzeichnis zuzugreifen
if (strpos($realpath, $httpdocsdirecotry) === false) {
    print("Datei nicht gefunden...\n");
    exit;
}

// Wenn Datei gelesen werden kann und ein Bild ist ...
if (is_readable($realpath) AND is_file($realpath) AND $finfo = getimagesize($realpath)) {
    print("Datei lesbar und Bildinformationen gespeichert\n");
    if (empty($finfo)) {
        print("Keine Bildinformationen vorhanden\n");
        exit;
    }

    print("Sende CT Header");
    switch ($finfo[2]) {
        case 1:
            header('Content-Type: image/gif');
            break;
        case 2:
        default:
            header('Content-Type: image/jpeg');
            break;
        case 3:
            header('Content-Type: image/jpeg');
            break;
    }

    // Daten ausgeben
    if ($fp = @fopen($realpath, 'r')) {
        print("Daten ausgeben ...\n");
        @fpassthru($fp);
        exit;
    }
}



und das steht in der log drin -- hab ich vergessen:

<< 2007-08-15 04:53:45 >> 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)'

refer: ''

request-uri: '/bilder/spacer.gif



<< 2007-08-15 05:14:42 >> 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'

refer: ''

request-uri: '/bilder/logimageaccess.php




was mache ich denn noch falsch


Gruß Ricci
 
Zuletzt bearbeitet:
Erstmal ein paar Änderungen an der .htaccess
Code:
RewriteEngine On
# Bei Direktzugriff auf Datei nach index.php umleiten
RewriteRule ^bilder/logimageaccess.php$    index.php [L]
# umleiten & Last Regel anwenden (zur Sicherheit, falls weitere Regeln folgen)
RewriteRule ^bilder/(.*)$    bilder/logimageaccess.php?useragent=%{HTTP_USER_AGENT}&referer=%{HTTP_REFERER}&requesturi=%{REQUEST_URI} [L]
Denn anscheinend wird die Request-URI überschrieben während des Rewrites...
Code:
[REQUEST_URI] => /bilder/logimageaccess.php

Aber du siehst schon an der RewriteRule, dass wir das über ein paar GET-Variablen umgehen können.

Folgendes solltest du beachten: Mit HTTP-Documents Verzeichnis meinte ich nicht das Bildverzeichnis direkt sondern die höchste Ebene für HTTP-Requests (sprich das Verzeichnis, welches genutzt wird, wenn man nur die Domain aufruft). Des Weiteren fällt dies hier auf:
Code:
HTTP Docs in '/var/www/web10/html/bilder' - Verzeichnis vorhanden: bool(false)
Stimmt hier eventuell was nicht mit dem Pfad? Das "bilder" sollte sowieso erstmal weg, aber selbst wenn es da steht, müsste es doch existieren?

Sobald das behoben ist, können wir den PHP-Code korrigieren über nen paar dreckige Workarounds
PHP:
<?php
/**
 * logimageaccess.php
 */
header('Content-Type: text/plain');

if (!isset($_GET['useragent'], $_GET['referer']) OR empty($_GET['request_uri'])) {
    print("Nicht alle Parameter gesetzt!";
    exit;
}

$_SERVER['REQUEST_URI'] = &$_GET['requesturi'];
$_SERVER['HTTP_REFERER'] = &$_GET['referer'];
$_SERVER['HTTP_USER_AGENT'] = &$_GET['useragent'];

print_r($_SERVER);

// Log schreiben liegt im ordner bilder
if ($fp = @fopen('../secret/logimagessecret.txt', 'a')) {
    print("Logfile geöffnet\n");
    $log = "<< " . date('Y-m-d h:i:s') . " >>\t"
         . "'{$_SERVER['HTTP_USER_AGENT']}'\n\r"
         . "refer: '{$SERVER['HTTP_REFERER']}'\n\r"
         . "request-uri: '{$_SERVER['REQUEST_URI']}\n\r\n\r";
    @fwrite($fp, $log);
    print("Logbit geschrieben\n");
    fclose($fp);
    print("Logfile geschlossen\n");
}
// $fp to null
$fp = null;

// Verzeichnis, in dem die sichtbaren Dokumente lagern
$httpdocsdirectory = "/var/www/web10/html/bilder";
print("HTTP Docs in '{$httpdocsdirectory}' - Verzeichnis vorhanden: ");
var_dump(is_dir($httpdocsdirecotry));

// realer Pfad zum Requestfile
$realpath = realpath($httpdocsdirectory . $_SERVER['REQUEST_URI']);
print("Zugriff auf '{$realpath}' - Datei vorhanden: ");
var_dump(is_dir($realpath));

// Sicherheitsüberprüfung um nicht auf Dokumente außerhalb des HTTPDocs Verzeichnis zuzugreifen
if (strpos($realpath, $httpdocsdirecotry) === false) {
    print("Datei nicht gefunden...\n");
    exit;
}

// Wenn Datei gelesen werden kann und ein Bild ist ...
if (is_readable($realpath) AND is_file($realpath) AND $finfo = getimagesize($realpath)) {
    print("Datei lesbar und Bildinformationen gespeichert\n");
    if (empty($finfo)) {
        print("Keine Bildinformationen vorhanden\n");
        exit;
    }

    print("Sende CT Header");
    switch ($finfo[2]) {
        case 1:
            header('Content-Type: image/gif');
            break;
        case 2:
        default:
            header('Content-Type: image/jpeg');
            break;
        case 3:
            header('Content-Type: image/jpeg');
            break;
    }

    // Daten ausgeben
    if ($fp = @fopen($realpath, 'r')) {
        print("Daten ausgeben ...\n");
        @fpassthru($fp);
        exit;
    }
}
 
Zurück