Rolf Sonderegger: Session - Cookies expried-problem

hallo forum

ich habe ein kleines problem mit cookies, d.h. genauer sie laufen nicht ab, wenn sie sollten.

zur erläuterung ein bissel quellcode:

secure.inc.php3
[schnipp]
<?php

$track_vars = true;
$pass_login = false;

$expiring = mktime() + 3615; // +3600 weil GMT (+1); +15 weil das cookie testweise 15 sec gültig sein sollte
$date = date("l, d-M-Y H:i:s", ($expiring)); // laut netscape die gültige cookie-datum-syntax

if ($Gilde $HTTP_POST_VARS) $pass_login = true;
header("Set-Cookie: Gilde=test; expires=$date GMT; domain=rc.gomp.ch; path=/");

if (!$pass_login) :
?>
<html>
<head>
<title>Login</title>
</head>

<body>
<form method="post" action="main.php3">
[HTML INPUT FELDER]
</form>
</body>
</head>
</html>

<?php
exit;
else :
$login = false;
$db = mysql_connect("localhost", "*******", "**********");
mysql_select_db("x001",$db);
$result = mysql_query("SELECT m.nickname, m.passwd FROM mitglieder AS m",$db);

while ($myrow = mysql_fetch_array($result)) {
if (($myrow["nickname"] == $HTTP_POST_VARS["login"] && $myrow["passwd"] == $HTTP_POST_VARS["password"]) $Gilde) {
  $nick = $myrow["nickname"];
  header("Set-Cookie: Gilde=$nick; expires=$date GMT; domain=rc.gomp.ch; path=/");
  $login = true;
  //exit;
}
}
if (!$login) {
echo "falsch <br>";
exit;
}
endif;
?>
[HTML das geschützt werden sollte]
[/schnipp]

test.php3:
[schnipp]
echo $HTTP_COOKIE_VARS["Gilde"]
[/schnipp]

die erste datei kann in eine beliebige php-datei mit include eingehängt werden...

mit der zweiten überprüfe ich, ob das cookie noch existiert (sollte genau 15 sek existieren)

das problem ist, dass das cookie länger als diese 15 sek existier - wie lange weiss ich nicht genau (länger als eine halbe stunde sicher!)

ich bin mir jetzt nicht ganz sicher, ob ich mit der GMT zeitumrechnung fehler gemacht habe oder ob etwas anderes am code nicht stimmt...

ich habe sogar im ordner cookies das betreffende cookie gelöscht, das cookie existiert laut test.php3 immernoch :(

hat jemand eine idee?

vielen danke für eure hilfe!

grüsse aus der schweiz (auch in der nacht sehenswert! *gähn*)

Siramon

  1. hmm ... die müdigkeit

    if ($Gilde $HTTP_POST_VARS) $pass_login = true;
    header("Set-Cookie: Gilde=test; expires=$date GMT; domain=rc.gomp.ch; path=/");

    hier sollte natürlich kein cookie gesetzt werden!

    also richtig:

    [schnipp]
    if ($Gilde $HTTP_POST_VARS) $pass_login = true;
    // header("Set-Cookie: Gilde=test; expires=$date GMT; domain=rc.gomp.ch; path=/");
    [/schnipp]

    sorry!

    gruss

    Siramon

  2. Hallo Rolf!

    $expiring = mktime() + 3615; // +3600 weil GMT (+1); +15 weil das cookie testweise 15 sec gültig sein sollte

    Was ganz genau macht mktime()? Mit welcher Zeitzone rechnet es?

    ich habe sogar im ordner cookies das betreffende cookie gelöscht, das cookie existiert laut test.php3 immernoch :(

    Koennte auch ein Problem des Browsers sein (evtl. anderen probieren). Ich wuerde jedoch nicht erwarten, dass der Cookie verschwindet, wenn Du ihn loeschst, waehrend der Browser noch laeuft.

    Calocybe

    1. hallo roland, hallo forum!

      Was ganz genau macht mktime()? Mit welcher Zeitzone rechnet es?

      laut manual:

      Arguments may be left out in order from right to left; any arguments thus omitted will be set to the current value according to the local date and time.

      also, es rechnet die unixzeit aus (local), d.h. die anzahl sekunden seit dem 1.1.1970 00:00:00

      Koennte auch ein Problem des Browsers sein (evtl. anderen probieren). Ich wuerde jedoch nicht erwarten, dass der Cookie verschwindet, wenn Du ihn loeschst, waehrend der Browser noch laeuft.

      habs mit ie 5.1 und netsi 4.61 ausprobiert... auslaufen tun die cookies bei beiden nicht.
      löschen konnt ich es nur bei ie, weil ich dort wusste wo sie gespeichert sind ;)

      aber das manuelle löschen ist nicht das problem ;) das macht ja niemand *g*

      ich habe wahrscheinlich mit den zeitzonen eine verwechslung gemacht... aber ich kriegs nicht raus :(
      ich habe schon mehrere sachen ausprobiert:

      ohne die +3600 wegen der zeitzone, die 3600 schon mal abgezogen usw.

      ich setzte die zeit auch mal auf expired: 0 - dann sollte es eigentlich sofort ablaufen... tat es aber nicht :(

      tx im voraus!

      Siramon

      1. Hi again!

        Arguments may be left out in order from right to left; any arguments thus omitted will be set to the current value according to the local date and time.

        Da Du offensichtlich alle Argumente zu mktime() weggelassen hast (hab keine Ahnung von PHP), werden wohl alle entsprechend der lokalen Zeit angenommen.

        also, es rechnet die unixzeit aus (local), d.h. die anzahl sekunden seit dem 1.1.1970 00:00:00

        Ganz sicher? Allgemein ist es so, dass die Anzahl der Sekunden *immer* bezueglich GMT berechnet wird. Zumindest ist das in Perl und JS so. Erst die Konvertierungsfunktionen (in Deinem Falle date()) beziehen dann (falls so ausgelegt) die lokale Zeitzone mit ein. Aber das sollte hier egal sein.

        habs mit ie 5.1 und netsi 4.61 ausprobiert... auslaufen tun die cookies bei beiden nicht.
        löschen konnt ich es nur bei ie, weil ich dort wusste wo sie gespeichert sind ;)

        cookies.txt im Verzeichnis Deines Netscape-Users (z.B. progs\netscape\users\default\cokkies.txt).

        ich habe wahrscheinlich mit den zeitzonen eine verwechslung gemacht... aber ich kriegs nicht raus :(
        ich habe schon mehrere sachen ausprobiert:

        ohne die +3600 wegen der zeitzone, die 3600 schon mal abgezogen usw.

        Also wenn ich annehme, dass die eingestellte Zeitzone MESZ == GMT +0200 ist, dann musst Du 7200 abziehen (denn GMT == MESZ -0200) und dann 15 addieren. Aber besser ist es, wenn Du ueberhaupt nur mit GMT rechnest, dann brauchst Du das alles nicht. normalerweise sollte eine Progsprache entsprechende Funktionen anbieten.

        ich setzte die zeit auch mal auf expired: 0 - dann sollte es eigentlich sofort ablaufen... tat es aber nicht :(

        Ist ja nicht in dem vorgegebenen Format. Aber versuch doch mal, einen Zeitpunkt in der Vergangenheit fest zu coden. Wenn der Cookie dann immer noch da ist, liegt das Problem wohl ganz woanders.

        Mehr kann ich Dir nicht mehr helfen, haue naemlich gleich ab.
        So long