Discussion:
Cookie mit Perl auslesen
(zu alt für eine Antwort)
Thomas Müller
2007-03-03 16:12:42 UTC
Permalink
Hallo,
ich habe in einem PHP-Skript mit setcookie() ein Cookie gesetzt, das nun
sicher vorhanden ist und das noch nicht abgelaufen ist.

Den Wert des Cookies möchte ich nun von der gleichen Domäne aus mit
einem Perl-Skript auslesen. Das habe ich wie folgt versucht:

#!/usr/bin/perl
use CGI;
use strict;
use warnings;
use diagnostics;

my $query = new CGI;
my $cookievalue = $query->cookie(-name=>'Testcookie');

print "Content-type: text/html\n\n";

if ($cookievalue) {
print $cookievalue;
}
else {
print "Cookie nicht gefunden.";
}

Leider scheint $ccokievalue immer leer zu sein, so dass die Meldung
kommt, dass kein Cookie gefunden werden konnte.

Was mache ich falsch? Wie kann ich den Wert des Cookies auslesen?

Vielen Dank, viele Grüße
Thomas
Michael Holzt
2007-03-03 16:17:40 UTC
Permalink
Post by Thomas Müller
Was mache ich falsch? Wie kann ich den Wert des Cookies auslesen?
"perldoc CGI" hätte Dir verraten, daß der Aufruf so aussehen soll:

| To retrieve a cookie, request it by name by calling cookie() method
| without the -value parameter:
|
| use CGI;
| $query = new CGI;
| $riddle = cookie('riddle_name');
--
"We're nympholeptics, desiring the unobtainable. We risk sanity for moments
of temporary enlightenment. So many ideas, so little memory. The last thought
killed by anticipation of the next. We feel an oberwhelming feeling of love;
we flow in unison." -- Jip (John Simm) in 'Human Traffic'
Wolf Behrenhoff
2007-03-03 16:23:59 UTC
Permalink
Post by Thomas Müller
Hallo,
ich habe in einem PHP-Skript mit setcookie() ein Cookie gesetzt, das nun
sicher vorhanden ist und das noch nicht abgelaufen ist.
Den Wert des Cookies möchte ich nun von der gleichen Domäne aus mit
Bist du ganz sicher, dass dein Cookie gesetzt ist? Ich habe dein Script
ausprobiert - und es funktioniert bei mir, d.h. es liefert einen Cookie,
wenn einer gesetzt ist!

Wolf
Michael Holzt
2007-03-03 16:26:33 UTC
Permalink
Post by Wolf Behrenhoff
Bist du ganz sicher, dass dein Cookie gesetzt ist? Ich habe dein Script
ausprobiert - und es funktioniert bei mir, d.h. es liefert einen Cookie,
wenn einer gesetzt ist!
Das kann ich mir eigentlich nicht vorstellen. Laut Manpage von CGI liefert
der Aufruf von cookie() mit Parameter -name einen Cookie zurück, den man
dann an den Browser schicken kann, nicht den Wert eines Cookies.
--
In der klassischen Kryptographie verschlüsselt Alice Nachrichten an Bob um
sie vor Carol zu schützen. Bei DRM sind Bob und Carol die gleiche Person.
-- angeblich von Bruce Schneier, Einzelnachweis gesucht
Frank Seitz
2007-03-03 16:31:42 UTC
Permalink
Post by Michael Holzt
Post by Wolf Behrenhoff
Bist du ganz sicher, dass dein Cookie gesetzt ist? Ich habe dein Script
ausprobiert - und es funktioniert bei mir, d.h. es liefert einen Cookie,
wenn einer gesetzt ist!
Das kann ich mir eigentlich nicht vorstellen. Laut Manpage von CGI liefert
der Aufruf von cookie() mit Parameter -name einen Cookie zurück, den man
dann an den Browser schicken kann, nicht den Wert eines Cookies.
Nee, laut Manpage wird ein Cookie abgefragt, indem
-value nicht angegeben wird. Du hast die Stelle selbst zitiert.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Michael Holzt
2007-03-03 16:36:01 UTC
Permalink
Post by Frank Seitz
Nee, laut Manpage wird ein Cookie abgefragt, indem
-value nicht angegeben wird. Du hast die Stelle selbst zitiert.
Zum Abfragen wird laut manpage aber auch nicht -name verwendet.
--
What is the difference between Scientology and Microsoft? One is an
evil cult bent on world domination and the other was begun by L. Ron
Hubbard.
-- anonym von slashdot.org
Frank Seitz
2007-03-03 16:39:29 UTC
Permalink
Post by Michael Holzt
Post by Frank Seitz
Nee, laut Manpage wird ein Cookie abgefragt, indem
-value nicht angegeben wird. Du hast die Stelle selbst zitiert.
Zum Abfragen wird laut manpage aber auch nicht -name verwendet.
Kann man man wohl weglassen, wenn der Name
der einzige Parameter ist.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Michael Holzt
2007-03-03 16:39:32 UTC
Permalink
Post by Frank Seitz
Nee, laut Manpage wird ein Cookie abgefragt, indem
-value nicht angegeben wird. Du hast die Stelle selbst zitiert.
Zum Abfragen wird laut manpage aber auch nicht -name verwendet. Allerdings
geht der Aufruf mit "-name" offenbar auch:

| $ env HTTP_COOKIE="foo=bar" perl -e 'use CGI qw|:standard|;
| print cookie(-name=>"foo") . "\n";'
| bar
--
What is the difference between Scientology and Microsoft? One is an
evil cult bent on world domination and the other was begun by L. Ron
Hubbard.
-- anonym von slashdot.org
Wolf Behrenhoff
2007-03-03 16:59:03 UTC
Permalink
Post by Michael Holzt
Post by Frank Seitz
Nee, laut Manpage wird ein Cookie abgefragt, indem
-value nicht angegeben wird. Du hast die Stelle selbst zitiert.
Zum Abfragen wird laut manpage aber auch nicht -name verwendet. Allerdings
Natürlich geht das.

CGI erlaubt oft mehrere Möglichkeiten, Parameter zu übergeben. Einmal
kann man mit -name => usw. arbeiten oder man lässt das weg und benutzt
eine spezielle Reihenfolge. Dazu wird rearrange aus CGI::Util verwendet.
Es ist also völlig egal, ob du cookie(-name => 'foo') oder cookie('foo')
schreibst. Die Reihenfolge kannst du CGI.pm entnehmen (name, value,
path, ...)

Wolf
Thomas Müller
2007-03-03 18:21:16 UTC
Permalink
Hallo,
vielen Dank für die schnelle Antwort!
Post by Wolf Behrenhoff
Post by Thomas Müller
ich habe in einem PHP-Skript mit setcookie() ein Cookie gesetzt, das nun
sicher vorhanden ist und das noch nicht abgelaufen ist.
Den Wert des Cookies möchte ich nun von der gleichen Domäne aus mit
Bist du ganz sicher, dass dein Cookie gesetzt ist? Ich habe dein Script
ausprobiert - und es funktioniert bei mir, d.h. es liefert einen Cookie,
wenn einer gesetzt ist!
Du hast vollkommen Recht. Ich habe das Script soeben auf einem anderen
Server getestet und da wird der vorab mit PHP gesetzte Cookie
einwandfrei ausgelesen.

Nun die Frage: Woran kann es (serverbedingt) liegen, dass folgende
Zeilen ein definitiv vorhandenes Cookie nicht auslesen können?

#!/usr/bin/perl
use CGI;
use strict;
use warnings;
use diagnostics;

my $query = new CGI;
my $cookievalue = $query->cookie(-name=>'Testcookie');

print "Content-type: text/html\n\n";

if ($cookievalue) {
print $cookievalue;
}
else {
print "Cookie nicht gefunden.";
}

Im error.log vom Apachen sind leider keine Hinweise zu finden. Für
weitere Antworten wäre ich sehr dankbar!

Viele Grüße
Thomas
Wolf Behrenhoff
2007-03-03 18:50:46 UTC
Permalink
Post by Thomas Müller
Post by Wolf Behrenhoff
Bist du ganz sicher, dass dein Cookie gesetzt ist? Ich habe dein Script
ausprobiert - und es funktioniert bei mir, d.h. es liefert einen Cookie,
wenn einer gesetzt ist!
Du hast vollkommen Recht. Ich habe das Script soeben auf einem anderen
Server getestet und da wird der vorab mit PHP gesetzte Cookie
einwandfrei ausgelesen.
Nun die Frage: Woran kann es (serverbedingt) liegen, dass folgende
Zeilen ein definitiv vorhandenes Cookie nicht auslesen können?
Serverbedingt: daran liegt es vermutlich sowieso nicht. Cookies werden
ja gerade nicht auf einem Server gespeichert, sondern vom Browser des
Clients.

Also: ich weiß ja nicht, welchen Browser du nutzt, aber schau doch
einfach mal in deinem Browser nach, ob der entspr. Cookie gesetzt ist.
Und dann nimm Wireshark und gucke nach, ob dein Browser den Cookie auch
sendet.

Wolf
Thomas Müller
2007-03-03 19:57:13 UTC
Permalink
Hallo!
Post by Wolf Behrenhoff
Post by Thomas Müller
Post by Wolf Behrenhoff
Bist du ganz sicher, dass dein Cookie gesetzt ist? Ich habe dein Script
ausprobiert - und es funktioniert bei mir, d.h. es liefert einen Cookie,
wenn einer gesetzt ist!
Du hast vollkommen Recht. Ich habe das Script soeben auf einem anderen
Server getestet und da wird der vorab mit PHP gesetzte Cookie
einwandfrei ausgelesen.
Nun die Frage: Woran kann es (serverbedingt) liegen, dass folgende
Zeilen ein definitiv vorhandenes Cookie nicht auslesen können?
Serverbedingt: daran liegt es vermutlich sowieso nicht. Cookies werden
ja gerade nicht auf einem Server gespeichert, sondern vom Browser des
Clients.
Also: ich weiß ja nicht, welchen Browser du nutzt, aber schau doch
einfach mal in deinem Browser nach, ob der entspr. Cookie gesetzt ist.
Und dann nimm Wireshark und gucke nach, ob dein Browser den Cookie auch
sendet.
Naja, Cookies werden durch entsprechende Anweisungen im HTTP-Header, den
der Server zusammenbaut, durch den Klient gesetzt. Völlig unbeteiligt
ist der Server also nicht.

Ich habe dasselbe Skript auf zwei unterschiedliche Server geladen und
teste es auf zwei Tabs in einem Browserfenster. Die Einstellungen des
Browsers sind definitiv gleich. Durch das PHP-Skript wird durch beide
Server ein entsprechendes Cookie gesetzt, das habe ich überprüft. Das
Perlskript kann aber eben nur auf dem einen Server den Wert mit dem
bekannten Skript auslesen, auf dem andren ist $cookievalue nach wie vor
leer.

Daher vermute ich, dass dem Server noch irgendwas fehlt. Leider habe ich
keine Ahnung, was das sein könnte oder in welcher Richtung ich suchen soll.

Bin für jeden weiteren Tipp dankbar!
Viele Grüße
Thomas
Wolf Behrenhoff
2007-03-03 20:22:01 UTC
Permalink
Post by Thomas Müller
Hallo!
Ich habe dasselbe Skript auf zwei unterschiedliche Server geladen und
teste es auf zwei Tabs in einem Browserfenster. Die Einstellungen des
Browsers sind definitiv gleich. Durch das PHP-Skript wird durch beide
Server ein entsprechendes Cookie gesetzt, das habe ich überprüft. Das
Perlskript kann aber eben nur auf dem einen Server den Wert mit dem
bekannten Skript auslesen, auf dem andren ist $cookievalue nach wie vor
leer.
Hast du auch überprüft, dass der Browser den Cookie wirklich sendet?
Post by Thomas Müller
Daher vermute ich, dass dem Server noch irgendwas fehlt. Leider habe ich
keine Ahnung, was das sein könnte oder in welcher Richtung ich suchen soll.
Du kannst ja dieses kleine Script ja mal probieren:
use strict;
use warnings;
use Data::Dumper;
use CGI qw(:standard);
print header(
-cookie => cookie(-name => 'ngtest', -value => scalar localtime,
-expires => '+1h'),
-type => 'text/plain'
);
print Dumper cookie('ngtest');

Das sollte immer die Zeit des vorherigen Aufrufs anzeigen bzw. undef
beim ersten Mal.

Wenn das funktioniert, liegt dein Problem nicht beim Webserver.

Wolf
Thomas Müller
2007-03-04 18:14:35 UTC
Permalink
Hallo!
Post by Wolf Behrenhoff
Post by Thomas Müller
Ich habe dasselbe Skript auf zwei unterschiedliche Server geladen und
teste es auf zwei Tabs in einem Browserfenster. Die Einstellungen des
Browsers sind definitiv gleich. Durch das PHP-Skript wird durch beide
Server ein entsprechendes Cookie gesetzt, das habe ich überprüft. Das
Perlskript kann aber eben nur auf dem einen Server den Wert mit dem
bekannten Skript auslesen, auf dem andren ist $cookievalue nach wie vor
leer.
Hast du auch überprüft, dass der Browser den Cookie wirklich sendet?
Post by Thomas Müller
Daher vermute ich, dass dem Server noch irgendwas fehlt. Leider habe ich
keine Ahnung, was das sein könnte oder in welcher Richtung ich suchen soll.
use strict;
use warnings;
use Data::Dumper;
use CGI qw(:standard);
print header(
-cookie => cookie(-name => 'ngtest', -value => scalar localtime,
-expires => '+1h'),
-type => 'text/plain'
);
print Dumper cookie('ngtest');
Vielen Dank für das Skript! Dieses kann das selbst gesetzte Cookie auch
auf dem "Problemserver" auslesen. Daraufhin konnte ich die beiden
Cookies vergleichen und einen wesentlichen Unterschied feststellen:

Die PHP-Funktion setcookie() setzt per default den Pfad, in dem das
Cookie verfügbar ist, auf das aktuelle Verzeichnis des PHP-Skripts. Das
CGI-Skript ist aber nicht im selben Ordner, kann also nicht auf das
Cookie zugreifen. Das Übergeben eines vierten path-Parameter "/" hat die
Sache gelöst. Ich wusste nicht, dass es dieses path-Attribut gibt... :(

Vielen Dank für eure tolle Hilfe!
Viele Grüße
Thomas

Peter J. Holzer
2007-03-03 21:04:29 UTC
Permalink
Post by Thomas Müller
Post by Wolf Behrenhoff
Also: ich weiß ja nicht, welchen Browser du nutzt, aber schau doch
einfach mal in deinem Browser nach, ob der entspr. Cookie gesetzt ist.
Und dann nimm Wireshark und gucke nach, ob dein Browser den Cookie auch
sendet.
Naja, Cookies werden durch entsprechende Anweisungen im HTTP-Header, den
der Server zusammenbaut, durch den Klient gesetzt. Völlig unbeteiligt
ist der Server also nicht.
Ja, aber den Teil erledigt bei Dir ein PHP-Script, somit ist das hier
off-topic :-).
Post by Thomas Müller
Ich habe dasselbe Skript auf zwei unterschiedliche Server geladen und
teste es auf zwei Tabs in einem Browserfenster. Die Einstellungen des
Browsers sind definitiv gleich.
Das lässt sich aus diesen Angaben aber nicht schließen. Zumindest die
Mozillen, aber auch andere Browser, können unterschiedliche
Einstellungen für Cookies pro Domain haben. Einmal "Deny cookies from
this server" angeklickt, und schon funktionieren die Cookies nicht mehr
...

Am sinnvollsten ist wirklich, du verwendest Wireshark (oder einen
anderen Sniffer) um zu sehen, was der Browser tatsächlich sendet.
Ein Blick in die Browser-Einstellungen schadet aber auch nicht.

hp
--
_ | Peter J. Holzer | Es ist ganz einfach ihn zu verstehen, wenn
|_|_) | Sysadmin WSR | man nur alle wichtigen Worte im Satz durch
| | | ***@hjp.at | andere ersetzt.
__/ | http://www.hjp.at/ | -- Nils Ketelsen in danr
Frank Seitz
2007-03-03 21:43:47 UTC
Permalink
Post by Thomas Müller
Naja, Cookies werden durch entsprechende Anweisungen im HTTP-Header, den
der Server zusammenbaut, durch den Klient gesetzt. Völlig unbeteiligt
ist der Server also nicht.
Der Server setzt keine Cookies, sprich Set-Cookie-Header.
Das macht das CGI-Skript.
Post by Thomas Müller
Ich habe dasselbe Skript auf zwei unterschiedliche Server geladen und
teste es auf zwei Tabs in einem Browserfenster. Die Einstellungen des
Browsers sind definitiv gleich. Durch das PHP-Skript wird durch beide
Server ein entsprechendes Cookie gesetzt, das habe ich überprüft.
Hast Du auch überprüft, dass der Browser den Cookie
in beiden Fällen annimmt?
Post by Thomas Müller
Das Perlskript kann aber eben nur auf dem einen Server den Wert mit dem
bekannten Skript auslesen, auf dem andren ist $cookievalue nach wie vor
leer.
Dann schickt der Browser in einem Fall den Cookie nicht an
Dein Perl-Skript.
Post by Thomas Müller
Daher vermute ich, dass dem Server noch irgendwas fehlt. Leider habe ich
keine Ahnung, was das sein könnte oder in welcher Richtung ich suchen soll.
Wie sieht der Aufruf aus, mit dem Du den Cookie setzt?

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Loading...