PHP: Session Login System

  • Heute ist nicht mein Tag, stehe mit den Sessions und PHP heute irgendwie auf Kriegsfuss. Ich habe einen Login realisiert. Die SID wird in einem Cookie gespeichert. Das ganze funktioniert im Firefox und Opera wunderbar, nur im IE wird der Cookie nicht gesetzt und ich kann mich nicht einloggen. Vielleicht hat ja mal jemand Zeit, über mein Skript zu fliegen???
    [php:1:fab3b59bc9]<?php
    if ($_POST['action']=="check_login") {
    check_login();
    }
    if ($_GET['action']=="logout") {
    logout();
    }

    function show_loginbox () {
    echo "<table border=0 cellpadding=3 cellspacing=1 width=800>";
    echo "<tr><td colspan=2 style=font-size:14px;font-weight:bold;>Login</td></tr>";
    echo "<tr><td width=300>";

    if ($_SESSION['login'] == 1) {
    include("config.php");
    include("includes/db.php");
    $result=$db->sql_query("SELECT * FROM user WHERE id LIKE '".$_SESSION['uid']."';");
    while ($row=$db->sql_fetchrow($result)) {
    $username = $row[username];
    }
    echo "Hallo $username [ <a href=login.php?action=logout>Logout</a> ]";
    } else {
    echo "<form action=login.php method=POST>Benutzername: <input type=text name=username></input></td>";
    echo "<td>Kennwort: <input type=password name=password></input><input type=submit value=Login></input>";
    echo "<input type=hidden name=action value=check_login></input></form>";
    }
    echo "</td></tr>";
    echo "</table>";
    }

    function check_login () {
    session_start();
    include("config.php");
    include("includes/db.php");
    $user_password = md5($_POST['password']);
    $result=$db->sql_query("SELECT * FROM user WHERE username LIKE '".$_POST['username']."';");
    while ($row=$db->sql_fetchrow($result)) {
    $db_password = $row[password];
    $uid = $row[id];
    $db_access = $row[access];
    }
    if ($user_password == $db_password) {
    $cookie_value = $uid;
    if ($db_access == 2) {$_SESSION['admin'] = 1;}
    $_SESSION['uid'] = $uid;
    $_SESSION['login'] = 1;
    header("Location:index.php");
    } else {
    echo "Passwort falsch";
    }
    }

    function logout () {
    session_start();
    session_destroy();
    header("Location:index.php");
    }
    ?>[/php:1:fab3b59bc9]

  • Soweit ich das verstanden hatte, bin ich davon ausgegangen, dass session_start() einen Cookie anlegt, sofern er nicht vorhanden ist, oder? Rein Interesse halber habe ich die Annahme von Sitzungscookies per Hand aktiviert, leider ohne Erfolg. Natürlich wäre das keine Lösung, wie kann man das Problem denn umgehen? Vielleicht hast Du ja auf die Schnelle eine Lösung parat, ansonsten werde ich mich mal auf die Suche machen, nun habe ich ja schonmal einen Anhaltspunkt, danke!

  • dua hast auch nirgents ein session_start() in deinem code, und ja es legt automatisch ein cookie an.

    und das session_start() darf keien ausgabe zuvor haben, auf keine leerzeichen vor dem <?PHP

  • Ich habe sie extra noch einmal aktiviert. Es war vorher auf automatisch gestellt. Ich habe nun per Hand umgestellt und eingestellt

    Automatische Cookiebehandlung aufheben
    Cookies von Erstanbietern > Annehmen
    Cookies von Drittanbietern > Annehmen
    und
    Sitzungscookies immer zulassen!!!!!

  • Rufst du die loginseite direkt auf oder über eine domain wie denic.de.vu?

    Wenn das sitzungscookie durch einen Frame hindurch gesetzt werden soll mag der IE das meist nicht.

    Ich hab mir damals nen eigenes Objekt zum sessionmanagement geschrieben wo ich den cookie selbst setze.

    hab mal ne ältere Version rausgesucht, da ich die neue nur auf dem Server in der Firma habe - hier die "main" Funktion:

    [php:1:1f0ef85366]<?php
    function firma_session() {
    global $irgendeinevariable, $keks, $LILO, $DB;
    $this->prefix = $irgendeinevariable->vars['session_prefix'];
    $this->ipadresse = $_SERVER['REMOTE_ADDR'];

    // Session starten wenn nicht bereits geschehen
    if(!$_SESSION[$this->prefix . 'sessionstarted']) {
    if( isset($_COOKIE[$this->prefix . 'session']) ) {
    session_id($_COOKIE[$this->prefix . 'session']);
    ini_set('session.use_trans_sid', "off");
    $irgendeinevariable->debug_html.="session.use_trans_sid => off
    ";
    } else {
    $this->rewrite = 1;
    }
    session_name($this->prefix . "session");
    session_start();
    $this->ses_r("sessionstarted", true);
    if(! empty( $_SESSION[$this->prefix . 'ipadresse'] ) AND $this->sr("ipadresse") <> $_SERVER['REMOTE_ADDR']) {
    $this->shutdown();
    $url = "";
    $url.= ($irgendeinevariable->input['act']) ? "&act=". $irgendeinevariable->input['act'] : "";
    $url.= ($irgendeinevariable->input['CODE']) ? "&CODE=". $irgendeinevariable->input['CODE'] : "";
    header("location: index.php?". $url);
    exit;
    }
    $this->ses_r("ipadresse", $_SERVER['REMOTE_ADDR']);
    $irgendeinevariable->debug_html.= session_name() ."::". SID . "
    ";
    $session = explode("=", SID);
    $expire = time() + $irgendeinevariable->vars['cookie_expire'];
    $pfad = $irgendeinevariable->vars['cookie_pfad'];
    $domain = $irgendeinevariable->vars['cookie_domain'];

    // Cookies?
    $where_id = ($this->sr("uid")) ? $this->sr("uid") : $irgendeinevariable->vars['guest_userid'];
    $DB->query("SELECT no_cookie FROM firmas_benutzer WHERE ID = '". $where_id ."'");
    $LILO->benutzer = $DB->fetch_row();

    // Neuen sessioncookie setzen wenn keiner mit der aktuellen SID gesetzt ist
    if(! isset($_COOKIE[$this->prefix . 'session']) OR $_COOKIE[$this->prefix . 'session'] <> session_id()) {
    if($LILO->benutzer['no_cookie'] > 0 OR !isset($LILO->benutzer['no_cookie'])) {
    setcookie($this->prefix . "session", '', time()-42000, '/');
    $irgendeinevariable->debug_html.= "Keine Cookies!!
    ";
    $this->rewrite = 1;
    } else {
    $irgendeinevariable->debug_html.= "Cookies:". $LILO->benutzer['no_cookie'] . "
    ";
    setcookie($this->prefix . "session", $session[1], $expire, $pfad, $domain);
    $irgendeinevariable->debug_html.= "setcookie(" .$this->prefix . "session" .",". $session[1] .",". $expire .",". $pfad .",". $domain .");" . "
    ";
    }
    } else {
    // Prüfen, ob der Cookie ein recht hat zu existieren!
    if($LILO->benutzer['no_cookie'] > 0 OR !isset($LILO->benutzer['no_cookie'])) {
    setcookie($this->prefix . "session", '', time()-42000, '/');
    $irgendeinevariable->debug_html.= "Sessioncookie entfernen...
    ";
    $this->rewrite = 1;
    }
    }
    }
    }
    ?>[/php:1:1f0ef85366]

    Zum Ablauf:

    1. Prüfen, ob Session gestartet ist, falls ja, => ENDE - falls nein, weiter zu 2

    2. Prüfen, ob ein Cookie mit der SID gesetzt ist ( if( isset($_COOKIE[$this->prefix . 'session']) ), falls ja, weiter mit 3, sonst wird zuerst ein modul aktiviert welches meine Links so umschreibt, dass überall die SID angehängt wird.

    3. Sofern bekannt, wird die session id auf die aus dem cookie gesetzt, damit die session geladen werden kann ( session_id($_COOKIE[$this->prefix . 'session']); )

    4. mit
    session_name($this->prefix . "session");
    session_start();
    die session starten und laden.
    mit $this->ses_r("sessionstarted", true); sicher ich ab, dass die session nicht doppelt gestartet wird.

    5. ab dem kommentar
    // Neuen sessioncookie setzen wenn keiner mit der aktuellen SID gesetzt ist
    wird es wieder interessant für dich, hier setze ich manuell den cookie, der meine SID enthält.

    Bei mir funktioniert das wunderbar - bei den ersten ein zwei seitenaufrufen nutzt das script einfach meinen mod der meine Links umschreibt wenn der IE den sitzungscookie noch nicht gefressen hat und hängt überall an die Links und in Formulare meine Session ID an.

    Wenn du fragen hast, frag :)

  • Hallo Modula,

    vielen Dank für Deine Mühe. Ich werde mir Dein Skript mal genauer anschauen und schauen, ob und wie ich das für mich verwerten kann. Das kann ich aber leider nur zu Hause machen ;)

    Kurze erklärung zu meinem Skript. Von der index.php binde ich über die Funktion show_loginbox() den Loginkasten (Formular oder Logoutschaltfläche) ein. Beim Login wird direkt auf die login.php verwiesen. Das ganze findet nicht in Frames statt und auch nicht über .de.vu oder ähnliches, ich habe auf meinem vServer die Subdomain sze_neo.beatz-net.de eingerichtet und als ServerAlias auch http://www.sze_neo.beatz-net.de.