DaddyD: $_Session IE 7

Hallo,
ich habe jetzt schon alles ausprobiert, aber ich habe mein Login-Script im Internet Explorer 7 nicht zum laufen bekommen. Im FF und im IE6 und so geht es. Der Safari beim MAC weigert es sich beim ersten Versuch, dann macht er aber mit.

Hier der Code:

<?php
$page="index.php";
require_once('config.php');
#Load Design
require_once('design.php');

#Security striping
$_GET[expired]=strip_tags($_GET[expired]);
$_GET[logout]=strip_tags($_GET[logout]);
$_POST[submit_login]=strip_tags($_POST[submit_login]);
$_POST[login_email]=strip_tags(strtolower($_POST[login_email]));
$_POST[password]=strip_tags($_POST[password]);

#Reason for automatic logoff
$expired=$_GET[expired];
$logout=$_SESSION["session_id"];

if ($logout) {
 $result=mysql_db_query($db,"UPDATE users SET accesstime='0' WHERE session_id='$logout'");
 $result=mysql_db_query($db,"UPDATE users SET userip='0' WHERE session_id='$logout'");
 $result=mysql_db_query($db,"UPDATE users SET session_id='0' WHERE session_id='$logout'");
}

#Login Check
$submit_login=$_POST[submit_login];
$login_email=$_POST[login_email];
$password=md5($_POST[password]);
if ($submit_login=="login" AND $login_email!="0") {
 $password_db_query=mysql_db_query($db,"SELECT id,password FROM users WHERE login_email=LOWER('$login_email')");
 $expired="login_email";
 while ($password_db = mysql_fetch_array($password_db_query,MYSQL_NUM)) {
  if ($password_db[1]) {
   if ($password==$password_db[1]) {
    $logintime=time();
    $userid=$password_db[0];
    $session_id=md5($logintime.$login_email.$userid);
    $userip=$_SERVER['REMOTE_ADDR'];
    $result=mysql_db_query($db,"UPDATE users SET session_id='$session_id' WHERE id='$userid'");
    $result=mysql_db_query($db,"UPDATE users SET accesstime='$logintime' WHERE id='$userid'");
    $result=mysql_db_query($db,"UPDATE users SET userip='$userip' WHERE id='$userid'");
    $_SESSION["session_id"]=$session_id;
    $host  = $_SERVER['HTTP_HOST'];
    $uri  = rtrim(dirname($_SERVER['PHP_SELF']), '/\');
    header('P3P: CP="NOI NID ADMa OUR IND UNI COM NAV"');
    header("Location:http://$host$uri/nextpage.php");
    session_write_close();
    die();
   }
   else { $expired="password"; }
  }
 }
}
#End Login Check

#Start HTML
echo "<html>
<head>
<title>Login".date("Y-m-d")."</title>

<script language='JavaScript' type='text/javascript'>
<!--
function check_js() {
 document.login.submit_login.disabled=false;
}
//-->
</script>

</head>
<body bgcolor=#FFFFDF onload='check_js();'>

<form action='$PHP_SELF' method='POST' name='login'>
<table border=0>
<tr><th colspan=2>Login</th></tr>
<tr><td>E-Mail-Address:</td><td><input type='text' name='login_email' size='20' maxlength='50' value='$login_email' tabindex='1'></td></tr>
<tr><td>Password:</td><td><input type='password' name='password' size='20' maxlength='30' tabindex='2'></td></tr>
<tr><td><font size=2><a href='forgotpwd.php'>Forgot your password?</a></font></td><td><input type='submit' name='submit_login' value='login' tabindex='3' disabled></td></tr>
<tr><td colspan=2><center></center></td></tr>
</table>
</form>
<noscript>
Please turn on JavaScript<br>
</noscript>";

#Check Reason for automatic logoff
if ($expired) {
 if ($expired=="session_id") { echo "Your Session-ID is invalid"; }
 if ($expired=="timeout") { echo "Site was not used for too long"; }
 if ($expired=="login_email") { echo "E-Mail-Address not found"; }
 if ($expired=="password") { echo "Invalid Password"; }
 if ($expired=="ipconflict") { echo "Simultaneous login not allowed"; }
 echo "<br><br>";
}
#End Check Reason for automatic logoff

echo "</center>";

#Insert Bottom Line
bottom_line($session_id);

echo "</body>
</html>";
#End HTML
?>

config.php:
<?php

#Connecting Database ($db = Used Database)
$request=mysql_connect('127.0.0.1','xxxxxx','xxxxxx');
$db="xxxxxxx";

#Start Session
session_start();

?>

design.php:
<?php

#Bottom Line
function bottom_line($session_id) {
 echo "<div style='position:relative; bottom:-10px;'>
 <span style='color:black; font-size: 9; left:20px;'>(c) H. Mustermann 2007 <a href='impressum.php'>Impressum</a></span>
 </div>
 <div style='position:relative; bottom:-10px;'>&nbsp;</div>";
}
#End Bottom Line

?>

Hat jemand eine Idee?

Danke schon mal im Voraus.

  1. Hi!

    (PHP) $_Session IE 7
    ich habe jetzt schon alles ausprobiert, aber ich habe mein Login-Script im Internet Explorer 7 nicht zum laufen bekommen. Im FF und im IE6 und so geht es. Der Safari beim MAC weigert es sich beim ersten Versuch, dann macht er aber mit.

    Dann kann es sich aber nicht um ein PHP-Problem handeln.
    PHP läuft serverseitig. Wenn es Unterschiede in verschiedenen Browsern gibt, muß das ein clientseitiges Problem sein.

    Was heißt denn eigentlich "nicht zum Laufen bekommen"?
    Gibt es eine Fehlermeldung? Wenn ja, welche?
    Hast du die Rückgabewerte deiner Funktionen geprüft?

    Wird die Session auf dem Server gestartet? Kann ein Cookie gesetzt werden?
    Wird dieses in den HTTP-Header übermittelt?
    Ist die Annahme von Cookies in den Browsern zugelassen?

    Wo genau liegt das Problem? An welcher Stelle hängt das Script? Bis wohin wird alles noch fehlerfrei ausgeführt?

    $_GET[expired]=strip_tags($_GET[expired]);

    Das ist falsch.
    Statt $_GET[expired] muß es $_GET['expired'] heißen.
    (Und bei den folgenden Variablen ebenso.)
    Andernfalls versuchst du, eine nicht definierte Konstante zu nutzen.
    Da es diese halt nicht gibt, vermutet PHP dann mal einfach, daß du ein Array-Element meinst.
    Je nachdem, wie das error_reporting auf dem Server eingestellt ist, wird eine unschöne Meldung ausgegeben, was eventuell sogar dazu führen könnte, daß dein Script nicht mehr korrekt weiterarbeitet (z.B. wenn noch Header gesendet werden sollen.).

    $_POST[login_email]=strip_tags(strtolower($_POST[login_email]));

    Das strtolower() gefällt mir nicht und könnte eventuell zu Problemen führen.
    Emailadressen sind potentiell casesensitive!
    Daher würde ich es hier lassen, alles in Kleinbuchstaben umzuwandeln.

    $_POST[password]=strip_tags($_POST[password]);

    Warum entfernst du HTML-Tags aus einem Paßwort?
    Das soll doch sicherlich nicht angezeigt werden, oder?
    Und falls doch, dann solltest du an dieser Stelle nichts ändern, sondern bei der Ausgabe einfach ein htmlentities() drauf anwenden.
    Was wäre denn, wenn ein User sich "<html>" o.ä. als Paßwort ausgesucht hat?
    Sonderzeichen ist Paßwörtern sind ja keine schlechte Sache...
    Du solltest beim Paßwort jedenfalls nichts filtern.

    #Start HTML
    echo "<html>

    Hier solltest du erst einmal eine DTD-Angabe ausgeben.
    Außerdem frage ich mich, wieso du diesen langen Codeblock mit einem einzigen "echo" ausgibst?
    Hierfür würde sich ein Heredoc-Bereich viel besser anbieten.

    <script language='JavaScript' type='text/javascript'>

    Das language-Attribut ist deprecated.

    </head>

    Keine Angabe zum verwendeten Charset per Metatag?
    Sendet der Server diese Angabe als Header?

    <body bgcolor=#FFFFDF onload='check_js();'>

    Du hast ja keine DTD-Angabe gemacht, insofern weiß ich nicht, womit du wirklich arbeitest, aber trotzdem rate ich dazu HTML-Attribute in Anführungszeichen zu setzen.

    <form action='$PHP_SELF' method='POST' name='login'>

    $PHP_SELF gibt es nur, wenn register_globals in der php.ini auf "on" gestellt ist.
    Nutze in jedem Fall $_SERVER['PHP_SELF'].

    <table border=0>
    <tr><th colspan=2>Login</th></tr>

    Hui... Tabellen zu Designzwecken mißbrauchen...
    Warum setzt du kein CSS ein?
    Tabellen sollten nur für tabellarische Inhalte zum Einsatz kommen.

    <noscript>
    Please turn on JavaScript<br>
    </noscript>";

    Hahaha!
    Und was machen die User, die gar kein JS nutzen können?
    Wenn JS nicht zur Verfügung steht, dann ist es nicht immer der Fall, daß ein User dies deaktiviert hat.
    Vielleicht wird ein Client eingesetzt, der gar kein JS kann?
    Vielleicht liegt es auch an anderen Gründen, daß kein JS eingesetzt werden kann.
    Und wenn ein User JS deaktiviert hat, dann hat er dies aus einem bestimmten Grund getan.
    Dann wird er das sicher nicht bei so einer Meldung einschalten, sondern eher deine Seite verlassen.
    JS ist ja schön und gut, aber es sollte nur als Mehrwert dienen.
    Eine Site sollte auch immer ohne JS nutzbar sein.

    echo "</center>";

    Center-Tags...
    Auch dafür gibt es CSS.

    <span style='color:black; font-size: 9; left:20px;'>

    Font-Size 9? 9 was? Tomaten? Birnen?

    Und ansonsten sieht dein Script für mich recht wirr aus.
    Ich habe mir jetzt nicht die Mühe gemacht, zu schauen, wo da der Fehler liegen könnte.
    Du solltest das selber testen und den Fehler erst einmal etwas weiter einkreisen.

    Schöner Gruß,
    rob

    1. Danke erstmal für die kostruktive Kritik. Ich werde so viel wie möglich umsetzen.

      Die Session wird generiert, zumindest wenn ich sie in der index.php nochmal anspreche und mir den Wert (ohne die Weiterleitung) anschaue.
      In der angesprochen Datei:

      <?php
      error_reporting(E_ALL);

      session_start();

      echo "Ausgabe: ".$_SESSION["session_id"];
      ?>

      kommt dann als Ausgabe:

      Notice: Undefined index: session_id in /www/htdocs/c900134/public/test.php on line 6
      Ausgabe:

      Hier müsste nun eigentlich eine md5-Zahl hinter "Ausgabe: " stehen. Somit wird die eigentliche Seite nicht geladen, da die session_id nicht vorhanden ist.

      Wird die Session auf dem Server gestartet? Kann ein Cookie gesetzt werden?
      Wird dieses in den HTTP-Header übermittelt?

      Wie sehe ich das? Ich kann auf den Server nicht viel Einfluss nehmen.

      Ist die Annahme von Cookies in den Browsern zugelassen?

      Ja.

      Das strtolower() gefällt mir nicht und könnte eventuell zu Problemen führen.
      Emailadressen sind potentiell casesensitive!

      Ich habe das gemacht, da die Abfrage an die Datenbank nicht casesensitive ist und somit man mehrere "Benutzer" anmelden kann, aber die Datenbank dann alle raussucht, anstatt nur einen.

      Grüße,

      Dominik

      1. Hi!

        <?php
        error_reporting(E_ALL);

        session_start();

        echo "Ausgabe: ".$_SESSION["session_id"];
        ?>

        kommt dann als Ausgabe:

        Notice: Undefined index: session_id in /www/htdocs/c900134/public/test.php on line 6

        Wie sollte denn hier auch $_SESSION["session_id"] vorhanden sein?
        Erst nach erfolgreichem Login erzeugst du doch erst dieses Array-Element.

        Wieso erzeugst du die Session-ID denn eigentlich selber?

        Schöner Gruß,
        rob

        1. So ich vereinfache das Problem jetzt mal:

          mit dem Quelltext:

          start.php:
          <?php
          session_id();
          session_start();
          $session_id=md5("Hallo");
          $_SESSION['session_id']=$session_id;

          $host  = $_SERVER['HTTP_HOST'];
          $uri  = rtrim(dirname($_SERVER['PHP_SELF']), '/\');

          header("Location:http://$host$uri/test.php");
          session_write_close();

          ?>

          <?php
          error_reporting(E_ALL);
          session_start();

          print_r($_SESSION);
          echo $PHPSESSID;
          $session_id=$_SESSION['session_id'];
          echo "Ausgabe: ".$session_id;
          ?>

          Kommt als Ausgabe der test.php unter Safari:

          Array ( )
          Notice: Undefined variable: PHPSESSID in /www/htdocs/w0086505/public/test.php on line 6

          Notice: Undefined index: session_id in /www/htdocs/w0086505/public/test.php on line 7
          Ausgabe:

          Ich habe jetzt mal noch verschiedene Dinge ausprobiert. Ich es klappt, wenn ich das Script local und mit der direkten Adresse auf dem Server anspreche, aber über eine nic.de.vu adresse geht es nicht.
          Zu meinem Script vorher, da geht es auch über die direkte Adresse nicht.
          Im Safari wird aber ganz misteriöser weise die PHPSESSID bei den Cookies angezeigt, aber in der Ausgabe als undefiniert betrachtet.

          Dominik

        2. Hallo,
          ich habe mein Problem gefunden. Die Session wird nicht weitergegeben, da nic.de.vu eine Frameseite generiert.

          Ich gebe jetzt einfach auf und leite auf meine richtige domain um.

          Dominik