Sabine: Session innerhalb einer Seite (index.php)

Hallo Leute,

ich habe ein Problem mit Session.

Ich habe auf der index.php ein Formular Feld welches ich wiederum zu der index.php schicke.

Aber wenn sich der richtige User einlogt lande ich troztdem wieder auf der Index.php?

Hier mein Script:

If ($login =="aktiv") // aktiv wird vom Forumlar übergeben
 {
  session_start();
     $passwort = md5($passwort);
  if ((!isset($username)) OR (!isset($passwort)))
   {
   die ("<div align='center'> <br><strong><font size='2' face='Arial, Helvetica, sans-serif'>Sorry, aber ohne Name bzw. Passwort geht hier nichts !<br><br><a href='/index.php'>- ZUR&Uuml;CK -</a></font></strong></div>");
   }

$dbh = getConn();
  $query = "SELECT PASS FROM wgs_mitglieder WHERE USER = '".$username."'";
  $result = mysql_query($query,$dbh);
  $zeileholen = mysql_fetch_array($result,MYSQL_ASSOC);
  mysql_close($dbh);

if (!$zeileholen)
   {
   header ("Location: index.php");
   }
  elseif ($zeileholen["pass"] <> $passwort)
   {
   header ("Location: index.php");
   }
  else
   {
   session_register('username');
   header ("Location: /pressecenter/index.php");
   }

}

wo ist hier der Fehler das ich nicht auf /pressecenter/index.php lande?

Gruß Sabine

  1. was mir auf die Schnelle auffällt ist, dass du session_start(); GANZ an den ANFANG deines Codes stellen musst, damit es aktiviert wird. Schau dazu mal ins Online Manual unter der Funktion session_start(), wenn Du näheres wissen möchtest.

    Ich schau aber nochmal über den Code, ob sich da sonst noch kleine Ecken und Kanten verstecken ...

    Grüsse Stefan

    1. was mir auf die Schnelle auffällt ist, dass du session_start(); GANZ an den ANFANG deines Codes stellen musst, damit es aktiviert wird. Schau dazu mal ins Online Manual unter der Funktion session_start(), wenn Du näheres wissen möchtest.

      Das ist es aber nicht ich habe es auch schon vor der Schleife gestellt.

      Wenn aktiv vom Anmelde Forumal übergeben wird kommt er in die Schleife und dann wird session gestartet

      Ich habe nun session_start oben stehen aber es bleibt beim alten

    2. Hello,

      was mir auf die Schnelle auffällt ist, dass du session_start(); GANZ an den ANFANG deines Codes stellen musst, damit es aktiviert wird. Schau dazu mal ins Online Manual unter der Funktion session_start(), wenn Du näheres wissen möchtest.

      Nö, das muss man nicht. Es muss nur vor jeder Ausgabe des Output-Buffersd an den Client und vor der Wertezuweisung (bzw. Abfrage) an $_SESSION passieren.

      Gerade in einr Anmeldefunktion kann es sinnvoll sein, session_start() erst tief drinnen, vielleicht sogar in einer Funktion, aufzurufen. Dann muss man aber sicherstellen, dass man eine neuere PHP-Version hat. Anderenfalls muss man $HTTP_SESSION_VARS in der Hauptebene vorher als Array anlegen und in der Funktion als Global definieren. Aber sooo alte Versionen tauchen hier nur noch selten auf (neulich PHP3 *gg*).

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  2. $query = "SELECT PASS FROM wgs_mitglieder WHERE USER = '".$username."'";

    »

    ...

    »

    elseif ($zeileholen["pass"] <> $passwort)

    Hier solltest Du auch Groß/Kleinschreibung beachten und PASS verwenden, einfach der (Code-)Sauberheit halber.

    Dazu nun eine Frage: Sind die Passwörter in deiner Datenbank auch md5() verschlüsselt?

    Gruss Stefan

    1. Dazu nun eine Frage: Sind die Passwörter in deiner Datenbank auch md5() verschlüsselt?

      ja sind sie!

      im loginbereich meines cms funktioniert die sessionverabreitung ja aber da ich mich auf der index.php anmelde und es gleich verarbeiten will geht es hier nicht aber warum nicht?

      1. Bau diesen Teil doch mal anders auf:

        $query = "SELECT PASS FROM wgs_mitglieder WHERE USER = '".$username."'";
        $result = mysql_query($query,$dbh);
        $zeileholen = mysql_fetch_array($result,MYSQL_ASSOC);

        if (!$zeileholen)
        {
           header ("Location: index.php");
        }
        elseif ($zeileholen["pass"] <> $passwort)
        {
           header ("Location: index.php");
        }
        else
        {
           session_register('username');
           header ("Location: /pressecenter/index.php");
        }

        $query = "SELECT USER, PASS FROM wgs_mitglieder WHERE USER = '$username'" AND PASS = '$passwort' LIMIT 1;";
        $result = mysql_query($query,$dbh);

        if(! mysql_num_rows($result)) {
           header("Location: index.php");
        } else {
           $row = mysql_fetch_array($result);
           $username = $row['USER'];
           session_register("username");
           header("Location: /pressecenter/index.php");
        }

        Gruss
        Stefan

        1. $query = "SELECT USER, PASS FROM wgs_mitglieder WHERE USER = '$username'" AND PASS = '$passwort' LIMIT 1;";
          $result = mysql_query($query,$dbh);

          if(! mysql_num_rows($result)) {
             header("Location: index.php");
          } else {
             $row = mysql_fetch_array($result);
             $username = $row['USER'];
             session_register("username");
             header("Location: /pressecenter/index.php");
          }

          Hallo Stefan die Lösung funktioniert abgesehen von den 2 kleinen Fehler im $query

          Ich gehe mal davon aus das LIMIT sagt das nur 1 Ergbnis erlaubt ist und wenn es gefunden wurde soll er aufhören zusuchen?

          Ich glaube auch ich weiß wo nun der Fehler bei mir war pass und PASS

          Da ich bereits alles klein in der DB stehen habe stelle ich nun um auf Großschreibweise da mein Kollege auch in Groß schreibt.

          Danke!

          Sabine

          1. Das Problem sind Eure Feldnamen wie USER, richtig? *g*
            Hatte vergessen den in ´´ zu setzen, da es aj auch ein MySQL Befehl ist.

            Gruss Stefan

        2. Hello,

          if ((srlen(trim($passwort))>0) and (strlen(trim($username))>0))
           {
             ## *1)
             $username = mysql_escape_string($username);
             $password = mysql_escape_string($password);

          $query = "SELECT USER, PASS FROM wgs_mitglieder ".
                      "WHERE USER = '$username'" AND PASS = '$passwort'";

          $result = mysql_query($query,$dbh);
             if(!$result or (mysql_num_rows($result) != 1))
             {
               header("Location: http://domain.tld/index.php");
             }
             else
             {
               $row = mysql_fetch_array($result);
               $username = $row['USER'];
               session_register("username");
               header("Location: /pressecenter/index.php");
             }
           }
           else
           {
             header("Location: http://domain.tld/index.php");
           }

          *1) gilt für mysql_magic_quotes() === false;
                sonst vorher noch stripslashes() verwenden.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          1. $username = mysql_escape_string($username);
               $password = mysql_escape_string($password);

            *1) gilt für mysql_magic_quotes() === false;
                  sonst vorher noch stripslashes() verwenden.

            Hi Tom,

            ich verstehe nicht was ich mit mysql_escape_string machen kann?
            Ich habe zwar in die Manuel geschaut es aber nicht wirklich verstanden?

            Gruß Sabine

            1. Hello,

              $username = mysql_escape_string($username);
                 $password = mysql_escape_string($password);

              *1) gilt für mysql_magic_quotes() === false;
                    sonst vorher noch stripslashes() verwenden.

              ich verstehe nicht was ich mit mysql_escape_string machen kann?
              Ich habe zwar in die Manuel geschaut es aber nicht wirklich verstanden?

              Man MUSS es benutzen, wnn die Werte von außen kommen. Sonst kann man über die Eingabefelder und die Abfrage ggf. Deine Datenbank korrumpieren. Das wird nur abgefangen dadurch, dass bei PHP meistens magic_quotes_gpc = on ist und PHP selber Backslashes hinzufügt, um die Datenbanken zu schützen.

              Allerdings müssen bei MySQL mehr Zeichen escaped werden, als es addslashes() von PHP tut.

              Man muss also meistens erst das addslashes() von PHP rückgängig machen mit stripslashes() um dann die MySQL-gerechte Maskierung mit mysql_escpae_string() oder mysql_real_escpae_string() durchzuführen.

              Liebe Grüße aus http://www.braunschweig.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              1. Ich versteh ehrlich gesagt nicht was mir das bringen soll wenn ich ein slash in mein string einbaue?

                Wenn ich nun mysql_escape_string der Datenbank übergebe dann haut er doch alles kaputt.

                Also wenn ich mir das Beispiel anschaue sehe ich keine Sinn wozu das ganze?

                ---
                <?php
                   $item = "Zak's Laptop";
                   $escaped_item = mysql_escape_string($item);
                   printf ("Escaped string: %s\n", $escaped_item);
                ?>

                Das Beispiel oben führt zu dieser Ausgabe:

                Escaped string: Zak's Laptop

                ---

                1. Hello,

                  Ich versteh ehrlich gesagt nicht was mir das bringen soll wenn ich ein slash in mein string einbaue?

                  Wenn ich nun mysql_escape_string der Datenbank übergebe dann haut er doch alles kaputt.

                  Also wenn ich mir das Beispiel anschaue sehe ich keine Sinn wozu das ganze?


                  <?php
                     $item = "Zak's Laptop";
                     $escaped_item = mysql_escape_string($item);
                     printf ("Escaped string: %s\n", $escaped_item);
                  ?>

                  Das Beispiel oben führt zu dieser Ausgabe:

                  Escaped string: Zak's Laptop

                  Ganz ruhig Blonder... nicht aufregen ;-) [bin ja auch schon teilergraut]

                  Datenzustandsdiagramm
                  Wo wird was an welcher Stelle wie und warum dargestellt?

                  Ich weiß nicht, wer dieses printf() in Verbindung mit MySQL und PHP 4.x hier eingeführt hat. Das ist obolete.

                  Der Query-String wird ganz normal durch

                  $sql = "update $table set $sets where $where" oder  *1)
                  $sql = "select $fields from $table $where $order $limit"

                  usw

                  zusammengestellt und dann mit

                  $res = mysql_query($sql,$con);

                  abgesetzt.

                  Wenn jetzt in den STRINGS von $fields, $table, $where, $sets, ...
                  unerlaubte Zeichen drinstehen, dann geht entweder das Query schief (das ist
                  noch gut) oder die Datenbank krachen.

                  *1) "where" steht hier absichtlich NICHT innerhalb des $where, da für den Fall eines Fehlers (Fehlen von $where) auch keine Beschädigung an der Datenbank stattfindet. Es gibt nur einen Fehler für die WHERE-CLAUSE.

                  Alle API-Funktionen für datenverändernde Queries solte man so aufbauen. Wenn wirklich keine Einschränkung vorhanden ist, kann man immer noch
                  "$primary = $primary" schreiben oder wenn man tatsachlich den Autoincrement zurücksetzen muss, ein spezielles Query dafür vorhalten.

                  Liebe Grüße aus http://www.braunschweig.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  1. Hallo Tom,

                    wenn ich den Code ausführe den du aufgeschrieben hast dann logt er sich aber nicht ein.

                    Muß ich nun noch irgendwas umparsen?

                    Gruß Sabine

                    1. Hello,

                      wenn ich den Code ausführe den du aufgeschrieben hast dann logt er sich aber nicht ein.
                      Muß ich nun noch irgendwas umparsen?

                      Hast Du denn die Abfrage von magic_quotes_gpc() berücksichtigt?

                      Liebe Grüße aus http://www.braunschweig.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      1. Hast Du denn die Abfrage von magic_quotes_gpc() berücksichtigt?

                        Nee was für eine Abfrage oder wozu?

                        Ich habe per phpinfo geschaut ob es auf meinem Server auf on steht und da wurde mir gesagt es steht auf on

                        1. Hello,

                          Hast Du denn die Abfrage von magic_quotes_gpc() berücksichtigt?
                          Nee was für eine Abfrage oder wozu?

                          Wirklich gut gekontert *grins*

                          Ich habe per phpinfo geschaut ob es auf meinem Server auf on steht und da wurde mir gesagt es steht auf on

                          Das ist fein. Und wie brückschtigst Du das in dienen Scripts bei der Datenübernahme aus den Super-Globals?

                          Liebe Grüße aus http://www.braunschweig.de

                          Tom

                          --
                          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                          1. Das ist fein. Und wie brückschtigst Du das in dienen Scripts bei der Datenübernahme aus den Super-Globals?

                            Wieso Super-globals? Ich weiß nicht was Du mir nun damit sagen willst?

                            $username und $passwort bekomme ich aus meiner formular ausgabe/eingabe geliefert.

                            und dann wird das script aufgerufen aber nichts passiert...

                            benutze ich das alte script läuft alles wunderbar aber da ist nicht viel anders nur das mysql_escape_string

                            und mysql_escape_string ersetzt ein ' durch ein ' aber wenn ich zb

                            als username sabine und als passwort geheim eingebe sollte er sich auch einloggen aber er macht nichts

                            ich habe da schon die abfrage umgebaut aber auch da geht nichts

                            so langsam verstehe ich gar nichts mehr :-(

                            1. Hello,

                              Das ist fein. Und wie brückschtigst Du das in dienen Scripts bei der Datenübernahme aus den Super-Globals?
                              Wieso Super-globals? Ich weiß nicht was Du mir nun damit sagen willst?
                              $username und $passwort bekomme ich aus meiner formular ausgabe/eingabe geliefert.
                              und dann wird das script aufgerufen aber nichts passiert...
                              benutze ich das alte script läuft alles wunderbar aber da ist nicht viel anders nur das mysql_escape_string
                              und mysql_escape_string ersetzt ein ' durch ein ' aber wenn ich zb
                              als username sabine und als passwort geheim eingebe sollte er sich auch einloggen aber er macht nichts
                              ich habe da schon die abfrage umgebaut aber auch da geht nichts
                              so langsam verstehe ich gar nichts mehr :-(

                              Ok, also dann fangen wir bei Adam an. Dann kam irgendwann Eva und dann der Apfel. Den Apple gibt es zwar heute noch, aber ich habe hier nur einen Intel-Kompatiplen (AMD).

                              Hat aber alles nicht direkt mit PHP zu tun.

                              Wenn ein Script aufgerufen wird, stellt der Server (hier Apache) die beim Aufruf übermittelten Daten dem Script im Environment zur Verfügung. Beim guten alten DOS war das auf 126 Bytes beschränkt und konnte später auf xBytes erwitert werden. Bei Betriebssystemen woe Unix/Linux und auch den deren Nachbauten in der bunten Bilder Welt ist das Environment nahezu unbeschränkt.

                              Das Script erhält also Daten zur Verwendung.

                              Diese Daten wurden früher in PHP nahezun ohne Rücksichtcht auf den Kanal, über den sie kanenm, als "Scriptvariablen" zur Verfügung gestellt. Das war bequem für den (denk-)faulen Programmierer, aber keinesfalls sicher. Man konnte nicht unterscheiden, ob ein REQUEST, POST, GET, PUT, DELETE, COOKIE, usw den Datentransfer ausgelöst hatte

                              Fehler und Fakes waren möglich.

                              Neuere PHP-Versionen haben sich darauf besonnen, die Daten getrennt nach Kanälen in Arrays bereit zu stellen. Als Ausgleich für die unbequemlichkeit der Aufteilung wurden diese Arrays zu "superglobalen Arrays" definiert. Das bedeutet, dass sie nun in jeder Ebene des Scriptes (jeder Funktion) erreichbar bereit stehen. Man sollte aber möglichst (Ausnahmen ...) nur lesend daruf zugreifen.

                              Deine Relevanten daten kommen also entweder in $_SESSION[x] oder in $_GET[x] im Script an. Die Einstellung "register-globals = on" sollte man/frau  schnellstens in "register-globals = off" wechseln.

                              Danach reden wir weiter

                              Liebe Grüße aus http://www.braunschweig.de

                              Tom

                              --
                              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                              1. ...) nur lesend daruf zugreifen.

                                Deine Relevanten daten kommen also entweder in $_SESSION[x] oder in $_GET[x] im Script an. Die Einstellung "register-globals = on" sollte man/frau  schnellstens in "register-globals = off" wechseln.

                                Das darf und kann ich nicht auf off stellen da mein Provider das auf on stehen hat und ich es auch brauche.

                                Aber was hat das nun mit magic_quotes_gpc() zutun?

                                ich habe schon versucht mit &username = $_POST['username']; zu arbeiten aber das funktioniert auch nicht es scheint woanders dran zuliegen :-(

                                1. Hello,

                                  ich habe schon versucht mit &username = $_POST['username']; zu arbeiten aber das funktioniert auch nicht es scheint woanders dran zuliegen :-(

                                  Dann doch eher so:

                                  $username = &$_POST['username'];

                                  Nun ist $username ein alias für $_POST["username"]

                                  Liebe Grüße aus http://www.braunschweig.de

                                  Tom

                                  --
                                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  3. Hello Sabine,

    Du scheinst zwar zu wissen, worum es fachlich geht, aber die fundamentalen Formen des menschlichen Umgangs miteinander noch nicht gelernt zu haben. Die Mesnschen hier lassen sich nicht gerne "verarschen".

    Ich rechne jetzt (auch) mit einer rhethorisch durchgetylten Antwort.

    Überleg es Dir noch einmal.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen