ralphi: stringMatchWithWildcard() oder anders mit cli für IP-geolocation

Hallo zusammen,

ich bastel gerade an einem universaltool -Ip location (Einsatzmöglichkeit offen).
Dabei starte ich ein prog im hintergrund (mit cli), dass mir die Orte der IP Adressen in ne DB loggen soll.

Das geschriebene funktioniert auch soweit. Nur möchte ich die localen Zugriffe ausiffen.
stringMatchWithWildcard($ip2,"192.168.*")
Die function kennt cli nicht.
Wie könnte ich noch adressbereiche zum ausiffen angeben?

Im folgenden das Programm zur Lite-Localisierung:
Nicht wieder posten: Dass gibt’s doch schon alles – nimmste das modul, prog etc. Ich habs nun mal selber geschrieben – wie den dyndns-client halt auch ;-)

PS: getpos.de ist irgendwie verschwunden – weiß jemand was drüber?

Also - test mit

php /xx/besucher.php 192.168.123.111 test

Und später aufrufen mit

<?php  
//include ("module/besucher.php");  
$ip2 = getenv("REMOTE_ADDR");  
$ref2 = getenv("HTTP_REFERER");  
exec ("php -f /yy/besucher.php " .  $ip2 . " " .  $ref2 . " > /dev/null &");  
  
	Header("Location: xx/index.php");  
?>

Folgendes hab ich geschrieben: (kuckt nicht schön aus – tut’s aber ;-)

<?php  
// +++++++++++++++++++++++++++++++  
ini_set('error_reporting', E_ALL); // zum testen  
  
  
// Datenbank öffnen  
$link2 = mysql_connect ("192.168.123.2", "xxx", "xxx");  
mysql_select_db ("statistik");  
  
$ip2 = $argv[1];  
$ref2 = $argv[2];  
  
$query1 = "SELECT * FROM test WHERE ip = '" . $ip2 . "';";  
$res1 = mysql_query($query1);  
$anz = mysql_num_rows($res1);  
  
				/*	<?xml version="1.0" encoding="iso-8869-1"?>  
					<results>  
					<result>  
					<ip>88.198.156.18</ip>  
					<host>utrace.de</host>  
					<isp>Hetzner Online AG</isp>  
					<org>Pagedesign GmbH</org>  
					<region>Hamburg</region>  
					<countrycode>DE</countrycode>  
					<latitude>53.5499992371</latitude>  
					<longitude>10</longitude>  
					<queries>10</queries>  
					</result>  
					</results> */  
  
if ($anz != 0 ) {  
		$row =mysql_fetch_array($res1);  
		$isp = $row['isp'];  
		$org = $row['org'];  
		$ort = $row['ort'];  
		$land = $row['land'];  
		$lat = $row['lat'];  
		$lng = $row['lng'];  
		$queries = $row['queries'];  
		echo "vorhanden ip\n"; // zum testen  
		// stringMatchWithWildcard() klappt nicht  
}elseif (stringMatchWithWildcard($ip2,"192.168.*") or $ip2 == "188.192.17.100"){  
		$isp = 'daheim';  
		$org = 'daheim';  
		$ort = 'daheim';  
		$land = 'Bayern';  
		$lat = 0;  
		$lng = 0;  
		$queries = 0;  
		echo "intern ip\n"; // zum testen  
}else{  
		$url= "http://xml.utrace.de/?query=" . $ip2;  
		$data = simplexml_load_file($url);  
		  
		$isp = $data->result->isp;  
		$org = $data->result->org;  
		$ort = $data->result->region;  
		$land = $data->result->countrycode;  
		$lat = $data->result->latitude;  
		$lng = $data->result->longitude;  
		$queries = $data->result->queries;  
		echo "neu ip\n"; // zum testen  
}  
  
// standard zeug - wers braucht  
$host2 = "seite x Only";  
$seite2 = " seite x ";  
  
	  
	$query1="INSERT INTO test (zeitstamp, datum, zeit, ip, ref, host, seite, ";  
	$query2="isp, org, ort, land, lat, lng, queries) VALUES ";  
	$query3= "('" . time() . "', '" . date("Y-m-d") . "', '" . date("H:i:s");  
	$query4= "', '" . $ip2 . "', '" . $ref2 . "', '" . $host2 . "', '" . $seite2;  
	$query5= "', '" . $isp . "', '" . $org . "', '" . $ort . "', '" . $land;  
	$query6= "', '" . $lat . "', '" . $lng . "', '" . $queries . "');";  
  
	$query = $query1 . $query2 . $query3 . $query4 . $query5 . $query6;  
		mysql_query($query);  
  
// mailen (lass ich erst mal weg)  
		$betreff="visit - " . $ip2 . " Seite: " . $seite2;  
		$html= "<ol> <li>Datum:  " .  date("d.m.Y") . "</li>\n";  
		$html= $html . "<li>Zeit:  " .  date("H:i:s") . "</li>\n";  
		$html= $html . "<li>IP:  " .  $ip2 . "</li>\n";  
		$html= $html . "<li>Ref:  " .  $ref2 . "</li>\n";  
		$html= $html . "<li>Seite:  " .  $seite2 . "</li></ol>\n";  
		  
		$text= "Datum:  " .  date("d.m.Y") . "\n";  
		$text= $text . "Zeit:  " .  date("H:i:s") . "\n";  
		$text= $text . "IP:  " .  $ip2 . "\n";  
		$text= $text . "Ref:  " .  $ref2 . "\n";  
		$text= $text . "Seite:  " .  $seite2 . "\n";  
  
		$adresse = "visit@xx.de";  
		//include ("mailer/mail-ibb-la.php");  	// mailer  
  
  
  
?>

Viele Grüße aus LA

--
ralphi
  1. Hi,

    Das geschriebene funktioniert auch soweit. Nur möchte ich die localen Zugriffe ausiffen.
    Wie könnte ich noch adressbereiche zum ausiffen angeben?

    WAS hast Du damit vor?
    "ausiffen"
    Welcher Sprache entstammt diese Ansammlung von Buchstaben?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Hallo,

      Das geschriebene funktioniert auch soweit. Nur möchte ich die localen Zugriffe ausiffen.
      Wie könnte ich noch adressbereiche zum ausiffen angeben?

      WAS hast Du damit vor?
      "ausiffen"
      Welcher Sprache entstammt diese Ansammlung von Buchstaben?

      vielleicht sowas ähnliches wie "versiffen"?

      Ciao,
       Martin

      --
      Wie kann es sein, dass ich von 100 Gramm Schokolade zwei Kilo zunehme?
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. WAS hast Du damit vor?

        weiß auch noch nicht.

        eventuell bei onlineshops eine grob validierung beim bestellvorgang, wo man nachhacken kann, wenns gar nicht passt

        oder um im vorfeld spassbesteller abzuschrecken - mit zb: schöne Grüße nach xxx
        dann fühlen sich viele nicht mehr komplett anonym

        ober egal für was und ob überhaupt und warum und weswegen
        Frage:
        wie bekomme ich strings mit * hin, um ihn mit if($string != "irden*") bedingung setzen zu können? unter cli (commandozeile)!

        Viele Grüße aus LA

        --
        ralphi
        1. Hi,

          wie bekomme ich strings mit * hin, um ihn mit if($string != "irden*") bedingung setzen zu können? unter cli (commandozeile)!

          Also willst du lediglich prüfen, ob ein String mit einer bestimmten Zeichenkette beginnt?

          Na dann schau dir die String-Funktionen im Manual an.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          1. Na dann schau dir die String-Funktionen im Manual an.

            ja klar- bin so eingeschossen auf das stringMatchWithWildcard() gewesen.
            strchr( $ip2, "192.168." ) == true
            tuts natürlich auch.

            Viele Grüße aus LA

            --
            ralphi
            1. ja klar- bin so eingeschossen auf das stringMatchWithWildcard() gewesen.
              strchr( $ip2, "192.168." ) == true
              tuts natürlich auch.

              Nein! Das matcht auch etwas wie '2.192.168.13'. Also *192.168.*

              Du willst, wie dedlfix schon "sagte":

              if (0 === strpos('192.168.', $ip2)) {  
                #...  
              }  
              
              

              Jörg Reinholz

              1. Im übrigen: Sieh Dir mal meine Implementierung einer IP-basierten whitelist an. Die versteht auch sowas:

                192.168.10.10                   # Einzelne IP-Adresse
                192.168.10.1 - 192.168.10.10    # Bereich von - bis
                192.168.10.1/255.255.255.0      # IP-Adresse und Netzwerkmaske
                192.168.10.1/24                 # IP-Adresse und Netzwerkmaske

                Jörg Reinholz

                1. Im übrigen: Sieh Dir mal meine Implementierung einer IP-basierten whitelist an.

                  das gefällt mir - vor allem dass mit der Honigfalle. - ich glaub ich mach doch noch ein paar ports auf mit forward zur nsa :-) oder lass mir was einfallen (irgenwas streng geheim ufo baupläne ..)

                  Jörg Reinholz

                  Viele Grüße aus LA

                  --
                  ralphi
              2. Nein! Das matcht auch etwas wie '2.192.168.13'. Also *192.168.*

                stimmt  ;-)

                Viele Grüße aus LA

                --
                ralphi
        2. Tach!

          wie bekomme ich strings mit * hin, um ihn mit if($string != "irden*") bedingung setzen zu können? unter cli (commandozeile)!

          Da braucht es kein *. Teilstrings sucht man mit strpos(). Wenn das Ergebnis 0 (und nur 0, nicht etwa false) ist, dann entspricht das einem suchbegriff*. Für *suchbegriff müsstest du etwas rechnen, und ermitteln, ob die Position des "suchbegriff" gleich Stringlänge minus "suchbegriff"-Länge ist. Bei *suchbegriff* muss das Ergebnis lediglich ungleich false (false!, nicht 0) sein.

          dedlfix.

          1. Da braucht es kein *. Teilstrings sucht man mit strpos(). Wenn das Ergebnis 0 (und nur 0, nicht etwa false) ist, dann entspricht das einem suchbegriff*. Für *suchbegriff müsstest du etwas rechnen, und ermitteln, ob die Position des "suchbegriff" gleich Stringlänge minus "suchbegriff"-Länge ist. Bei *suchbegriff* muss das Ergebnis lediglich ungleich false (false!, nicht 0) sein.

            Wäre es für bla* bzw *bla nicht effizienter, substr und == zuverwenden, statt den String abzusuchen?

            Also:

            function str_startswith($haystack, $needle) {  
            	return  
            		($len_needle = strlen($needle)) <= ($len_haystack = strlen($haystack))  
            		?  
            			substr($haystack, 0, $len_needle) == $needle  
            		:  
            			$len_needle == $len_haystack && $haystack == $needle;  
            }  
              
            function str_endswith($haystack, $needle) {  
            	return  
            		($len_needle = strlen($needle)) <= ($len_haystack = strlen($haystack))  
            		?  
            			substr($haystack, $len_haystack - $len_needle)) == $needle  
            		:  
            			$len_needle == $len_haystack && $haystack == $needle;  
            }  
            
            

            MfG
            bubble

            --
            If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
            1. Tach!

              Da braucht es kein *. Teilstrings sucht man mit strpos(). Wenn das Ergebnis 0 (und nur 0, nicht etwa false) ist, dann entspricht das einem suchbegriff*. Für *suchbegriff müsstest du etwas rechnen, und ermitteln, ob die Position des "suchbegriff" gleich Stringlänge minus "suchbegriff"-Länge ist. Bei *suchbegriff* muss das Ergebnis lediglich ungleich false (false!, nicht 0) sein.

              Wäre es für bla* bzw *bla nicht effizienter, substr und == zuverwenden, statt den String abzusuchen?

              Das kannst du ja gern selbst messen, der Unterschied wird aber im Rauschen untergehen, besonders bei einer "haushaltsüblichen" Anzahl an Verwendungen pro Script. Teilstring-Suche ist ein bereits seit langem gelöstes Problem, der Algorithmus dazu sollte sehr effizient arbeiten.

              function str_startswith($haystack, $needle) {

              Diese Funktion ist schon länger zu notieren als der Einzeiler mit strpos(). Und wenn die Nadel länger als der Heuhaufen ist, kann das Ergebnis nur false werden. Selbst das muss man nicht extra prüfen, denn es stört nicht, wenn zu viel abzuschneiden versucht wird. Das substr()-Ergebnis ist dann trotzdem nur so lang wie der Heuhaufen und damit immer noch ungleich der Nadel.

              return substr($haystack, 0, strlen($needle)) == $needle;

              function str_endswith($haystack, $needle) {

              Lässt sich sicherlich ähnlich verkürzen, und nur diese Funktion wird gebraucht. Für den Rest plädiere ich weiterhin dafür, die vorhandenen Werkzeuge zu verwenden.

              dedlfix.

              1. Das kannst du ja gern selbst messen, der Unterschied wird aber im Rauschen untergehen, besonders bei einer "haushaltsüblichen" Anzahl an Verwendungen pro Script. Teilstring-Suche ist ein bereits seit langem gelöstes Problem, der Algorithmus dazu sollte sehr effizient arbeiten.

                Naja, im Rauchen geht der Unterschied nicht unter wenn man exzessiv testet.
                Meine Varianten sind bedeutend langsamer. Wärend $x === strpos() nur ~2.9 Sekunden für die die 10Mio Aufrufe gebraucht hat, waren es bei meinen Funktionen ~11.3 Sekunden :s

                Von daher, ich hab nüscht jesacht. *los geh und vor mich hinpfeif*

                MfG
                bubble

                --
                If "god" had intended us to drink beer, he would have given us stomachs. - David Daye