max: session id

hallo,
ich habe eine seite mit subdomains. wenn man sich auf der hauptdomain einloggt, funktioniert die session id auf den unterseiten nicht.
ich habe das login so gestaltet:

  
session_set_cookie_params(0, '/', '.domain.com');  
session_start ();  
//abfrage ob benutzername und passwort stimmen  
$_SESSION["user_id"] = mysql_result($res, 0, "ID");  
$_SESSION["user_username"] = mysql_result($res, 0, "username");  
$_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");  
$_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");  
// Weiterleitung zum internen bereich  

anstatt domain.com wurde natürlich meine eigene domain hingeschrieben.
Bei jedem seitenaufruf wird dann checkuser.php eingebunden. diese sieht so aus:

  
session_start ();  
if (!isset ($_SESSION["user_id"]))  
 {  
   header ("Location: index.php?fehler=2");  
 }  
else  
 {  
   $user_ID=$_SESSION["user_id"];  
   $user_username=$_SESSION["user_username"];  
   $user_nachname=$_SESSION["user_nachname"];  
   $user_vorname=$_SESSION["user_vorname"];}  
 }	  

das alles funktioniert wunderbar, nur nicht bei den subdomains. auch mit oder ohne www. gibts probleme...
was kann man da machen?
für hilfe bedanke ich mich schon jetzt!
mfg

  1. Hallo,

    m.W. gilt die Session für die Domain. Dabei ist es ein unterschied, ob du abc.example.com hast oder www.example.com oder example.com. wenn du da Domain-Hopping betreibst, hast du vielleicht dein System falsch angelegt.

    Ggfs. ist var_dump($_SESSION) auf aufschlussreich.

    Gruß

    jobo

    1. Hallo,

      m.W. gilt die Session für die Domain. Dabei ist es ein unterschied, ob du abc.example.com hast oder www.example.com oder example.com. wenn du da Domain-Hopping betreibst, hast du vielleicht dein System falsch angelegt.

      Ggfs. ist var_dump($_SESSION) auf aufschlussreich.

      Gruß

      jobo

      wie meinst du system falsch angelegt?

      1. Hallo,

        Hallo,

        m.W. gilt die Session für die Domain. Dabei ist es ein unterschied, ob du abc.example.com hast oder www.example.com oder example.com. wenn du da Domain-Hopping betreibst, hast du vielleicht dein System falsch angelegt.

        Ggfs. ist var_dump($_SESSION) auf aufschlussreich.

        wie meinst du system falsch angelegt?

        Naja, habe den Rest jetzt nicht gelesen, aber wieso hüpfst Du denn zwischen Subdomains. Eigentlich bewegt mensch sich doch normalerweise innerhalb einer (Sub-)Domain. Dann ist das Sessionhandling ja auch recht simpel.

        Gruß

        jobo

  2. Hello Max,

    session_set_cookie_params(0, '/', '.domain.com');

    session_start ();
    //abfrage ob benutzername und passwort stimmen

    Und wo stellst Du eine Verbindung zum Datenbankserverh her?
    Wo wählst Du eine Datenbank aus?
    Wo führst Du die Datenbankabfrage aus?

    $_SESSION["user_id"] = mysql_result($res, 0, "ID");
    $_SESSION["user_username"] = mysql_result($res, 0, "username");
    $_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");
    $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");
    // Weiterleitung zum internen bereich

    Benutze bitte "example.org" oder andere dafür gedachte Domain-Dummies, aber keine tatsächlich existierenden.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello Max,

      session_set_cookie_params(0, '/', '.domain.com');

      session_start ();
      //abfrage ob benutzername und passwort stimmen

      Und wo stellst Du eine Verbindung zum Datenbankserverh her?
      Wo wählst Du eine Datenbank aus?
      Wo führst Du die Datenbankabfrage aus?

      $_SESSION["user_id"] = mysql_result($res, 0, "ID");
      $_SESSION["user_username"] = mysql_result($res, 0, "username");
      $_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");
      $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");
      // Weiterleitung zum internen bereich

      Benutze bitte "example.org" oder andere dafür gedachte Domain-Dummies, aber keine tatsächlich existierenden.

      Liebe Grüße aus dem schönen Oberharz

      danke für die schnellen antworten,

        
      <?php function ein ($s){if (isset($_POST[$s])){$a = $_POST[$s];$a = htmlentities(strip_tags($a),ENT_QUOTES);}else $a = "";return $a;}  
      $user = ein("name"); $pass = ein("pwd"); $passwort=$pass; $pass = md5($pass);  
      // Session starten  
      session_set_cookie_params(0, '/', '.example.org');  
      session_start ();  
        
      // Datenbankverbindung aufbauen  
      include ("src/datenbank.php");	  
      $sqlab = "select * from `user` where `username` = '$user' and `password` = '$pass' and `valid` = 1"; $res = mysql_query($sqlab); $num = mysql_num_rows($res);  
      if ($num == 1) { $passwort = mysql_result($res, 0, "password");  if ($pass == $passwort)  
          { // Sessionvariablen erstellen und registrieren  
      	  $_SESSION["user_id"] = mysql_result($res, 0, "ID");  
      	  $_SESSION["user_username"] = mysql_result($res, 0, "username");  
      	  $_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");  
      	  $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");  
        
        
        
      	  mysql_close($db);  
      	  header("Location: intern.php#action=start");  
      	  header("Location: welcome.php");  
      	}}  
      else {  
      	mysql_close($db);  
              header ("Location: index.php?fehler=1");  
            }  
      ?>  
      
      

      das ist die komplette login datei.

      1. Hello,

        Hello Max,

        session_set_cookie_params(0, '/', '.domain.com');

        session_start ();
        //abfrage ob benutzername und passwort stimmen

        Und wo stellst Du eine Verbindung zum Datenbankserverh her?
        Wo wählst Du eine Datenbank aus?
        Wo führst Du die Datenbankabfrage aus?

        $_SESSION["user_id"] = mysql_result($res, 0, "ID");
        $_SESSION["user_username"] = mysql_result($res, 0, "username");
        $_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");
        $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");
        // Weiterleitung zum internen bereich

        Benutze bitte "example.org" oder andere dafür gedachte Domain-Dummies, aber keine tatsächlich existierenden.

        Liebe Grüße aus dem schönen Oberharz

        danke für die schnellen antworten,

        <?php

        function ein ($s)
        {
            if (isset($_POST[$s]))
            {
                $a = $_POST[$s];
                $a = htmlentities(strip_tags($a),ENT_QUOTES);
            }
            else
            {
                $a = "";
            }
            return $a;
        }

        $user = ein("name");

        $pass = ein("pwd");
            $passwort=$pass;
            $pass = md5($pass);

        // Session starten
        session_set_cookie_params(0, '/', '.example.org');
        session_start ();

        // Datenbankverbindung aufbauen
        include ("src/datenbank.php");
        $sqlab = "select * from user where username = '$user' and password = '$pass' and valid = 1"; $res = mysql_query($sqlab); $num = mysql_num_rows($res);
        if ($num == 1) { $passwort = mysql_result($res, 0, "password");  if ($pass == $passwort)
            { // Sessionvariablen erstellen und registrieren
          $_SESSION["user_id"] = mysql_result($res, 0, "ID");
          $_SESSION["user_username"] = mysql_result($res, 0, "username");
          $_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");
          $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");

        mysql_close($db);
          header("Location: intern.php#action=start");
          header("Location: welcome.php");
        }}
        else {
        mysql_close($db);
                header ("Location: index.php?fehler=1");
              }
        ?>

          
        \*hoppla\*  
          
        Was soll Deine Funktion "ein()" bewirken?  
        Die ist falsch gestaltet.  
          
        Sie sollte bestenfalls die Daten aus einer "Übertragungscodierung" in eine "Verarbeitungscodierung", also Rohdaten, überführen. Die Übertragungscodierung wandelt PHP aber freundlicherweise schon selber in die Rohdatenform um, mit Ausnahme der "Magic Quotes", die es ggf. extra wieder hinzufügt.  
          
        Die Codierung für den SQL-Kontext der Textschnittstelle solltest Du erst herstellen, wenn diese auch bentutzt wird.  
          
        Lies Dir mal den Artikel von Dedlfix durch zum Thema:  
        <http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel>  
          
        Der beschreibt doch ziemlich genau, was wann warum wie codiert oder "escaped" werden muss.  
          
          
          
          
          
        Liebe Grüße aus dem schönen Oberharz  
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
         ☻\_  
        /▌  
        / \ Nur selber lernen macht schlau  
        <http://bergpost.annerschbarrich.de>
        
        1. Hello,

          Hello Max,

          session_set_cookie_params(0, '/', '.domain.com');

          session_start ();
          //abfrage ob benutzername und passwort stimmen

          Und wo stellst Du eine Verbindung zum Datenbankserverh her?
          Wo wählst Du eine Datenbank aus?
          Wo führst Du die Datenbankabfrage aus?

          $_SESSION["user_id"] = mysql_result($res, 0, "ID");
          $_SESSION["user_username"] = mysql_result($res, 0, "username");
          $_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");
          $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");
          // Weiterleitung zum internen bereich

          Benutze bitte "example.org" oder andere dafür gedachte Domain-Dummies, aber keine tatsächlich existierenden.

          Liebe Grüße aus dem schönen Oberharz

          danke für die schnellen antworten,

          <?php

          function ein ($s)
          {
              if (isset($_POST[$s]))
              {
                  $a = $_POST[$s];
                  $a = htmlentities(strip_tags($a),ENT_QUOTES);
              }
              else
              {
                  $a = "";
              }
              return $a;
          }

          $user = ein("name");
              $pass = ein("pwd");
              $passwort=$pass;
              $pass = md5($pass);

          // Session starten
          session_set_cookie_params(0, '/', '.example.org');
          session_start ();

          // Datenbankverbindung aufbauen
          include ("src/datenbank.php");
          $sqlab = "select * from user where username = '$user' and password = '$pass' and valid = 1"; $res = mysql_query($sqlab); $num = mysql_num_rows($res);
          if ($num == 1) { $passwort = mysql_result($res, 0, "password");  if ($pass == $passwort)
              { // Sessionvariablen erstellen und registrieren
            $_SESSION["user_id"] = mysql_result($res, 0, "ID");
            $_SESSION["user_username"] = mysql_result($res, 0, "username");
            $_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");
            $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");

            mysql_close($db);  
            header("Location: intern.php#action=start");  
            header("Location: welcome.php");  
          }}  
          

          else {
          mysql_close($db);
                  header ("Location: index.php?fehler=1");
                }
          ?>

          
          >   
          > \*hoppla\*  
          >   
          > Was soll Deine Funktion "ein()" bewirken?  
          > Die ist falsch gestaltet.  
          >   
          > Sie sollte bestenfalls die Daten aus einer "Übertragungscodierung" in eine "Verarbeitungscodierung", also Rohdaten, überführen. Die Übertragungscodierung wandelt PHP aber freundlicherweise schon selber in die Rohdatenform um, mit Ausnahme der "Magic Quotes", die es ggf. extra wieder hinzufügt.  
          >   
          > Die Codierung für den SQL-Kontext der Textschnittstelle solltest Du erst herstellen, wenn diese auch bentutzt wird.  
          >   
          > Lies Dir mal den Artikel von Dedlfix durch zum Thema:  
          > <http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel>  
          >   
          > Der beschreibt doch ziemlich genau, was wann warum wie codiert oder "escaped" werden muss.  
          >   
          >   
          >   
          >   
          >   
          > Liebe Grüße aus dem schönen Oberharz  
          >   
          >   
          > Tom vom Berg  
          > ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          >   
          >   
            
          danke :)  
          aber das hat mit der login session ja nichts zu tun oder?  
          weil auf der hauptdomain gibt es keine probleme...  
          nur auf den subdomains...  
          lg
          
          1. Hello,

            reduruiere Deinen Versuchsaufbau auf das Wesentliche.

            -- example.org/script-1.php --
             session_set_cookie_params(0, '/', '.example.org');

            session_start ();

            $_SESSION["user_id"] = 'bla';
             $_SESSION["user_username"] = 'Blubb';
             $_SESSION["user_nachname"] = 'hab ich auch';
             $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");

            -- show.example.org/script-2.php --
             session_set_cookie_params(0, '/', '.example.org');

            session_start ();

            echo $_SESSION["user_id"] ."<br>\r\n";
             echo $_SESSION["user_username"] ."<br>\r\n";
             echo $_SESSION["user_nachname"] ."<br>\r\n";
             echo $_SESSION["user_vorname"] ."<br>\r\n";

            echo "fertig";

            Und wenn DAS dann nicht funktioniert, schauen wir weiter.

            // Weiterleitung zum internen bereich

            wie findet die "Weiterleitung statt?

            Du erzählst uns scheinbar immer noch nicht alles?

            Und bitte zitiere nur die Teile, die für Deine Folgeantwort notwendig sind.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hello,

              reduruiere Deinen Versuchsaufbau auf das Wesentliche.

              -- example.org/script-1.php --
              session_set_cookie_params(0, '/', '.example.org');

              session_start ();

              $_SESSION["user_id"] = 'bla';
              $_SESSION["user_username"] = 'Blubb';
              $_SESSION["user_nachname"] = 'hab ich auch';
              $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");

              -- show.example.org/script-2.php --
              session_set_cookie_params(0, '/', '.example.org');

              session_start ();

              echo $_SESSION["user_id"] ."<br>\r\n";
              echo $_SESSION["user_username"] ."<br>\r\n";
              echo $_SESSION["user_nachname"] ."<br>\r\n";
              echo $_SESSION["user_vorname"] ."<br>\r\n";

              echo "fertig";

              Und wenn DAS dann nicht funktioniert, schauen wir weiter.

              // Weiterleitung zum internen bereich

              wie findet die "Weiterleitung statt?

              Du erzählst uns scheinbar immer noch nicht alles?

              Und bitte zitiere nur die Teile, die für Deine Folgeantwort notwendig sind.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              Die weiterleitung findet mit ("Location: intern.php"); statt.

              Ich habe jetzt beide Dateien auf den Webserver geladen und aufgerufen. Zuerst die erste, dann die ausgabeseite. Die ausgabeseite gibt dann die variablen richtig aus, wenn ich dann jedoch das www. weglösche und die seite neu lade steht nur fertig.
              komisch :/

              1. Hello,

                reduziere Deinen Versuchsaufbau auf das Wesentliche.

                -- example.org/script-1.php --
                session_set_cookie_params(0, '/', '.example.org');

                session_start ();

                $_SESSION["user_id"] = 'bla';
                $_SESSION["user_username"] = 'Blubb';
                $_SESSION["user_nachname"] = 'hab ich auch';
                $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");

                -- show.example.org/script-2.php --
                session_set_cookie_params(0, '/', '.example.org');

                session_start ();

                echo $_SESSION["user_id"] ."<br>\r\n";
                echo $_SESSION["user_username"] ."<br>\r\n";
                echo $_SESSION["user_nachname"] ."<br>\r\n";
                echo $_SESSION["user_vorname"] ."<br>\r\n";

                echo "fertig";

                Und wenn DAS dann nicht funktioniert, schauen wir weiter.

                // Weiterleitung zum internen bereich

                wie findet die "Weiterleitung statt?

                Du erzählst uns scheinbar immer noch nicht alles?

                Und bitte zitiere nur die Teile, die für Deine Folgeantwort notwendig sind.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                Die weiterleitung findet mit ("Location: intern.php"); statt.

                Ich habe jetzt beide Dateien auf den Webserver geladen und aufgerufen. Zuerst die erste, dann die ausgabeseite. Die ausgabeseite gibt dann die variablen richtig aus, wenn ich dann jedoch das www. weglösche und die seite neu lade steht nur fertig.
                komisch :/

                Da krieg ich jetzt irgendwas nicht mit.
                Generell sind

                www.example.org
                       example.org

                zwei unterschiedliche Domains. PHP kann die Cookies aber für dir übergeordente und ihre "Töchter" vorbestimmen. Kann natürlich sein, dass das den Browser nicht interessiert.

                hast Du Dir mal die "Live HTTP Headers" als Add on für den Firefox installiert? Damit müsstest Du zumindest sehen können, wie der Browser reagiert.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. den kann ich leider nicht installiern. ist mit firefox 4.0 nicht kompatibel
                  aber im internet explorer gehts wirklich.
                  also liegts am firefox
                  danke für die hilfe!!! :)

  3. Hi,

    session_set_cookie_params(0, '/', '.domain.com');
    session_start ();
    //abfrage ob benutzername und passwort stimmen
    $_SESSION["user_id"] = mysql_result($res, 0, "ID");
    $_SESSION["user_username"] = mysql_result($res, 0, "username");
    $_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");
    $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");
    // Weiterleitung zum internen bereich

      
    
    > Bei jedem seitenaufruf wird dann checkuser.php eingebunden. diese sieht so aus:  
    > ~~~php
      
    
    > session_start ();  
    > if (!isset ($_SESSION["user_id"]))  
    > [...]
    
    

    Die Einbindung der checkuser.php wird wohl vor dem oberen Code geschehen, nehme ich an?

    Also kommt das in checkuser.php stehende session_start() bereits, bevor du überhaupt die Cookie-Parameter setzt, wofür es sich im Nachhinein natürlich nicht mehr interessiert. Der Cookie wird also mit den Defaultparametern gesetzt.

    Das nachfolgende session_start im oberen Code setzt dann natürlich keinen Cookie mehr, denn die Session wurde ja bereits gestartet. Dafür dürfte es eine Warnmeldung produzieren, wenn du das error_reporting vernünftig eingestellt hättest - also mach das bitte!

    was kann man da machen?

    Sich mal über die Reihenfolge der Ausführung des zusammengeschusterten Codes, und deren Auswirkung klar werden.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Der obere Code ist nur die Login Datei. Diese wird als erstes aufgerufen. Danach im internen bereich wird checkuser.php als erstes aufgerufen...

      Hi,

      session_set_cookie_params(0, '/', '.domain.com');
      session_start ();
      //abfrage ob benutzername und passwort stimmen
      $_SESSION["user_id"] = mysql_result($res, 0, "ID");
      $_SESSION["user_username"] = mysql_result($res, 0, "username");
      $_SESSION["user_nachname"] = mysql_result($res, 0, "nachname");
      $_SESSION["user_vorname"] = mysql_result($res, 0, "vorname");
      // Weiterleitung zum internen bereich

      
      >   
      > > Bei jedem seitenaufruf wird dann checkuser.php eingebunden. diese sieht so aus:  
      > > ~~~php
        
      
      > > session_start ();  
      > > if (!isset ($_SESSION["user_id"]))  
      > > [...]
      
      

      Die Einbindung der checkuser.php wird wohl vor dem oberen Code geschehen, nehme ich an?

      Also kommt das in checkuser.php stehende session_start() bereits, bevor du überhaupt die Cookie-Parameter setzt, wofür es sich im Nachhinein natürlich nicht mehr interessiert. Der Cookie wird also mit den Defaultparametern gesetzt.

      Das nachfolgende session_start im oberen Code setzt dann natürlich keinen Cookie mehr, denn die Session wurde ja bereits gestartet. Dafür dürfte es eine Warnmeldung produzieren, wenn du das error_reporting vernünftig eingestellt hättest - also mach das bitte!

      was kann man da machen?

      Sich mal über die Reihenfolge der Ausführung des zusammengeschusterten Codes, und deren Auswirkung klar werden.

      MfG ChrisB

      1. Hi,

        weitere Rückfragen, die zur Klärung des Problems beitragen könnten, spare ich mir jetzt - weil mir diese ständigen ebenso gedanken- wie sinnlosen Fullquotes deinerseits echt auf die Nerven gehen.

        TOFU = Pfui.

        Wenn du zeigst, dass du von diesem Schriftverkehr-Vegetarismus geheilt bist, können wir das Problem weiter diskutieren.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?