traceroute in PHP machen und auswerten

_root

Erfahrenes Mitglied
Hi. Ich habe schon bei suchen geschaut. Leider mit mässigem erfolg.

Ich soll für mein Chef und seine Internetseite ne Besucherauswertung machen. Da soll jetzt (auch wenn ich darin keinen Sinn sehe) auf klick nen traceroute ausgeführt werden und auf der Seite (in nem internen Bereich) dargestellt werden. Ich zeig eich mal was ich bis jetzt habe.

PHP:
<? 
//Verbindung herstellen
$db = mysql_connect("localhost","[user]", "[pw]");
mysql_select_db("[DB]",$db);
$result = mysql_query("SELECT * FROM dl_counterhits",$db);
?>
	<h1>Browserstatistik</h1>
	<p>
	<table width="400" border="0">
      <tr>
        <td width="200px"><div align="left">Internet Explorer </div></td>
        <td width="100px"><div align="center"><img src="ie.gif" width="20" height="20"></div></td>
        <td width="100px"><div align="right"><? $query = mysql_query('SELECT COUNT(*) FROM dl_counterhits WHERE  client LIKE "%MSIE%"');
	$array = mysql_fetch_array($query);
	echo $array[0]; ?></div>
        </td>
      </tr>
      <tr>
        <td><div align="left">Mozilla Firefox </div></td>
        <td><div align="center"><img src="ff.gif" width="20" height="20"></div></td>
        <td><div align="right"><? $query = mysql_query('SELECT COUNT(*) FROM dl_counterhits WHERE  client LIKE "%Firefox%"');
	$array = mysql_fetch_array($query);
	echo $array[0]; ?></div>
        </td>
      </tr>
      <tr>
        <td>Opera</td>
        <td><div align="center"><img src="ico_opera.jpg" width="20" height="20"></div></td>
        <td><div align="right"><? $query = mysql_query('SELECT COUNT(*) FROM dl_counterhits WHERE  client LIKE "%Opera%"');
	$array = mysql_fetch_array($query);
	echo $array[0]; ?></div></td>
      </tr>
      <tr>
        <td><div align="left">Lynx</div></td>
        <td><div align="center"><img src="ico_lynx2.png" width="20" height="20"></div></td>
        <td><div align="right"><? $query = mysql_query('SELECT COUNT(*) FROM dl_counterhits WHERE  client LIKE "%Lynx%"');
	$array = mysql_fetch_array($query);
	echo $array[0]; ?></div>
        </td>
      </tr>
      <tr bgcolor="#CCCCCC">
        <td><div align="left">Gesamt</div></td>
        <td><div align="center"></div></td>
        <td>
          <div align="right">
		    <? $query = mysql_query('SELECT COUNT(*) FROM dl_counterhits');
			$array = mysql_fetch_array($query);
			echo $array[0]; ?>
		  </div>
		</td>
      </tr>
    </table>
	</p>
    <h1>Zugriffe</h1>
    <p><? while ($daten = mysql_fetch_array($result)) { ?>
      <strong><? echo $daten['date']; ?> - <? echo (date("H:i",$daten['countflag'])); ?> Uhr</strong> - <? echo $daten['ipadr'] ?><br>
  <? } ?></p>

Aussehen tut das ganze dann bis jetzt so aus (Bild im Anhang)

Jetzt soll man mit dem Link hinter der IP nen "traceroute" auf die IP machen können und die Inhalte aus den traceroute in der Seite dargestellt werden.

Kann mir da wer bei helfen? Gut wär es denke ich auch wenn man vorher noch Prüfen würde ob die IP noch online ist, und nur wenn ja den Link zum tracerouten ausgeben würde.



MfG aCid
 

Anhänge

  • 1.png
    1.png
    5 KB · Aufrufe: 102
Hallo!

Schön dass Du Lynx berücksichtigst, aber was ist mit "sonstige"?
So habe ich hier unter anderm ein Browser der sich als "not4you" ausgibt. :p
Du solltest deine Datenbank bzw. Browserabfrage entsprechend erweitern. ;)

Warum willst Du prüfen ob eine IP noch online ist?
Meist werden die IP's ja dynamisch vergeben und sind i.d.R. sofort für den Nächsten freigegeben, wenn der Vorgänger offline gegangen ist.
Wenn Du vorhast an Hand der IP, des Browsers und eines Traceroute den User eindeutig zu identifizieren, sage ich dir lieber gleich dass Du das vergessen kannst. ;)

Und zu deiner Frage zum Traceroute, mit der Funktion system() kannst Du Programme ausführen und dir das Ergebis ausgeben lassen.
Hierzu brauchst Du natürlich entsprechende Zugriffsrechte auf das System.

Gruss Dr Dau
 
Das mit den sonstigen werde ich nochmal machen. Danke.

Das mit dem IP prüfen war auch nur ne Idee. Und das Traceroute is nen Wunsch von meinem Chef. Mit der Berechtigung gibt es keine Probs da wir nen Rootserver haben.

MfG aCid
 
Die traceroute wirst Du wohl ueber system() oder exec() machen muessen.
Mir ist bisher nicht bekannt, dass PHP sowas kann.
Allgemein scheint mir bisher, dass PHP nicht viel von ICMP weiss.

Ich hab vor einer Weile mal einen Ping in PHP implementiert, jedoch einen TCP-Ping, und dafuer muss man eben einen offenen Port kennen.

Ich werd mal was weiterlesen, vielleicht kann man mit den Sockets was machen.

Nachtrag: Es scheint als koennte man ueber die Sockets sogar ICMP implementieren.
Das ist natuerlich nicht uninteressant. Jetzt muesste man natuerlich noch die genaue Funktion von traceroute herausfinden. Aber ich denke das duerfte sich mit Hilfe eines Trafficloggers relativ einfach bewerkstelligen lassen.
Das Problem an den Socket-Funktionen ist nur, dass auch diese nicht standardmaessig in PHP integriert sind sondern beim Kompilieren eingebunden werden muessen. Dementsprechend wird man die im Internet wohl eher selten antreffen.
Aber da Du da ja auf einem Root-Server arbeitest koenntest Du ja dafuer sorgen, dass Du mit Sockets arbeiten kannst.
 
Zuletzt bearbeitet:
So, ich hab vorhin mal was rumgeguckt und rumgescriptet und dabei ist das hier rausgekommen:
PHP:
<?php
function calcchecksum($packet)
{
	if (strlen($packet)%2!=0)
		{
			$packet.="\x00";
		}
	$wordrow=unpack("n*",$packet);
	$checksum=array_sum($wordrow);
	while ($checksum>>16)
		{
			$checksum=($checksum>>16)+($checksum&0xffff);
		}
	$packedsum=pack("n",~$checksum);
	return $packedsum;
}

$socket=socket_create(AF_INET,SOCK_RAW,1);
socket_connect($socket,"localhost",NULL);
$type="\x08";
$code="\x00";
$checksum="\x00\x00";
$identifier="\x00\x00";
$sequenceno="\x00\x01";
$data="";
for ($x=0;$x<7;$x++)
	{
		$data.=chr(rand(0,255));
	}
$data.="\x00\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37";
$checksum=calcchecksum($type.$code.$checksum.$identifier.$sequenceno.$data);
$packet=$type.$code.$checksum.$identifier.$sequenceno.$data;
socket_write($socket,$packet);
socket_close($socket);
?>

Ich hab mich da beim Scripten an den Scripts auf php.net angelehnt, da die ganze Socket-Geschichte fuer mich noch Neuland ist.
Und bei der Checksumme wurden auch ein paar Operaten genutzt mit denen ich noch nicht gearbeitet hab.

Das Script funktioniert nun auch so weit.
Das Problem ist jedoch, dass das nicht laeuft wenn der Webserver (also quasi der User nobody) ausfuehrt.
Dann sehe ich diese Fehlermeldung:
Unable to create socket [1]: Operation not permitted

Das koennte natuerlich ein Problem darstellen, weil als root sollte man den Webserver ja nun nicht unbedingt laufen lassen.

Ausserdem hab ich mal geschaut was denn so bei der traceroute ablaeuft.
Das scheint mir auf einer Mischung aus UDP und ICMP zu vertrauen.
Aber wie das genau laeuft hab ich bisher noch nicht raus.
 
Zuletzt bearbeitet:
@reptiler, und was ist wenn Du das Script als "wwwrun" hochlädst?
Er hat ja ein Root Server, dürfte also nicht das Problem sein.
 
Keine Ahnung.

Meine Box hier hat keinen User wwwrun, daher kann ich das nicht testen.

Aber ich glaube nicht, dass der wesentlich mehr Rechte als nobody hat.
Selbst ein User der Gruppe users kann das Script nicht ausfuehren. Das hab ich grad mal getestet.
 
Das dachte ich mir schon.
Hmm, dann faellt das Script wohl fuer den Einsatz auf dem Webserver flach.

Ich hab halt dann immer als root ueber die Shell getestet. Und da lief es, wie gesagt, wunderbar.
 
Zurück