Frey: cookie?

Hi.

Stehe vor folgendem Problem: ich moechte ein Cookie setzen perl/cgi aber das soll erst dann gesetzt werden, wenn mehrere Bedingungen erfuellt werden und das ist so ziemlich mitten im Text sprich: ich kann den cookie mit dem Header setzen aber ich weiss nicht wie ich es mache das es erst MITTEN im text bze. skript gesetzt wird?

wie mach ich das am besten? ich sag schonmal danke.

gruezi frey.

ps.: und ja ich habe die sufu benutzt und ja ich habe cpan gelesen und ja ich habe google benutzt und ja ich habe auch selfhtml/perl gelesen und nein ich finde nichts vielleicht bin ich aber auch nur zu bloed?

  1. Hi,

    ich kann den cookie mit dem Header setzen aber ich weiss nicht wie ich es mache das es erst MITTEN im text bze. skript gesetzt wird?

    mitten im Text ist unmöglich, da der Header dann bereits abgeschlossen ist. Mitten im Script ist nicht das geringste Problem, da Dich niemand zwingt, vorher schon irgendwelche Ausgaben durchzuführen.

    wie mach ich das am besten?

    In der richtigen Reihenfolge.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Grüße,

      mitten im Text ist unmöglich,

      JS kann cookie zur laufzeit setzen - man müsste also einfahc nur JS ausgeben, der cookies etzt^^ aber ich gebe zu - das ist so elegant wie mandeln durch den arsch zu entfernen...
      MFG
      bleicher

      1. Hi.

        Danke fuer die Antworten aber ich kanns nicht so ganz glauben ;=)

        Nehmen wir einmal ein ganz simples beispiel: bei verschiedenen email-anbietern wird erst nachdem man sich eingeloggt hat (in seinen email acount) ein cookie verschickt und so etwas in der art moechte ich auch machen. Erst wenn man sich einloggt soll ein cookie verschickt werden aber wie mach ich dass dann wenn man es nur zu skript anfang bzw. skript aufruf schicken kann?

        Der tipp mit der richtige reihenfolge ist in dem fall unsinn sorry.

        gruezi frey.

        1. Danke fuer die Antworten aber ich kanns nicht so ganz glauben ;=)

          Ist aber so.

          Der tipp mit der richtige reihenfolge ist in dem fall unsinn sorry.

          Nein, das was du schilderst hat ja nichts damit zu tun. Ein cookie kann serverseitig nur im header gesetzt werden. Aber natürlich nachträglich, wie auch schon geschildert, mit JS jederzeit.

          Struppi.

          1. Hi.

            wow danke fuer die rasche antwort!

            Aber JS ist ja wirklich keine gute idee um ein cookie zu verschicken find ich. Man kann JS ja ganz einfach Ausschalten und das wars dann :=(

            Mit welchen skriptsprachen sollte es denn noch so gehen? ausser php falls es da gehen sollte? ;=)

            danke
            gruezi frey.

            1. Mit welchen skriptsprachen sollte es denn noch so gehen? ausser php falls es da gehen sollte? ;=)

              Keine Ahnung ob es dir schon gesagt wurde, aber ein Cookie kann Serverseitig nur Header gesetzt werden. In jeder Sprache.

              Struppi.

              1. HI.

                es wurde doch gerade gesagt mit JS geht es?

                aber ganz egal mit was es geht meine frage ist jetzt WIE kann ich ein cookie setzen dass es erst beim einloggen gesetzt wird???
                und es MUSS ja irgendwie gehen? NUr wie???

                gruezi frey

                1. und es MUSS ja irgendwie gehen? NUr wie???

                  Es geht. Voraussetzung ist, dass du vor der Prüfung, ob der User sich erfolgreich verifiziert hat, kein HTML ausgibst, damit du noch einen Header schicken kannst.

                  Es ist relativ normal, das man alle Outputs zurück hält bis alle Kriterien vorhanden sind, wie der Server-Response Header (und auch z.B. die HTML Header) auszusehen haben.

                  Eine genauere Antwort ist leider nicht möglich, weil wir die Architektur deines Skriptes nicht kennen.

                  mfg Beat

                  --
                  Woran ich arbeite:
                  X-Torah
                     <°)))o><                      ><o(((°>o
                  1. Hi.

                    bin jetzt auf ne gute loesung gekommen ;=)
                    Habe aber zwei fragen vorallem die erste ist wichtig:

                    Wie bekomm ich eine Variable in ein anderes program? also schwer zu erklaeren ;=)

                    dateiA sieht so aus:

                    use CGI;  
                    my $cgi = new CGI;  
                      
                    $user = $cgi->param("user");  
                      
                    print "<form action=dateia.cgi>";  
                    print "<input type=text name=user>";  
                    print "<input type=submit value=login>";  
                    print "</form>";  
                      
                    print "$user";
                    

                    Also es wird ganz einfach nach dem Usernamen gefragt aber es sollte auf der dateiA angezeigt werden aber zugleich soll auch irgendwie $user (die eingabe) in eine dateiB geschrieben werden (dateiB ist eine cgi datei die unter anderem das Cookie verschickt).

                    Kurz: die eingabe $user soll gleichzeitig in dateiA UND in dateiB existieren.

                    wie schaff ich das?

                    und die zweite frage: wie kann ich bewusst ein Cookie wieder Loeschen?? also ohne expires +5m sondern egal ob expires +10d (10 Tage gueltigkeit) hat wie kann ich es loeschen wenn es erst 1d (1 tag alt) ist??

                    Danke fuer euere Aufmerksamkeit hehe

                    gruezi Frey

                    1. bin jetzt auf ne gute loesung gekommen ;=)

                      Mit Javscript?

                      Wie bekomm ich eine Variable in ein anderes program? also schwer zu erklaeren ;=)

                      Gar nicht, du kannst - immer in der Annahme du redest von einem CGI Skript - nur per POST oder GET Werte übergeben und diese mit CGI::param() abrufen, wie du es bereits getan hast.

                      und die zweite frage: wie kann ich bewusst ein Cookie wieder Loeschen?? also ohne expires +5m sondern egal ob expires +10d (10 Tage gueltigkeit) hat wie kann ich es loeschen wenn es erst 1d (1 tag alt) ist??

                      In dem du das Ablaufdatum auf null setzt.

                      Struppi.

                      1. Hi.

                        Also das mit dem cookie loeschen hab ich probiert und es klappt danke.

                        Das mit der momentanen loesung die ich hatte geht auf dauer nicht gut ich hab es so gemacht: Der User gibt seine daten ein und kommt auf eine neue seite dort wird das cookie nach einer pruefung verschickt und wird auf die naechste Seite geleitet. Aber das programm spinnt manchmal ;=).

                        Mit einer sub oder sowas geht es nicht weil ich kann ja nur ein cookie schicken zu anfang des skripts. Ihr habt gesagt ich muss es in der richtigen reihenfolge machen beziehungsw. es geht nur bevor ich einen htmlcode sende aber das geht doch nicht?? Der User sollte ja als erstes seine angaben machen und dann wird oder soll erst das cookie verschickt werden aber logischerweise MUSS ich ja ZUERST ein Text ausgeben.
                        In das Cookie sollen ja vorallem die daten kommen die der user bei dem einloggformular eingibt.

                        Koennt ihr mir vielleicht noch sagen wie ich das am besten mache? Ich kann mir leider nicht nur im geringsten vorstellen wie ich das machen sollte bin noch nicht so gut in perl wie ihr bestimmt schon mitbekommen habt ;=)

                        gruezi der verzweifelte frey

                        1. Das mit der momentanen loesung die ich hatte geht auf dauer nicht gut ich hab es so gemacht: Der User gibt seine daten ein und kommt auf eine neue seite dort wird das cookie nach einer pruefung verschickt und wird auf die naechste Seite geleitet. Aber das programm spinnt manchmal ;=).

                          Seien wir uns klar. Du arbeitest mit Perl. Er kommt nie auf eine neue Seite. Sondern du gibst immer mit dem gleichen Script den zum Kontext und zur Berechtigung passenden Output.

                          Mit einer sub oder sowas geht es nicht weil ich kann ja nur ein cookie schicken zu anfang des skripts.

                          Nein. Du kannst es schicken, solange du die header Sektion noch nicht abgeschlossen hast durch ein "\n\n". Ein Server response besteht aus header und body. Alles nach dem \n\n ist body der Server Message.

                          Falls du gesehen hast, dass man über print sendet:

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

                          So versteckt sich hier der letzte Eintrag eines headers.

                          Das CGI Modul ist zwar bequem, verschleiert aber die kanonische Form eines Server Responses vor dem Autor.

                          Ihr habt gesagt ich muss es in der richtigen reihenfolge machen beziehungsw. es geht nur bevor ich einen htmlcode sende aber das geht doch nicht?? Der User sollte ja als erstes seine angaben machen und dann wird oder soll erst das cookie verschickt werden aber logischerweise MUSS ich ja ZUERST ein Text ausgeben.

                          Warum?

                          Request 1
                            Homepage ohne spezifikation
                          Response 1
                            Du prüfst,
                            es liegt kein Cookie vor,
                            Rechte: die Homepage ist öffentlich, du sendest die Homepage.
                            beende das Script

                          Request 2
                            Loginformular form mit name=login mit username und PW
                          Response 2
                            Du prüfst
                            Es ist kein Cookie vorhanden
                            Der task login wird erkannt
                            Du fühst du Sub login() aus.
                               DB abfragen ob
                                  Username existeirt
                                  Das md5 gehashte passwort auf das gespeicherte Passwort passt
                               wenn ok:
                                  erstelle eine neue sessionid
                                  registriere den user als angmeldet im Logfile
                                  schicke den Output (eine Navigationsseite mit Willkommen etc.)
                               wenn nicht OK
                                  Sende Output (wieder gleiche Seite mit Loginform und Sorry Nachricht)
                            beende das Script

                          Request 3
                            Link zu den privaten Daten
                          Response 3
                            Du prüfst
                            Es ist ein Cookie vorhanden
                            Du erkennst den Tast privatedatenanzeigen
                            Du fühst du Sub verify_user() aus.
                               Log-DB abfragen ob
                                  session-id vorhanden
                                  session-id ist noch nicht gestorben
                               wenn ok:
                                  gehe in privatedatenanzeigen()
                                  schicke den Output
                               wenn nicht OK
                                  Sende Output (wieder Start-Seite mit Loginform und Sorry Nachricht)
                            beende das Script

                          Wie du siehst:
                          Bei jedem Response geht zunächst immer das gleiche voran:
                          -- Prüfe ob ein Cookie vorhanden
                          -- verifiziere das Cookie
                          -- erkenne ob ein Task login besteht, und ein Cookie erzeugt werden soll
                          -- allenfalls lösche veraltete Cookies
                          -- verifizieere weiteren Input
                          -- gib je nach task die angemessenen Daten heraus.

                          Ich sehe nich WO du da irgend ein HTML Schicken musst, bevor du auf dem Server alle diese Verifizierungstätigkeit ausführst.

                          In das Cookie sollen ja vorallem die daten kommen die der user bei dem einloggformular eingibt.

                          NEIN!

                          In das Cookie kommt eine Session-ID, die genau anstelle dieser Daten fortan zur Identifizierung verwendet wird.

                          Eine Sessinon-ID erzeugst du aus:
                                          Eine zufällige Zahl
                            verbinden mit dem Zeitstring
                            verbinden mit Username
                            verbinden mit Passwort

                          und das ganze nun konvertieren in einen md5 (oder sha1) Hash.

                          Der Sinn und Zweck von Session-ID ist, dass sie nur während einer Session gültig sind. Das Passwort ist viel wertvoller als die Session-ID. Deshhalb soll es genau einmal über das Netz wandern: beim Login.
                          Jedoch muss auch bei einer Session-ID darauf geachtet werden:

                          • Sie muss einmalig sein
                          • Sie muss unvorhersagbar sein (deshalb die Zufallszahl)
                          • Sie muss bei verschiedenen Logins des Users verschiedenen Wert annehmen

                          Koennt ihr mir vielleicht noch sagen wie ich das am besten mache? Ich kann mir leider nicht nur im geringsten vorstellen wie ich das machen sollte bin noch nicht so gut in perl wie ihr bestimmt schon mitbekommen habt ;=)

                          mfg Beat

                          --
                          Woran ich arbeite:
                          X-Torah
                          ><o(((°>      ><o(((°>
                             <°)))o><                      ><o(((°>o
                          1. Hi.

                            Vielen herzlichen danke fuer deine lange und ausfuehrliche erklaerung und die muehe sieht man selten respekt ;=)

                            ABER tut mir leid aber ich verstehe es noch nicht ganz :=(

                            Und leider bin ich immernoch so bloed und weiss trotz deines ausfuehrlichen Ablauf nicht wie ich demjenigen ein Cookie schicken kann sobald er sich eingeloggt hat weil die Ausgabe wurde ja schon gegeben? Ich bin schwer von begriff ich weiss srry :=(

                            Kannst du oder jemand anderer mir vielleicht GANZ GROB sagen wie der code ungefaehr aussehen muss?? dan wuerd ich es vielleicht leichter verstehen denn ein Beispiel ist immer besser als es nur gesagt zu bekommen. Fuer mich zumindest hehehe.

                            was ich ungefaehr moechte ich sowas:
                            das perlskript soll 2 verschiedene seiten haben
                            1. login
                            2. hauptseite

                            nach dem login sollte ein cookie geschickt werden und wenn dann ein cookie vorhanden ist die hauptseite ausgeben andernfalls die loginseite mit dem fehler.

                            bitte gebt die hoffnung noch nicht auf hehehe

                            Gruezi Frey

                            1. nach dem login sollte ein cookie geschickt werden und wenn dann ein cookie vorhanden ist die hauptseite ausgeben andernfalls die loginseite mit dem fehler.

                              if($cookie) {  
                              hauptseite();  
                              }else{  
                              loginseite();  
                              }  
                              
                              

                              Struppi.

                              1. Hi.

                                Woow seid ihr immer so schnell das geht ja ruck zuck hehehe ;=)

                                Danke struppi aber den code kenn ich ich meinte den code um nach den login ein cookie zu verschicken also wie der ganze skriptaufbau davon ist und das sollte nur GANZ GANZ GROB erklaert werden.

                                Gruezi Frey

                                1. Woow seid ihr immer so schnell das geht ja ruck zuck hehehe ;=)

                                  Danke struppi aber den code kenn ich ich meinte den code um nach den login ein cookie zu verschicken also wie der ganze skriptaufbau davon ist und das sollte nur GANZ GANZ GROB erklaert werden.

                                  Das ist einfach:

                                  if(login_is_ok() ) {  
                                     set_session_cookie();  
                                  }  
                                  
                                  

                                  Struppi.

                    2. bin jetzt auf ne gute loesung gekommen ;=)
                      Habe aber zwei fragen vorallem die erste ist wichtig:

                      Wie bekomm ich eine Variable in ein anderes program? also schwer zu erklaeren ;=)

                      Gar nicht. Eine Variable gehört zu einem Namensraum. Ein perlscript kann zwar ein anderes Script aufrufen, dieses wird aber seinen eigenen Namensraum haben.

                      Vermeide es, dich über mehrere programme zu verzetteln.
                      Das Schreiben von Modulen, die du einbinden kannst steht wohl noch etwas ausser Reichweite.
                      Verwende Subfunktionen stattdessen.

                      dateiA sieht so aus:

                      use CGI;

                      my $cgi = new CGI;

                      $user = $cgi->param("user");

                      print "<form action=dateia.cgi>";
                      print "<input type=text name=user>";
                      print "<input type=submit value=login>";
                      print "</form>";

                      print "$user";

                        
                      Ich hege den verdacht, dass du  
                      use strict;  
                      nicht verwendest.  
                        
                      
                      > print "$user";  
                      
                      solltest du dir abgewöhnen.  
                        print $user;  
                        
                      
                      > Also es wird ganz einfach nach dem Usernamen gefragt aber es sollte auf der dateiA angezeigt werden aber zugleich soll auch irgendwie $user (die eingabe) in eine dateiB geschrieben werden (dateiB ist eine cgi datei die unter anderem das Cookie verschickt).  
                        
                      Sofern datei B ein Perlscript Modul wäre, könntest du dem Modul über dessen API den Wert mitteilen.  
                        
                      Aber warum sich verzetteln.  
                        
                      
                      > Kurz: die eingabe $user soll gleichzeitig in dateiA UND in dateiB existieren.  
                        
                      Gewöhn dir das Wort Script oder Modul für Perlscripte an.  
                      Files klingt in diesem Zusammenhang nach reinen Datenfiles.  
                        
                      mfg Beat
                      
                      -- 
                      Woran ich arbeite:  
                      [X-Torah](http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1)  
                      
                      ><o(((°>      ><o(((°>  
                      
                         <°)))o><                      ><o(((°>o  
                      
                      
                2. es wurde doch gerade gesagt mit JS geht es?

                  Wurde das von mir bestritten. Dir ist klar was ich mit einer serverseitigen sprache meine?

                  aber ganz egal mit was es geht meine frage ist jetzt WIE kann ich ein cookie setzen dass es erst beim einloggen gesetzt wird???
                  und es MUSS ja irgendwie gehen? NUr wie???

                  Das wurde dir doch bereits gesagt, mit JS.

                  Struppi.

        2. Hi,

          Nehmen wir einmal ein ganz simples beispiel: bei verschiedenen email-anbietern wird erst nachdem man sich eingeloggt hat (in seinen email acount) ein cookie verschickt

          der Login-Vorgang wird serverseitig vor jeder Ausgabe durchgeführt. Ganz einfach.

          und so etwas in der art moechte ich auch machen.

          Tu Dir keinen Zwang an.

          Erst wenn man sich einloggt soll ein cookie verschickt werden aber wie mach ich dass dann wenn man es nur zu skript anfang bzw. skript aufruf schicken kann?

          Ähm, indem Du es zum Script-Anfang durchführst. Mit der Definition Script-Anfang := vor jeder Ausgabe des Scripts.

          Der tipp mit der richtige reihenfolge ist in dem fall unsinn sorry.

          Nein, er ist das *einzige*, was Dich oder jeden anderen mit diesem Problem weiterbringen kann, und auch das *einzige*, was diejenigen, bei denen es funktioniert, jemals beherzigt haben. Kein Dienstleister im Web beherrscht die Magie, auch kein E-Mail-Anbieter - ich weiß es, denn ich arbeite bei einigen der größten deutschen Vertreter dieser Gattung. Scotty arbeitet dort nicht, also können sie auch nicht die Gesetze der Physik ändern.

          Ach ja, und JavaScript ist keine Lösung, weil es nur mit JavaScript funktioniert.

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes