K@rl: Wie erhalte ich die IP - Adresse des Skriptnutzers?

Beitrag lesen

Wie erhalte ich die IP - Adresse des Skriptnutzers?

ich möchte Deine Aufmerksamkeit auf folgende Umgebungsvariablen lenken, die für Dich von Interesse sein könnten:

$sport    = $ENV{'SERVER_PORT'};
$addr     = $ENV{'REMOTE_ADDR'};
$port     = $ENV{'REMOTE_PORT'};

... und auch:
$browser  = $ENV{'HTTP_USER_AGENT'};
$url      = $ENV{'REQUEST_URI'};

ggf. sind auch die folgenden Scripte für Dich interessant:

-----------------------------------------------------------------------------------------

sub get_host {

-----------------------------------------------------------------------------------------

Arg 1: IP-Adresse als String

Return: Host-Name als String

my $iaddr, $host;
  # String in numerisches Formmat wandeln
  $iaddr = inet_aton($_[0]);
  $host = gethostbyaddr ( $iaddr , AF_INET ) or return "";
  return $host;
}

-----------------------------------------------------------------------------------------

sub get_user {

-----------------------------------------------------------------------------------------

Arg 1: IP-Adresse als String

Arg 2: Port des Browsers

Arg 3: Port des Servers

Return: String mit User-Name bzw. Full-Name

my ($iname, $port, $sport, $iaddr, $paddr, $proto, $question, $answer, $id);

$iname = $_[0];
  $port = $_[1];
  $sport = $_[2];
  #-- test identd --
  $iaddr = inet_aton ( $iname );
  # Port 113: identd
  $paddr = sockaddr_in ( 113 , $iaddr );
  $proto= getprotobyname( "tcp" );
  # Format der Anfrage: "<<lokaler Port>>, <<enfernter Port>>"
  $question = "$port, $sport\n";

socket( SOCK, PF_INET, SOCK_STREAM, $proto) or return "";
  connect( SOCK, $paddr ) or return "";
  send( SOCK, $question, 0) or return "";
  recv( SOCK, $answer, 1024, 0) or return "";
  close( SOCK );
  # Format der Antwort:
  # "<<lok.Port>> , <<entf. Port>> : USERID : UNIX :ju"
  (undef, undef, undef, $id ) = split (":", $answer);

if ( $id ) {
    #-- now try finger --
    $remote = IO::Socket::INET->new(
       Proto => "tcp",
       PeerAddr => $iname,
       PeerPort => "finger(79)"
    ) or return $id;
    # Systempuffer abschalten
    $remote->autoflush(1);
    # nach Benutzer fragen
    print $remote "$id\n";
    # Ausgabe auswerten
    while (<$remote>) {
      # Suchen nach "Name: Hugo Meier"
#      if (/Name: ([a-z,‚ ‚]+)/i) {
$id = $1;
#      }
    }
    close $remote;
  }
  return $id;
}

Copyright-Vermerk:
Der Code sammt in seien Ursprüngen nicht von mir sondern von "ju" von der Zeitschrift c't (vergleiche c't 4/99, S. 230)

ach ja: die Aufrufe:

$host     =  get_host ($addr);
$user     =  get_user( $addr, $port, $sport);

Ciao
  K@rl