Umgang mit Session IDs

maceis

Aktives Mitglied
Thread Starter
Dabei seit
24.09.2003
Beiträge
16.880
Reaktionspunkte
626
hallo zusammen,

ich arbeite an einem Skript (Perl), mit dem ich aus meinem GMX Account bestimmte Informationen herunterladen möchte.

Bei GMX wird offensichtlich mit Session IDs gearbeitet, die nach dem Einloggen in schönster GET Manier an bestimmte Links angehängt werden (?sid=...), nämlich an diejenigen, welche einen eingeloggten Benutzer zu seinen "persönlichen" Informationen bzw Konfigurationsseiten bringen sollen.
Die Seiten werden also dynamisch generiert und die Session ID ist (natürlich) jedesmal unterschiedlich.

Die Frage ist nun:
Wie kommt mein Skript an die jeweilige Session ID?
Muss ich tatsächlich jedesmal die vom Server ausgelieferte Webseite parsen?

Ich fürchte fast, das muss ich, aber vielleicht gibt es noch einen anderen Ansatz, den ich bisher nicht sehe.
 
SessionIDs sollen ja gerade zufällig sein! Wenn Du einen Algorithmus zu deren Berechnung im Voraus kennst, sag mir bescheid :)
 
Ich kenne mich mit Perl überhaupt nicht aus, aber könntest du nicht die Login-
Daten an das Script senden, das das Formular auswertet, und dann den Header
auslesen, den dieses Script ausgibt? Dort steht dann eben die URL mit der
Sessionid, zu der der Browser umgeleitet würde...

Oder meintest du exakt dies mit "parsen"?
 
Zuletzt bearbeitet:
include die cgi.pm, dort kannst du mit "param" evtl. ganz einfach auf die Session ID zugreifen.
 
@wegus
Das ist mir schon klar.
Ich wollte sie ja auch nicht selbst berechnen, sondern dachte, es gibt vielleicht eine intelligente Methode, wie man die "abgreifen" kann ;).

@moses
So ähnliches hatte ich mir das gedacht.
Muss ich glatt mal ausprobieren.

@incoming
CGI.pm ist rießig, das möchte ich eigentlich nicht laden müssen.
Abgesehen davon hat das einen völlig anderen Anwendungszweck.

----

Das Skript ist übrigens schon weitgehend fertig. Die Session ID hole ich mit einem Patternmatching aus der (Zwischen-)Ergebnisseite.

Es fehlt nur noch der Teil, der aus der Ergebnisseite in html (mein "DSL-Telefonie Verbindungsprotokoll") die einzelnen Verbindungen zeilenweise in eine Textdatei herauszieht.
Diese Textdatei kann ich dann mit einem kleinen awk Skript weiterverarbeiten und erhalte am Ende eine Aufschlüsselung der Kosten nach Rufnummern (wahlweise auch nach Tagen oder beides).

Etwas überraschendes ist mir noch aufgefallen:
Mein Skript meldet sich ja nicht mehr aus meinem Account ab.
Trotzdem erhalte ich danach beim normalen Einloggen via Browser nie diese alberne Warnung, dass man die Seite nur über den "Logout" button verlassen soll.
Keine Ahnung warum.
 
moses_78 schrieb:
..., aber könntest du nicht die Login-
Daten an das Script senden, das das Formular auswertet, und dann den Header auslesen, den dieses Script ausgibt? Dort steht dann eben die URL mit der Sessionid, zu der der Browser umgeleitet würde...

Oder meintest du exakt dies mit "parsen"?
Mit parsen meinte ich durcharbeiten und analysieren. Wäre natürlich wesentlich eleganter nur die Header zu "parsen" als die ganze Seite mit. Das gilt um so mehr, als man nicht nur die SID braucht, sondern auch die "Nummer" des Servers, der die Anfrage bearbeitet (www093.gmx.net/...)

Dein Vorschlag ist sehr gut, nur führt er in diesem Fall zu zusätzlichen Schwierigkeiten, da GMX offensichtlich mehrmals weitereleitet.
Bei der ersten Weiterleitung bekommt man die Sesssion ID noch nicht :(.

Macht aber nicht wirklich was, da ich die erforderlichen Daten dann eben aus der html Antwort hole. Ich werde mir den Ansatz trotzdem merken.
 
maceis schrieb:
sondern dachte, es gibt vielleicht eine intelligente Methode, wie man die "abgreifen" kann

hm, da war der Wegus wohl kapiergeschützt :p

Dafür kenn ich mich in Perl zu schlecht aus...
 
Das hat mit Perl wenig zu tun (eigentlich gar nichts).
Da gibt es eine Client Anwendung und einen Server, die über HTTP kommunizieren.
Der Client sendet "Anfragen" an den Server.
Alles was daraufhin der Server an den Client schickt, kann dieser lesen und auswerten.
 
ist mir schon klar, aber z.B. PHP kapselt das sehr nett und man kann mit PHP recht leicht auf die SESSION-ID zugreifen. Auch Java-Servlets zerlegen die HTTP-Requests meist schon mundgerecht. Wie das nun bei Perl geht, der Mutter aller Web-Scriptsprachen, weiß ich eben nicht. Ich denke nicht, daß man das zu Fuß machen muß!
 
wegus schrieb:
ist mir schon klar, aber z.B. PHP kapselt das sehr nett und man kann mit PHP recht leicht auf die SESSION-ID zugreifen.
...
Ja?
Wie könnte das denn in PHP aussehen?
Ich kann mir im Augenblick nicht vorstellen, wie das in PHP wesentlich anders gehen sollte - mal ganz abgesehen davon, dass ich ein solches Skript nicht unbedingt in PHP schreiben wollen würde, obwohl es natürlich bestimmt möglich wäre.
wegus schrieb:
...
Auch Java-Servlets zerlegen die HTTP-Requests meist schon mundgerecht.
...
Eigentlich geht es ja weniger um die Requests als um die Antworten des Servers.
wegus schrieb:
...
Wie das nun bei Perl geht, der Mutter aller Web-Scriptsprachen, weiß ich eben nicht. Ich denke nicht, daß man das zu Fuß machen muß!
Muss man auch nicht. In diesem Fall empfinde ich es zu Fuß einfacher, weil ich mich dann nicht zu Fuß um die diversen redirects kümmern muss, um genau an der passenden Weiterleitung den passenden Header herauszuziehen.
 
Irgendwie kann ich Dir jetzt nicht ganz folgen.

Die Session Funktionen, auf die Dein Link mich führt sind doch zum serverseitigen Erzeugen und Handlen von Sessions gedacht (oder steh ich jetzt auf der Leitung?).

Mein Skript ist aber doch eine Client Anwendung.
Es schickt einige Daten (Benutzername, Passwort) an ein cgi Skript auf dem GMX Webserver, wird mehrmals umgeleitet, liefert jedesmal die Daten ab und erhält igendwann einen Code 200 und eine HTML Seite. Da drin sind dann einige Links, an die die Session ID als URL Parameter angehängt ist.

Sinn des Ganzen ist es, mithilfe eines Cron Jobs täglich einmal mein Telefonie Verbindungsprotokoll zu analysieren und abzuspeichern.

Netter Nebeneffekt:
GMX vergibt "Treuepunkte", für jeden Tag, an dem man sich mindestens einmal einlogt. Bei tausend Punkten gibts ne aufblasbare Waschmaschine oder was ähnlich nützliches.
Aus diesem Grund habe ich das Skript gleich so geschrieben, dass die Accounts meiner Familie einmal täglich mit abgeklopft werden können. Es steht ja nirgends, dass man sich mit einem Webbrowser anmelden muss ;).
Abgesehen davon, können Sie das gar nicht von einem "normalen" Zugriff über Webbrowser unterscheiden :D.
 
maceis schrieb:
...da GMX offensichtlich mehrmals weitereleitet. Bei der ersten Weiterleitung bekommt man die Sesssion ID noch nicht...
Mit Curl sollte das doch eigentlich gehen, wenn man CURLOPT_FOLLOWLOCATION
auf 1 setzt (zumindest in PHP, aber bei Perl sollte es sich ja ähnlich verhalten).
 
Da mir gerade was langweilig ist.... ;)

PHP:
#!/usr/bin/php
<?php

 $formularfelder = array(
  'LANG' => 'de',
  'AREA' => '1',
  'EXT' => '',
  'EXT2' => '',
  'id' => '<adresse>',
  'p' => '<passwort>');

 $ch = curl_init('http://www019.gmx.net/de/cgi/login');

 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 curl_setopt($ch, CURLOPT_REFERER, 'http://www.gmx.net/de/');
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8');
 //für die statistik :D

 curl_setopt($ch, CURLOPT_POSTFIELDS, $formularfelder);
 
 $page = curl_exec($ch);
 $info = curl_getinfo($ch);
 curl_close($ch);
 
 echo $page."\n\n\n";
 var_dump($info);

?>
 
Nicht schlecht.
Damit könnte man auch was anfangen ;).
 
Mich würde mal das Ergebnis interessieren :)

......ich will doch schließlich auch eine aufblasbare Waschmaschine :D
 
Ich bin gerade dabei, ein Modul in Perl zu entwickeln, das eine einfache OO Schnittstelle zum GMX Account bietet. Grundsätzlich funktioniert es schon soweit, dass ich mich ein- und wieder ausloggen und meinen Verbindungsnachweis abrufen kann und das die Ereignisse in einer Logdatei protokolliert werden.

Es fehlt aber noch der Feinschliff, der Code kann/muss noch vereinfacht werden. Ich möchte außerdem noch einige kleinere Funktionen hinzufügen wie zB. die Abfrage des aktuellen Punktestands.

Das mit den Session IDs habe ich so gelöst, dass das Ergebnis einer Abfrage (sprich: der Inhalt der vom Server ausgelieferten Webseite) in einer Variablen $result abgelegt wird.
Daraus hole ich mir dann die verbindungsspezifischen Parameter mit folgendem Code:
Code:
    my ($sid)   = $result =~ /\?sid=(.*)?">Mein /;
    my ($logout) = $result =~ /nph-logout\?(.*?)"/;
    my ($serverid) = $result =~ /www(\d{3})\.gmx\.net/;

Mit einer ähnlichen Methode hole ich mir übrigens auch eine Übersicht meiner Kontoumsätze oder einfach nur den aktuellen Kontostand von der Website meiner Bank. Das schöne dabei ist, dass das (bisher) immer auch dann funktionierte, wenn der Server angeblich überlastet war ;).
 
Zurück
Oben Unten