[PHP] Win32 apache2 logs >> MySQL

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
*EDIT* IEK!! Kan iemand me vertellen hoe ik die code minder layout verneukend kan neerzetten? dit was niet mijn bedoeling!

Hey allemaal.

Ik ben vandaag eigenlijk uit ergernis een beetje gaan rommellen aan een export-scriptje dat de access.log van apache2 overzet in een table "access" in MySQL

ik ben nog niet zo erg lang bezig met php (lees: Ik rommel wat aan) en dus vroeg ik me af of jullie nog tips / hint hebben of een grote gevaarlijke leak in de code vinden.

En wieweet maak ik zelfs nog iemand blij die hier al een tijdje naar zoekt

mjah genoeg gelul.. de code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<? 
// gebruik dit om de table aan te maken (in de database apache) 
?>
<!--
  CREATE TABLE `access` (
  `ID` int(11) NOT NULL default '0',
  `USER` varchar(32) NOT NULL default '',
  `IP` varchar(32) NOT NULL default '',
  `DATE` varchar(32) NOT NULL default '',
  `ACTION` varchar(32) NOT NULL default '',
  `URL` varchar(255) NOT NULL default '',
  `REFERER` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`ID`)
) TYPE=MyISAM COMMENT='apache access_log export';
-->
<?

mysql_connect('localhost','root','') or die('could not connect');    //verbinding maken met sql
mysql_select_db('apache') or die('db bestaat niet?');            //selecteer dbase apache
mysql_query("TRUNCTATE TABLE 'access'");            // Maak de table leeg om dubbelle entry's te voorkomen
$logfile = file("c:\apache2\logs\access.log");        // open de logfile (pad dus aanpassen!)

foreach ($logfile as $key => $value) {    
    $thisrow = explode(" ", $value); 
    $id = $key + 1; 
    $ip = $thisrow[0];
    $user = $thisrow[2];
    $date = $thisrow[3];
    $date = str_replace("[",'',$date); // haalt een loze [ uit de regel
    $action = $thisrow[5];
    $action = str_replace('"','',$action); // haalt een loze " uit de regel
    $url = $thisrow[6];
    $referer = $thisrow[10];
    $referer = str_replace('"','',$referer); // verwijderd de " voor en na de regel
    $sql = "INSERT INTO access (ID, USER, IP, DATE, ACTION, URL, REFERER) VALUES('$id','$user','$ip','$date','$action','$url','$referer')"; 
    mysql_query($sql); 
    } 
echo ("<H1>Logfile succesfully exported to MySQL!</H1><BR><B>WARNING!</B> This script empty's the table before it adds the logs!");
mysql_close (); 
?>


Ik heb het getest op een win2003 server machine met daarop Apache 2.0.46 / PHP 4.3.2

Ik denk dat dit scriptje ook prima zal werken voor *nix servertjes met apache2 (kwestie van het pad naar de logfile veranderen in /var/blablabla-enzo)

Ik ben benieuwd maar jullie input..

ik ben btw geen coder/webdesigner ik doe dit gewoon puur als tijdsverdrijf in de laatste dagen van dit jaar :+

[ Voor 13% gewijzigd door Verwijderd op 29-12-2003 18:02 ]


Acties:
  • 0 Henk 'm!

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Als ik op een of andere manier (door bijvoorbeeld een foutieve HTTP_REFERER mee te sturen) dingen met quotes (' of " oid) in jouw apache logfile kan krijgen, worden die rechtstreeks opgenomen in de SQL query. Dit is een onwaarschijnlijke maar mogelijk exploiteerbare fout.

Gebruik altijd addslashes() wanneer de input van je query niet te vertrouwen is.

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Erik Jan schreef op 29 december 2003 @ 19:17:
Als ik op een of andere manier (door bijvoorbeeld een foutieve HTTP_REFERER mee te sturen) dingen met quotes (' of " oid) in jouw apache logfile kan krijgen, worden die rechtstreeks opgenomen in de SQL query. Dit is een onwaarschijnlijke maar mogelijk exploiteerbare fout.

Gebruik altijd addslashes() wanneer de input van je query niet te vertrouwen is.
hij filtert ze uit op spaties ik heb al getest met referers met ' en " erin en daar ging ie niet door over de zeik? :S

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
als kleine toevoeging hieraan heb ik net even een last-99-hits stats paginatje gemaakt :)

deze laat de 99 laatste hits zien met klikbare linkjes enzo :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<TABLE name="statst" width="600">
<TR>
<TH colspan="4">De laatste 99 hits incl referrer en IP</TH>
</TR>
<TR>
<TH name="urlb">URL:</TD>
<TH name="dateb">DATE:</TD>
<TH name="refb">REFERRER:</TD>
<TH name="ipb">IP:</TD>
</TR>
<?
mysql_connect('localhost','root','') or die('could not connect');           //verbinding maken met sql
mysql_select_db('apache') or die('db bestaat niet?');                       //selecteer dbase apache

$sql = "SELECT * FROM `access` WHERE referer NOT LIKE '%fluitje.xs4all.nl%' AND referer NOT LIKE '-%' AND ip NOT LIKE '10.0.0.%' ORDER BY id DESC LIMIT 0,99"; 
$resultaat = mysql_query($sql);                                             //Run qry

while ($record = mysql_fetch_object($resultaat))                            //print resultaat
        {
            echo "<TR>";
            echo "<TD name=\"url\"><a href=\"http://fluitje.xs4all.nl$record->URL\" target=\"_new\">$record->URL</a></TD>";
            echo "<TD name=\"date\">$record->DATE</TD>";
            echo "<TD name=\"ref\"><a href=\"$record->REFERER\" target=\"_new\">$record->REFERER</a></TD>";
            echo "<TD name=\"ip\">$record->IP</TD>";
            echo "</TR>";
        }
?>
</TABLE>


overal waar je fluitje.xs4all.nl ziet staan moet je uiteraard nog even je eigen ip / hostname neerzetten :)

het resultaat in beeld is dan bij mij bijv:
Afbeeldingslocatie: http://www.xs4all.nl/~schaap2k/GPN/referrers.jpg