cookie einlesen vom server -> re test script von selfhtml
Alain
- perl
Hallo,
ich hab eine frage re cookie script von selhtml,welches ich noch
etwas geändert habe.
Ich möchte mit dem script cookie wert(eindeutig) setzten beim client,wie kann ich jetzt abfragen,ob der wert beim client vorhanden ist bzw.
den wert falls vorhanden nicht mehr ändern,und dann mit diesem wert
eine datei(dessen wert->dateiname das cookie selbst ist) öffnen,welches den client angeblich eindeutig identifiziert?
Unten das script:
#!/usr/bin/perl -w
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);
use strict;
my $neuCookie;
my $agent = $ENV{'HTTP_USER_AGENT'};
my $cookie = "$agent";
$cookie =~ s/[^1-9]|4//g;
my $altCookie = $cgi->cookie(-name=>'VideoShop')||'unbekannt';
my $neuCookie = $cgi->cookie(-name=>'VideoShop',-value=>$cookie,-path=>'/');
print $cgi->header(-cookie=>$neuCookie),
$cgi->start_html("Cookie-Test"),
$cgi->p("<b>Ihr letzter Besuchszeitpunkt dieser Seite war</b>: ", $altCookie),
$cgi->p("<b>Als neuer Besuchszeitpunkt wurde gespeichert</b>: ", $cookie),
$cgi->end_html();
Grüsse
Alain
Hallo,
Ich würde dir empfehlen dir das Modul CGI::Cookie anzusehen. Damit kannst du Cookies auf einfachste Weise schreiben, auslesen, ändern,..etc.
Markus.
Hallo,
Ich würde dir empfehlen dir das Modul CGI::Cookie anzusehen. Damit kannst du Cookies auf einfachste Weise schreiben, auslesen, ändern,..etc.
Besten dank,das wars was ich suchte.
Grüsse
Alain
Ich möchte mit dem script cookie wert(eindeutig) setzten beim client,wie kann ich jetzt abfragen,ob der wert beim client vorhanden ist bzw.
den wert falls vorhanden nicht mehr ändern,und dann mit diesem wert
eine datei(dessen wert->dateiname das cookie selbst ist) öffnen,welches den client angeblich eindeutig identifiziert?
Das m achst du doch bereits?
my $altCookie = $cgi->cookie(-name=>'VideoShop')||'unbekannt';
my $neuCookie = $cgi->cookie(-name=>'VideoShop',-value=>$cookie,-path=>'/');
mit cookie() kannst du einen Cookie setzen und lesen. Es besteht keine Notwendigkeit noch ein Modul zu laden.
Struppi.
hi Struppi,
» »» eine datei(dessen wert->dateiname das cookie selbst ist) öffnen,welches den client angeblich eindeutig identifiziert?
Das m achst du doch bereits?
my $altCookie = $cgi->cookie(-name=>'VideoShop')||'unbekannt';
my $neuCookie = $cgi->cookie(-name=>'VideoShop',-value=>$cookie,-path=>'/');mit cookie() kannst du einen Cookie setzen und lesen. Es besteht keine Notwendigkeit noch ein Modul zu laden.
Also dann gehts auch ohne use CGI::Cookie?
use CGI::Cookie;
my $cooks = $ENV{'UNIQUE_ID'};
my $cookie = new CGI::Cookie(-name=>"VideoShop", -value=>"$cooks", -path=>"/")||'';
my $cgi = new CGI;
print $cgi->header(-cookie=>$cookie);
Also so wie es läuft,läuft es,der besucher kriegt ein cookie auf meiner begrüssungsseite und wenn er auf meine shopseite kommt wird durch das erstellte cookie eine datei erzeugt,sofern er cookie aktiviert hatte,ansonsten mit seiner IP-useragent-das geht :)
Mich wunderts allerdings warum ich den durchblick mit cookies doch etwas verloren habe,unter anderem weil im net soviel wirres steht darüber.Meine frage diesbezüglich ist,wie kann man ein cookie einrichten,sodass man den user nächstesmal wieder erkennt und zum Bsp. auf der login seite die daten automatisch ins login feld einfügt,mit seinem cookie,welches er von meiner seite gekriegt hat?
Hab jetzt einiges versucht,aber das krieg ich nicht hin.Muss man da auch eine log sozusagen auswerten bzw. erstellen für cookies,auf dem server,um den client zu erkennen?Seine daten im cookie einlesen und aufs formular übertragen,geht das überhaubt?welche variablen braucht man da?
so:
use CGI::Cookie;
#my $altcookie = getcookie();
#my $id = $ENV{'HTTP_COOKIE'}||'';
my $cooks = $ENV{'UNIQUE_ID'};
$cooks = login();
my $altcookie = $cgi->cookie(-name=>'TLogin')||'unbekannt';
my $cookie = $cgi->cookie(-name=>'TLogin',
-value=>'$cooks',
-expires=>'+2d',
-path=>'/');
my $query = new CGI;
print $query->header(-cookie=>$cookie),
$cgi->start_html("Login-Cookie"),
$cgi->p("<b>Ihr letzter Besuchszeitpunkt dieser Seite war</b>: ", $altcookie),
$cgi->p("<b>Als neuer Besuchszeitpunkt wurde gespeichert</b>: ", $cookie),
$cgi->end_html();
sub login
{
my $username = CGI::param('username')||'';
my $password = CGI::param('password')||'';
my $cgi = new CGI;
$cooks = $cgi->cookie(cooks => $cooks, username => $username, password => $password);
return $cooks;
}
so gehts nicht :(
Gruss
Alain
Also dann gehts auch ohne use CGI::Cookie?
Ja!
Hab jetzt einiges versucht,aber das krieg ich nicht hin.Muss man da auch eine log sozusagen auswerten bzw. erstellen für cookies,auf dem server,um den client zu erkennen?Seine daten im cookie einlesen und aufs formular übertragen,geht das überhaubt?welche variablen braucht man da?
so:
Lieber Alain,
wir stehen ja schon länger im Diskurs, du legst aber immer wieder eine lernunwilligkeit an den Tag, die wirklich erschreckend ist. Ich hab dein Skript kopiert und erstmal 'use strict' eingebaut. Dann bekam ich ein paar sehr nützliche Fehlermeldung, d.h. das Skript läuft so nicht. Das liegt aber wieder mal an solch Grundlegenden Dingen, das es mich mittlerweile wirklich wundert ob du überhaupt verstehst, was ich (und andere) dir versuchen zu erklären.
Ich verusch es mal im einzelnen:
use CGI::Cookie;
wo ist use strict? Wo bindest du CGI ein?
my $cooks = $ENV{'UNIQUE_ID'};
Gibt es diesen Wert? (Bei mir nicht)
$cooks = login();
Warum weist du $cooks einen Wert zu, um in danch wieder zu überschreiben, würde nicht:
my $cooks = login();
ausreichen?
Die näächste Frage, die weiter unten geklärt wird, was für einen Wert hat $cooks?
my $altcookie = $cgi->cookie(-name=>'TLogin')||'unbekannt';
Was ist $cgi? Wo hast du das definert?
my $cookie = $cgi->cookie(-name=>'TLogin',
-value=>'$cooks',
-expires=>'+2d',
-path=>'/');
Du kennst den Unterschied zwischen einfachen und doppelten Anführungszeichen?
Und selbst wenn nicht, warum steht $cooks in Anführungszeichen?
Und nochmal, was für einen Wert hat $cooks?
my $query = new CGI;
print $query->header(-cookie=>$cookie),
$cgi->start_html("Login-Cookie"),
$query? $cgi? Was den jetzt?
$cgi->p("<b>Ihr letzter Besuchszeitpunkt dieser Seite war</b>: ", $altcookie),
Hier musst du aufpassen, das Komma trennt eine Liste von Elementen. Es kann sein, dass CGI::p diese zusamenführt, aber unter Umständen erwartet p mehrere Parameter und dann passiert nicht das was du willst. Du solltest hier lieber den Punkt verwenden.
sub login
{
my $username = CGI::param('username')||'';
my $password = CGI::param('password')||'';
my $cgi = new CGI;
Wieso erzeugst du hier ein Objet CGI? In der Regel (ich selber hab noch nie einen anderen Fall erlebt) reicht ein CGI Objekt für die komplette Anwendung.
$cooks = $cgi->cookie(cooks => $cooks, username => $username, password => $password);
return $cooks;
}
Aha, Die Funktion login() gibt was zurück? Ein Cookie!
Wobei der Parameter cooks nicht existiert.
und weiter oben übergibst du das Cookie als Wert in eine Cookie (bzw. du willst es tust es aber nciht weil du einfache Anführungszeichen verwendest).
Ein Cookie ist ein Objekt, das zum erzeugen des Strings, der im Header ausgegeben werden muss, dient.
CGI::header( -cookie => CGI::cookie() );
für CGI::cookie kanst du natürlich auch eine Variabel nehmen, in deinem Fall den Rückgabewert der Funktion login()
CGI::header( -cookie => $cooks );
so gehts nicht :(
Da sind soviele Fehler drin, es ist wirklich erschreckend. Ich vermute du fängst erst an zu programmieren und dann leist du, wenn überhaupt, die Dokumentation der von dir verwendeten Module?
Das CGI Modul ist sehr mächtig und nützlich (ich weiß das habe ich dir schon gesagt) und deshalb ist die Dokumentation auch sehr umfangreich, aber im grossen und ganzen steht alles drin was man Wissen muss. Und ich rate dir sie zu lesen, bevor du weitermachst. Du fährst mit deinem Shop so gegen die Wand und wirst am Ende nichts rauskriegen was dir oder jemand anders Freude breitet, evtl. willst du lieber osCommerce verwenden, ein fertiges, kostenloses Programm, das viel mehr kannst, als du jemals zusammenkriegen wirst.
Ich weiß nicht 100% was dein Skript machen sollte. aber hier ist eine Version, die läuft.
use strict;
use CGI;
my $cgi = new CGI;
my $cookies = login();
my $altcookie = $cgi->cookie(-name=>'TLogin')||'unbekannt';
my $name = $cgi->cookie(-name=>'name') || 'unbekannt';
my $pwd = $cgi->cookie(-name=>'password') || 'unbekannt';
my $now = time;
push @$cookies, $cgi->cookie(-name=>'TLogin',
-value=> $now,
-expires=>'+2d',
-path=>'/');
print $cgi->header(-cookie=> $cookies),
$cgi->start_html("Login-Cookie"),
$cgi->p($cgi->b('Ihr letzter Besuchszeitpunkt dieser Seite war: ') . $altcookie ),
$cgi->p($cgi->b('Als neuer Besuchszeitpunkt wurde gespeichert: '). $now ),
$cgi->p($cgi->b('"Name / Passwort: ') . $name .'/'. $pwd ),
$cgi->end_html();
sub login
{
my $username = CGI::param('username')||'';
my $password = CGI::param('password')||'';
return [ $cgi->cookie( -name => 'name', -value => $username) ,
$cgi->cookie( -name => 'password', -value => $password) ];
}
Struppi.
hallo Struppi :),
Also dann gehts auch ohne use CGI::Cookie?
Ja!
werd ich versuchen,war ja relativ,wenn mans genau nimmt einfach im vergleich zu dem,was mir vorschwebt re cookie ,aber wie ich schon gelesen habe soll cookie sehr unbeliebt sein und zudem unsicher.
http://www.perlunity.de/perl/manual/sessionmanagement_page1.shtml
Werde aber trotzdem damit weiter arbeiten,da ich ja noch andere methoden zur verfügung hätte wie z.B. IP/useragent(jaja,ich weiss unsicher:)).
so:
Lieber Alain,
wir stehen ja schon länger im Diskurs,
das stimmt,
müsste mal einen ausgeben demnächst :)
»»du legst aber immer wieder eine lernunwilligkeit an den Tag, die wirklich erschreckend ist.
wie mans nimmt ;-)
»»Ich hab dein Skript kopiert und erstmal 'use strict' eingebaut. Dann bekam ich ein paar sehr nützliche Fehlermeldung, d.h. das Skript läuft so nicht. Das liegt aber wieder mal an solch Grundlegenden Dingen, das es mich mittlerweile wirklich wundert ob du überhaupt verstehst, was ich (und andere) dir versuchen zu erklären.
ich geb mir ja Mühe,abgesehn davon,dass mir das unmengen zeit kostet und mir den schlaf raubt(den ich mal wieder besuchen sollte),wird diese Mühe manchmal auch belohnt mit kleinen erfolge,die süchtig machen können :)
Ich verusch es mal im einzelnen:
use CGI::Cookie;
wo ist use strict? Wo bindest du CGI ein?
ich ahnte ja nicht,dass Du es probieren wolltest,denn sonst hätte ich den rest des scriptes auch eingefügt.Bei mir stand auch
#!/usr/bin/perl -w
use CGI;
use strict;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);
...und es lief,jedoch nicht korrekt.
my $cooks = $ENV{'UNIQUE_ID'};
Gibt es diesen Wert? (Bei mir nicht)
das ist eine zufällig erzeugte zahl(und buchstaben vermutlich MD5 generiert) vom apache server,ich denke die ist mit einer session id zu vergleichen ,jedoch sicherer,da verschlüsselt(nehm ich an).
$cooks = login();
Warum weist du $cooks einen Wert zu, um in danch wieder zu überschreiben, würde nicht:
my $cooks = login();
ausreichen?Die näächste Frage, die weiter unten geklärt wird, was für einen Wert hat $cooks?
my $altcookie = $cgi->cookie(-name=>'TLogin')||'unbekannt';
Was ist $cgi? Wo hast du das definert?
siehe oben
my $cookie = $cgi->cookie(-name=>'TLogin',
-value=>'$cooks',
-expires=>'+2d',
-path=>'/');Du kennst den Unterschied zwischen einfachen und doppelten Anführungszeichen?
ja,doppelt bedeutet,"so wie es dasteht" oder so...
Und selbst wenn nicht, warum steht $cooks in Anführungszeichen?
ist doch ein wert (value)
Und nochmal, was für einen Wert hat $cooks?
eben eine (vermutlich) md5 generierte zahl $ENV{'UNIQUE_ID'}
z.B. "IaF9fX8AAAEAAFkN60YAAAAH" beim zweiten abruf
"K7A8E38AAAEAAFnQUCkAAAAD" dritten...
eine erklärung gibts http://www.perlunity.de/perl/forum/thread_006014.shtml
darüber.
my $query = new CGI;
print $query->header(-cookie=>$cookie),
$cgi->start_html("Login-Cookie"),$query? $cgi? Was den jetzt?
ja diesen query wollte ich von wo kopieren wo ich ein beispiel
gelesen hatte...aber da fehlte noch was anscheinend.Sollte glaub ich alle namen(und values?) übergeben.
$cgi->p("<b>Ihr letzter Besuchszeitpunkt dieser Seite war</b>: ", $altcookie),
Hier musst du aufpassen, das Komma trennt eine Liste von Elementen. Es kann sein, dass CGI::p diese zusamenführt, aber unter Umständen erwartet p mehrere Parameter und dann passiert nicht das was du willst. Du solltest hier lieber den Punkt verwenden.
ok.
sub login
{
my $username = CGI::param('username')||'';
my $password = CGI::param('password')||'';
my $cgi = new CGI;Wieso erzeugst du hier ein Objet CGI? In der Regel (ich selber hab noch nie einen anderen Fall erlebt) reicht ein CGI Objekt für die komplette Anwendung.
aha ok.
$cooks = $cgi->cookie(cooks => $cooks, username => $username, password => $password);
return $cooks;
}Aha, Die Funktion login() gibt was zurück? Ein Cookie!
Wobei der Parameter cooks nicht existiert.
doch!
und weiter oben übergibst du das Cookie als Wert in eine Cookie (bzw. du willst es tust es aber nciht weil du einfache Anführungszeichen verwendest).
meinst Du das value?
Ein Cookie ist ein Objekt, das zum erzeugen des Strings, der im Header ausgegeben werden muss, dient.
CGI::header( -cookie => CGI::cookie() );
für CGI::cookie kanst du natürlich auch eine Variabel nehmen, in deinem Fall den Rückgabewert der Funktion login()
CGI::header( -cookie => $cooks );
Da sind soviele Fehler drin, es ist wirklich erschreckend. Ich vermute du fängst erst an zu programmieren und dann leist du, wenn überhaupt, die Dokumentation der von dir verwendeten Module?
Das CGI Modul ist sehr mächtig und nützlich (ich weiß das habe ich dir schon gesagt) und deshalb ist die Dokumentation auch sehr umfangreich, aber im grossen und ganzen steht alles drin was man Wissen muss. Und ich rate dir sie zu lesen, bevor du weitermachst. Du fährst mit deinem Shop so gegen die Wand und wirst am Ende nichts rauskriegen was dir oder jemand anders Freude breitet, evtl. willst du lieber osCommerce verwenden, ein fertiges, kostenloses Programm, das viel mehr kannst, als du jemals zusammenkriegen wirst.
so wenig vertrauen?Mein shop läuft (jetzt) perfekt,das hier ist ein anderes problem was mit meinem shop nichts zu tun hat,so nebenbei.Eher ein script für luxus :)
Ich weiß nicht 100% was dein Skript machen sollte. aber hier ist eine Version, die läuft.
das script soll daten in ein login.cgi(wo Du mir auch schon geholfen hast damals) script für den memberbereich einfügen,falls cookie aktiviert beim anwender und der sich einmal mit erfolg eingeloggt hat.das cookiescript.cgi wird auf der htmlseite eingebunden wo sich das loginformular befindet,welches dann auf login.cgi zielt.
Hab mir auch schon überlegt das cookie modul gleich ins login.cgi einzubinden,weiss aber nicht obs geht.
use strict;
use CGI;
my $cgi = new CGI;my $cookies = login();
my $altcookie = $cgi->cookie(-name=>'TLogin')||'unbekannt';
my $name = $cgi->cookie(-name=>'name') || 'unbekannt';
my $pwd = $cgi->cookie(-name=>'password') || 'unbekannt';
my $now = time;push @$cookies, $cgi->cookie(-name=>'TLogin',
-value=> $now,
-expires=>'+2d',
-path=>'/');print $cgi->header(-cookie=> $cookies),
$cgi->start_html("Login-Cookie"),
$cgi->p($cgi->b('Ihr letzter Besuchszeitpunkt dieser Seite war: ') . $altcookie ),
$cgi->p($cgi->b('Als neuer Besuchszeitpunkt wurde gespeichert: '). $now ),
$cgi->p($cgi->b('"Name / Passwort: ') . $name .'/'. $pwd ),
$cgi->end_html();sub login
{
my $username = CGI::param('username')||'';
my $password = CGI::param('password')||'';
return [ $cgi->cookie( -name => 'name', -value => $username) ,
$cgi->cookie( -name => 'password', -value => $password) ];
}
werd ich mir gleich mal anschauen,muss aber jetzt schnell wech...komm aber wieder :)
Grüsse
Alain
Hallo Alain
werd ich versuchen,war ja relativ,wenn mans genau nimmt einfach im vergleich zu dem,was mir vorschwebt re cookie ,aber wie ich schon gelesen habe soll cookie sehr unbeliebt sein und zudem unsicher.
http://www.perlunity.de/perl/manual/sessionmanagement_page1.shtml
Erhlich, ich habe mir bisher auch selber was zusammengebastelt. Was aber im extrem Fall auch nicht 100% Funktioniert (Unique ID in einer DB)
wir stehen ja schon länger im Diskurs,
das stimmt,
müsste mal einen ausgeben demnächst :)
Oh, da rennst du offene Wände bei mir ein ;-)
»»du legst aber immer wieder eine lernunwilligkeit an den Tag, die wirklich erschreckend ist.
wie mans nimmt ;-)
Ich weiß klang ein bisschen krass, aber es kommen halt leider immer wieder fehler, wo ich mich Frage wieso du das jetzt immer noch nicht kapiert hast.
»»Ich hab dein Skript kopiert und erstmal 'use strict' eingebaut. Dann bekam ich ein paar sehr nützliche Fehlermeldung, d.h. das Skript läuft so nicht. Das liegt aber wieder mal an solch Grundlegenden Dingen, das es mich mittlerweile wirklich wundert ob du überhaupt verstehst, was ich (und andere) dir versuchen zu erklären.
ich geb mir ja Mühe,abgesehn davon,dass mir das unmengen zeit kostet und mir den schlaf raubt(den ich mal wieder besuchen sollte),wird diese Mühe manchmal auch belohnt mit kleinen erfolge,die süchtig machen können :)
Na, das ist auf jeden Fall ein Argument weiter zu machen, geht mir nicht anders.
ich ahnte ja nicht,dass Du es probieren wolltest,denn sonst hätte ich den rest des scriptes auch eingefügt.Bei mir stand auch
#!/usr/bin/perl -w
use CGI;
use strict;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);
...und es lief,jedoch nicht korrekt.
Als ich mein Post abschickte, dachte ich mir fast, das da einfach was fehlte. Aber selbst mit den Angaben, ich bekam direkt eine Fehlermeldung in der Konsole.
my $cooks = $ENV{'UNIQUE_ID'};
Gibt es diesen Wert? (Bei mir nicht)
das ist eine zufällig erzeugte zahl(und buchstaben vermutlich MD5 generiert) vom apache server,ich denke die ist mit einer session id zu vergleichen ,jedoch sicherer,da verschlüsselt(nehm ich an).
Ah, etwas gelernt, ich hab hier an der Stelle keinen Apache Server, aber das kann ja mal nützlich sein.
my $cookie = $cgi->cookie(-name=>'TLogin',
-value=>'$cooks',
-expires=>'+2d',
-path=>'/');Du kennst den Unterschied zwischen einfachen und doppelten Anführungszeichen?
ja,doppelt bedeutet,"so wie es dasteht" oder so...
In doppelten Anführungszeichen werden Variabeln interploiert, d.h. es wird der Inhalt angezeigt, in einfachen nicht. Test:
my $test = "Hallo!";
print "doppelt: $test\n";
print 'einfach: $test\n';
Und selbst wenn nicht, warum steht $cooks in Anführungszeichen?
ist doch ein wert (value)
Aber den bekommst du auch ohne Anführungszeichen.
Und nochmal, was für einen Wert hat $cooks?
eben eine (vermutlich) md5 generierte zahl $ENV{'UNIQUE_ID'}
z.B. "IaF9fX8AAAEAAFkN60YAAAAH" beim zweiten abruf
"K7A8E38AAAEAAFnQUCkAAAAD" dritten...
eine erklärung gibts http://www.perlunity.de/perl/forum/thread_006014.shtml
darüber.
Das ist ja schon und gut, stimmt aber nicht. Da du hier den Rückgabewert der Funktion login() zuweist.
$query? $cgi? Was den jetzt?
ja diesen query wollte ich von wo kopieren wo ich ein beispiel
gelesen hatte...aber da fehlte noch was anscheinend.Sollte glaub ich alle namen(und values?) übergeben.
Du brauchst wie weiter unten schon gesagt nur ein einziges CGI Objekt, das macht alles.
$cooks = $cgi->cookie(cooks => $cooks, username => $username, password => $password);
return $cooks;
}Aha, Die Funktion login() gibt was zurück? Ein Cookie!
Wobei der Parameter cooks nicht existiert.doch!
Nein, schau mal genau hin!
$cooks = $cgi->cookie(cooks => $cooks, ...
^^^^^^
Das existiert nicht. Die Funktion kennt keinen derartigen Parameter.
und weiter oben übergibst du das Cookie als Wert in eine Cookie (bzw. du willst es tust es aber nciht weil du einfache Anführungszeichen verwendest).
meinst Du das value?
Ja, weiter oben wolltest du den Rückgabewert der Funktion (also ein Cookie) als Wert fürt einen Cookie nehmen, das ist Unsinn
Ich weiß nicht 100% was dein Skript machen sollte. aber hier ist eine Version, die läuft.
das script soll daten in ein login.cgi(wo Du mir auch schon geholfen hast damals) script für den memberbereich einfügen,falls cookie aktiviert beim anwender und der sich einmal mit erfolg eingeloggt hat.das cookiescript.cgi wird auf der htmlseite eingebunden wo sich das loginformular befindet,welches dann auf login.cgi zielt.
Hab mir auch schon überlegt das cookie modul gleich ins login.cgi einzubinden,weiss aber nicht obs geht.
Wie gesagt, du brauchst in deinem CGI Skript nur ein einziges Mal das CGI Modul einzubinden und dann kannst du in allen anderen Modulen auf diese zugreifen. Aus dem Grunde bevorzuge ich mittlerweile die folgende Schreibweise:
use CGI;
print CGI::header(), CGI::start_html() ....
d.h. wenn du z.b. ein Skript hast, das 'login.cgi' heißt und das bindet das Modul 'cookie.pl' ein:
login.cgi:
use CGI;
require 'cookie.pl';
..... hier geht's weiter
Dann kannst du in cookie.pl auf CGI zugreifen, da es von der HAuptdatie eingebunden wurde:
cookie.pl:
my $cookie = CGI::cookie('test_cookie');
tu was damit....
Grundsätzlich solltest du dir mal genau angucken, wie man cookies definiert und wie man sie setzt. Vor allem meherere, dazu musst du der header Funktion eine referenz auf ein Array mit gegeben:
CGI::header( -cookie => [ $cookie1, $cookie2 ....] );
Wobei $cookie1, cookie2 jeweile ein cookie Objekt ist:
$cookie1 = CGI::cookie(-name => 'test1', -value => 'ich bin cookie 1");
$cookie2 = CGI::cookie(-name => 'test2', -value => 'ich bin cookie 2");
werd ich mir gleich mal anschauen,muss aber jetzt schnell wech...komm aber wieder :)
Ich hab's befürchtet ;-)
Struppi.
Hallo Struppi,
müsste mal einen ausgeben demnächst :)
Oh, da rennst du offene Wände bei mir ein ;-)
wo wohnst Du denn?
Sonst müsste ich Dir ein virtuelles ??? anbieten ;-)
Ich weiß klang ein bisschen krass, aber es kommen halt leider immer wieder fehler, wo ich mich Frage wieso du das jetzt immer noch nicht kapiert hast.
naja so krass auch wieder nicht,aber es stimmt,manchmal brauch ich etwas länger bis der groschen fällt.Perl ist kein neuland mehr für mich,aber die erklärungen sind manchmal komplizierter als das problem selbst bzw. die tatsachen.Ich denke vielleicht auch anders als andere,was für manchen logisch ist,ist für mich überhaubt nicht logisch zumindest nicht immer.
In doppelten Anführungszeichen werden Variabeln interploiert, d.h. es wird der Inhalt angezeigt, in einfachen nicht. Test:
my $test = "Hallo!";
print "doppelt: $test\n";
^^^^
hmmmm nicht "Hallo!"?
print 'einfach: $test\n';
Du brauchst wie weiter unten schon gesagt nur ein einziges CGI Objekt, das macht alles.
naja das hab ich jetzt verstanden.
Nein, schau mal genau hin!
$cooks = $cgi->cookie(cooks => $cooks, ...
^^^^^^
Das existiert nicht. Die Funktion kennt keinen derartigen Parameter.
alles klar.
Wie gesagt, du brauchst in deinem CGI Skript nur ein einziges Mal das CGI Modul einzubinden und dann kannst du in allen anderen Modulen auf diese zugreifen. Aus dem Grunde bevorzuge ich mittlerweile die folgende Schreibweise:
use CGI;
print CGI::header(), CGI::start_html() ....
sieht einfach aus :)
Dann kannst du in cookie.pl auf CGI zugreifen, da es von der HAuptdatie eingebunden wurde:
cookie.pl:
my $cookie = CGI::cookie('test_cookie');
tu was damit....
die frage stellt sich jetzt,was es denn tun soll bzw. wie?
Ich meine wenns denn laufen sollte wie es läuft,würde das
script dann bei wieder erkennung die daten ins formular von der html seite einfügen,welches nicht vom cookie.cgi generiert wurde mein ich.
Das Gookie wär in meinem fall lediglich in einer login.html seite eingebunden,aber ob das script dann die daten reinschreibt bezweifle ich,zumal bei mir gehts nicht.siehe unten->
Grundsätzlich solltest du dir mal genau angucken, wie man cookies definiert und wie man sie setzt. Vor allem meherere, dazu musst du der header Funktion eine referenz auf ein Array mit gegeben:
CGI::header( -cookie => [ $cookie1, $cookie2 ....] );
Wobei $cookie1, cookie2 jeweile ein cookie Objekt ist:
$cookie1 = CGI::cookie(-name => 'test1', -value => 'ich bin cookie 1");
$cookie2 = CGI::cookie(-name => 'test2', -value => 'ich bin cookie 2");
Ich habs mir jetzt wieder mal besser angeschaut das ganze und denke aber dass es das nicht bringt was ich versuche zu tun(oben bereits beschrieben)Ich habs mal so versucht:
#!/usr/bin/perl -w
use CGI;
use strict;
use CGI::Carp qw(fatalsToBrowser);
my $cgi = new CGI;
my $cookies = login();
my $altcookie = $cgi->cookie(-name=>'TLogin')||'unbekannt';
my $un = $cgi->cookie(-name=>'un') || 'unbekannt';
my $pwd = $cgi->cookie(-name=>'pwd') || 'unbekannt';
my $now = time();
push @$cookies, $cgi->cookie(-name=>'TLogin',
-value=> "$now",
-expires=>'+2d',
-path=>'/');
print $cgi->header(-cookie=> $cookies),
$cgi->start_html("Login-Cookie"),
$cgi->p($cgi->b('Ihr letzter Besuchszeitpunkt dieser Seite war: ') . $altcookie ),
$cgi->p($cgi->b('Als neuer Besuchszeitpunkt wurde gespeichert: '). $now ),
$cgi->p($cgi->b('"Name / Passwort: ') . $un .'/'. $pwd ),
$cgi->end_html();
sub login
{
my $username = "steven"||'';
my $password = "test"||'';
return [ $cgi->cookie(-name => 'un', -value => $username),
$cgi->cookie(-name => 'pwd', -value => $password) ];
}
es zeigt mir schon die daten an,aber wenn ich es in meinem html einbinde dann zeigt mir der browser an dass die gookies aktuakisiert werden aber es geht nichts,kein eintrag ins formular.
Oder hab ich da jetzt etwas total missverstanden?
Wäre das ganze übrigens auch mit einem cookie realisierbar,welches das macht was ich will? (Alle daten sammeln und ins formular einfügen,so dass der benutzer nur noch enter drücken muss,um sich beim nächsten mal einzuloggen).
z.B. so:
push @$cookies, $cgi->cookie(-name=>'TLogin',
-value=> "$now|$un|$pwd", -expires=>'+2d',-path=>'/');
print $cgi->header(-cookie=> $cookies);
so,wieder später geworden...mal früher schlafen geht.
Grüsse
Alain
es zeigt mir schon die daten an,aber wenn ich es in meinem html einbinde dann zeigt mir der browser an dass die gookies aktuakisiert werden aber es geht nichts,kein eintrag ins formular.
Da ist auch kein Formular. Irgendwie sehe ich das Problem nicht.
mit CGI::cookie(-name => ..., -value => ....) erzeugst du ein Cookie
mit CGI::header(-cookie => [ CGI::cookie(...), CGI::cookie(...)]) setzt du die Cookies
mt CGI::cookie(-name => ...) liest du ein Cookie
mit CGI::txtfield(-name => '...', -value => $wert) erzeugst du ein Formularfeld und setzt dabei den Wert.
Sollte doch eigentlich nicht so schwer sein.
Wäre das ganze übrigens auch mit einem cookie realisierbar,welches das macht was ich will? (Alle daten sammeln und ins formular einfügen,so dass der benutzer nur noch enter drücken muss,um sich beim nächsten mal einzuloggen).
du kannst auch mehrere cookies setzten
z.B. so:
push @$cookies, $cgi->cookie(-name=>'TLogin',
-value=> "$now|$un|$pwd", -expires=>'+2d',-path=>'/');
print $cgi->header(-cookie=> $cookies);
so setzt du die Cookies (je nachdem was $cookies ist, in dem Falle eine Arrayreferenz mit mehreren cookie Objekten)
Struppi.
Hi Struppi,
es zeigt mir schon die daten an,aber wenn ich es in meinem html einbinde dann zeigt mir der browser an dass die gookies aktuakisiert werden aber es geht nichts,kein eintrag ins formular.
Da ist auch kein Formular. Irgendwie sehe ich das Problem nicht.
was ist den das,
<html>
<body>
#hier wird das cookie erstmals aufgerufen
<form action="login.pl" method="POST">
<input type="username" name="username" size="15" maxlength="40">
<input type="password" name="password" size="15" maxlength="15">
<input type="submit" value="Login"><input type="reset" value="Reset"></form>
#beim nächsten mal sollte cookie die values werte eintragen,falls es
#den benutzer kennt
</body>
</html>
mit CGI::txtfield(-name => '...', -value => $wert) erzeugst du ein Formularfeld und setzt dabei den Wert.
geht das denn wenn ich ein cookie z.B.
als <img SRC="cgi-bin/cookie.cgi"> in meine html-datei einbinden würde?
Ich habe im login.pl script das cookie eingebunden und sogar nochmal mit den inputs,man sieht nun dort auch ein formular.Jedoch gibts kein eintrag ins value-feld.
Kannst es ja mal angucken
http://www.femdomfun.com/logintest.html
und Dir vom Browser das cookie anzeigen lassen.
password und username ist "test"
Sollte doch eigentlich nicht so schwer sein.
Wäre das ganze übrigens auch mit einem cookie realisierbar,welches das macht was ich will? (Alle daten sammeln und ins formular einfügen,so dass der benutzer nur noch enter drücken muss,um sich beim nächsten mal einzuloggen).
du kannst auch mehrere cookies setzten
z.B. so:
push @$cookies, $cgi->cookie(-name=>'TLogin',
-value=> "$now|$un|$pwd", -expires=>'+2d',-path=>'/');
print $cgi->header(-cookie=> $cookies);so setzt du die Cookies (je nachdem was $cookies ist, in dem Falle eine Arrayreferenz mit mehreren cookie Objekten)
also wie gehabt ich möchte einfach mit hilfe der cookies die values
im formular automatisch füllen lassen falls die werte bekannt sind.
Kann man den wert dess passwordes auch verschlüsseln im cookie oder geht das nur im klartext?
Ach,übrigens ich wusste gar nicht dass ich das CGI.pm modul bei mir auf dem rechner habe 8-/
Seit jahren hab ich das perl installiert und weiss nicht mal das ich die doku ja bei mir habe...man wird alt :)
Gruss
Alain
was ist den das,
<html>
<body>
#hier wird das cookie erstmals aufgerufen
<form action="login.pl" method="POST">
<input type="username" name="username" size="15" maxlength="40">
<input type="password" name="password" size="15" maxlength="15">
<input type="submit" value="Login"><input type="reset" value="Reset"></form>
#beim nächsten mal sollte cookie die values werte eintragen,falls es
#den benutzer kennt
</body>
</html>
Das ist HTML code.
also wie gehabt ich möchte einfach mit hilfe der cookies die values
im formular automatisch füllen lassen falls die werte bekannt sind.
Kann man den wert dess passwordes auch verschlüsseln im cookie oder geht das nur im klartext?
Das was du willst ist, in einer statitischen HMTL Seite ein Formular befüllen. Du kannst die Cookies mit Perl setzen und mit JS auslösen und dann das Formular füllen.
Struppi.
hi Struppi,
also wie gehabt ich möchte einfach mit hilfe der cookies die values
im formular automatisch füllen lassen falls die werte bekannt sind.
Das was du willst ist, in einer statitischen HMTL Seite ein Formular befüllen. Du kannst die Cookies mit Perl setzen und mit JS auslösen und dann das Formular füllen.
aha,das hab ich befürchtet,na dann weiss ich ja woran ich bin.
Eines wollte ich noch wissen,habs ja jetzt so ungefähr drauss,die sache mit cookies,aber eine frage noch,weisst Du warum das cookie
sich leert bzw. den wert vom value verliert,wenn ich wieder nächstes
mal auf die seite geh?
Sollte doch 2 tage gültig sein?!
Das ist mein code vom login script:
cookies();
sub cookies
{
my $cgi = new CGI;
my $c1 = $cgi->cookie(-name=>'TLogin')||'unbekannt';
my $now = time();
my $u = "$username"||'';#schon definiert
my $p = "$password"||'';
$c1 = $cgi->cookie(-name=>'TLogin',
-value=> "$now|$u|$p",
-expires=>'+2d',
-path=>'/');
#warum verliert es den wert der values $u|$p auf der normalen seite?
#sollte doch nicht sein?
$c2 = $cgi->cookie( -name => 'un', -value => $u,
-expires=>'+2d',
-path=>'/');
$c3 = $cgi->cookie( -name => 'pw', -value => $p,
-expires=>'+2d',
-path=>'/');
my $query = new CGI;
print $query->header(-cookie=> $c1);
#print $cgi->header(-cookie=> [ $c1, $c2, $c3 ]);#test
#print $cgi->header(-cookie=> $c1);#test
#print $query->header(-cookie=> [ $c1, $c2, $c3 ]);#test
}
Gruss
Alain
Das ist mein code vom login script:
cookies();
sub cookies
{
my $cgi = new CGI;
my $c1 = $cgi->cookie(-name=>'TLogin')||'unbekannt';
my $now = time();
my $u = "$username"||'';#schon definiert
my $p = "$password"||'';
Du musst Werte nicht in Anführungszeichen schreiben.
$username und $password sind definiert?
$c1 = $cgi->cookie(-name=>'TLogin',
-value=> "$now|$u|$p",
-expires=>'+2d',
-path=>'/');#warum verliert es den wert der values $u|$p auf der normalen seite?
#sollte doch nicht sein?
wenn diese auf der gleichen Domain liegen nicht.
$c2 = $cgi->cookie( -name => 'un', -value => $u,
-expires=>'+2d',
-path=>'/');$c3 = $cgi->cookie( -name => 'pw', -value => $p,
-expires=>'+2d',
-path=>'/');
hat $u und $p auch wirklcih immer einen wert?
my $query = new CGI;
print $query->header(-cookie=> $c1);
So wird nur ein Cookie gesetzt.
#print $cgi->header(-cookie=> [ $c1, $c2, $c3 ]);#test
So werden alle drei gesetzt.
Struppi.
hi Struppi,,
Das ist mein code vom login script:
cookies();
sub cookies
{
my $cgi = new CGI;
my $c1 = $cgi->cookie(-name=>'TLogin')||'unbekannt';
my $now = time();
my $u = "$username"||'';#schon definiert
my $p = "$password"||'';Du musst Werte nicht in Anführungszeichen schreiben.
$username und $password sind definiert?
achso?!Ja der wert von $u un $p ist ausserhalb der sub definiert mit
my $username = CGI::param('username')||'unbekannt';
my $password = CGI::param('password')||'unbekannt';
und bekommt diese vom login-formular.html geschickt.
Diese sub ist im login.pl
Das andere cookie script hat dieselbigen eingaben und ist
auf der login.html seite eingebunden-liegt auf derselben domain.
Jedoch fehlen da die werte von $u und $p ich dachte mir so,wenn
ich einmal den wert habe vom cookieNr.2(erfolreich eingeloggt im login.pl)und später wieder auf die login.html seite komme,hol ich mir die werte vom cookie.Nr1,welches urspünglich die ersten werte gelesen und gesetzt hat.
$c1 = $cgi->cookie(-name=>'TLogin',
-value=> "$now|$u|$p",
-expires=>'+2d',
-path=>'/');#warum verliert es den wert der values $u|$p auf der normalen seite?
#sollte doch nicht sein?wenn diese auf der gleichen Domain liegen nicht.
hat $u und $p auch wirklcih immer einen wert?
nö nicht immer,jedenfalls nicht auf der login.html seite
my $query = new CGI;
print $cgi->header(-cookie=> $c1);So wird nur ein Cookie gesetzt.
also im prinzip möchte ich ja nur die werte $u und $p speichern,die aber fehlen beim ersten aufruf der seite,beim erfolgreichen login,werden sie wieder vom login.pl geprüft und die werte gesetzt.Wenn ich aber wieder komm auf die erste seite,sind die werte weg :(,das cookie ist aber noch da.
Hier der code vom ersten cookie:
#!/usr/bin/perl -w
use CGI;
use strict;
use CGI::Carp qw(fatalsToBrowser);
my $cgi = new CGI;
my $oldcookie = $cgi->cookie(-name=>'TLogin')||'';#erstmal lesen
if (!$oldcookie) #wenn kein oldcookie
{
my $now = time();
my $u = CGI::param('username')||'unbekannt';
my $p = CGI::param('password')||'unbekannt';#wert verm. unbekannt
my $c1 = $cgi->cookie(-name=>'TLogin',
-value=> "$now|$u|$p", #-value=> '$now|$u|$p'...so besser?
-expires=>'+2d',
-path=>'/');#cookie wird erstellt
print $cgi->header(-cookie=> $c1);#schicke alle werte in 1 cookie
}
else
{
return 0; #tue nix
}
Gruss
Alain
Hallo nochma,
jetzt gehts yupieeeeeee ;-)
hatte ständig den header error...wegen dem else zweig,der falsch war.
Musste den cgi path noch ändern im login.pl und jetzt klappts.
Naja jetzt muss ich mich wohl noch mit javascript beschäftigen :)
keine ahnung aber ich hoffe ich kriegs noch dieses jahr gebacken
hab ja auch noch anderes zu tun ;-)
jedenfalls danke für die geduldige hilfe :)
Bis z.n.?
Grüsse
Alain