Jan: Problem mit Sessions

Hallo Leute!

Hatte im Forum eine PHP-Session-Diskussion von Ende Februar gefunden, die mir als Basis für ein ähnliches System bietet.
Nun hab ich das Script nachgebaut und in eine Include gepackt.

Jede Seite, die zum Login-Bereich gehören soll, hatte dieses Script inkludiert.

So sieht es aus:

<?php

session_start();

if (isset($_POST["login"])) {
$_SESSION["username"] = $_POST["username"];

}
elseif (($_POST["logout"])) {
session_destroy();
}

echo "<br><br><br><hr>";
?>

<?php
if (isset($_POST["username"])) :
?>
Username: Gast (nicht eingeloggt)<br>
<form action="<?php echo $PHP_SELF ?>" method="post">
<input type="hidden" name="login">
Username: <input type="text" name="username"><br>
Passwort: <input type="text" name="passwort"><br>
<input type="submit" value="Login">
</form>
<?php
else :
?>
Username: <?php echo $_POST["username"] ?> (registriert)
<form action="<?php echo $PHP_SELF ?>" method="post">
<input type="hidden" name="logout">
<input type="submit" value="Logout">
</form>
<?php
endif;
?>

In den anderen Dateien steht dann ganz oben eben folgendes drin:

<?php include("login.inc"); ?>

Ich hab mal 4 Test-Seiten gemacht (index1-4.php).

Ich gehe auf index1.php, habe das Formular schön vor mir, kann mich auch einloggen und gleich wieder ausloggen.
Ich logge mich ein und gehe auf eine andere Seite, da sehe ich zwar, das eine Session bestehen muss (Login-Formular ist nicht da), aber - der Username steht nicht dort. Auch ein Klick auf den Logout-Button nutzt nichts.
Komme ich wieder zurück auf index1.php, bin ich dort ausgeloggt.

Ich find das eben komisch, weil doch überall das gleiche Script inkludiert wird. Was mache ich also falsch?

Hoffe, das mir jemand weiterhelfen kann.

lg, Jan

  1. hi jan,

    Username: <?php echo $_POST["username"] ?> (registriert)

    kleine frage, warum fragst du hier nach $_POST['username'] und nicht nach $_SESSION['username']?
    hm... na gut, ich verstehe sowieso nicht, warum hier nicht wieder das loginformular gezeigt wird, wenn du auf die nächste seite gehst wird die variable sowieso nicht mitgesandt, oder machst du das per formular?

    hm...

    grüße,
    small-step

  2. if (isset($_POST["login"])) {
    $_SESSION["username"] = $_POST["username"];

    Es ist durchaus ratsam, die Variable zu prüfen, die man später benutzt. Benutze hier also besser etwas in der Richtung

    if (isset($_POST["login"]) && isset($_POST["username"]))

    [Formularausgabe]

    if (isset($_POST["username"])) :
    ?>
    Username: Gast (nicht eingeloggt)<br>

    Das kann nicht funktionieren. Wenn $_POST[] gesetzt ist, ist dieses Skript das Ziel eines Anmeldeversuchs. Warum gibst Du dann nochmal das Anmeldeformular aus? Die if-Bedingung kann nur lauten

    if (! isset($_SESSION["username"]))

    ..das heißt, nur wenn keine Session existiert, wird das Anmeldeformular angeboten. Existiert eine Session, ist der Benutzer bereits angemeldet.

    <form action="<?php echo $PHP_SELF ?>" method="post">
    <input type="hidden" name="login">

    Dieses Element kannst Du Dir sparen. Gib einfach dem submit-<input> den Namen "login", es erscheint dann selbst in $_POST[].

    Username: <?php echo $_POST["username"] ?> (registriert)

    Vorsicht mit dem Ausgeben von externen Sachen, benutze _immer_ htmlentities(). Im obigen Fall mag das nicht kein allzu großes Problem sein, aber auch hier könnte irgendein Scherzkeks sich als Benutzername

    <script type="text/javascript">while (true) alert("Bla!");</script>

    aussuchen - was Du dann treuselig in den Quelltext Deiner Seite ausgibst. Den Browser kann der Benutzer dann wegen der penetranten Endlosschleife nur mit Gewalt noch abschießen.

    <input type="hidden" name="logout">
    <input type="submit" value="Logout">

    Siehe oben, schmeiß das hidden-Teil raus und gib dem submit einen Namen.

    Ich logge mich ein und gehe auf eine andere Seite, da sehe ich zwar, das eine Session bestehen muss (Login-Formular ist nicht da),

    Bei diesem Problem hättest Du Dir auch ein gutes Stück selbst helfen können, wenn Du nicht mit Annahmen über die Funktionsweise gearbeitet, sondern Dir stattdessen einfach die relevanten Variablen ($_SESSION, $_COOKIE, $_POST) per var_dump() an wichtigen Stellen ausgegeben hättest.

    Gruß,
      soenk.e