myrte: Session: Was ist hier los?

Beitrag lesen

Hallo.

Ich bin gerade dabei, ein Forum zu programmieren. Auf meinem Rechner (XAMPP für Windows) läuft alles Reibungslos, so wie ich es will. Doch dann hochgeladen, schon funktioniert es nicht mehr.
Auf meinem Rechener habe ich PHP 5.0.2, der Webspace hat PHP 4.x.x.
Das Problem liegt also an den Sessions.

Ich versuche es euch zu erklären:

Die ganze Sache basiert auf Sessions. Wenn sich ein Benutzer einloggt (auf der index.php), wird die session_id in eine Datei geschrieben. Dies alles macht die Datei login.php. Außerdem leitet sie dann wieder auf die index.php zurück. Jetzt aber mit "index.php?user=[NAME]". Hier wird jetzt geprüft, ob die aktuelle Session_id mit der in der Datei des Users übereinstimmt. Wenn ja, dann ist er logischerweise eingeloggt, es wird der Text "Du bist eingeloggt" angezeigt. Wenn nicht, dann wird ein Forumular angezeigt, mit dem man sich einloggen kann.

Hier ist schon mal der Quelltext der index.php. Ich habe die session_start() auskommentiert, weil PHP4 diese automatisch startet, während mein PHP5 dies nicht tut.

-------------------------------------------------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Forum</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="pragma" content="no-cache">

<link rel="stylesheet" href="style.css">

<script type="text/javascript">
 function fctpopup(){
  F1 = window.open("new_forum.php","PopUp","width=700,height=500,top=50,left=50,resizable=no");
 }
</script>

</head>

<!-- HHHHHHHHHHHHHHHHHHHHHHHHHHH -->

<body>

<?php // /*Session starten*/ session_start(); ?>

<div style="text-align:right; margin-right:20px; margin-top:10px;"><img src="titel.gif"></div>

<?php

// Wenn index.php?user=NAME, dann hole dem User seine session_id
$dh=@fopen("members/$user/session.ghi","r+");

// Wenn momentane session_id mit der in der Datei übereinstimmt, dann ist man eingeloggt. Bestätigung anzeigen
if(session_id() == @file_get_contents("members/$user/session.ghi")){
 echo("<br>\n
 <div style="text-align:right; width:100%; background-color:#CCCC99; left:0;">
  <strong>Du bist eingeloggt</strong>

<div style="float:left; vertical-align:top;">
   <form action="logout.php" method="get">
    <input type="submit" value="Ausloggen">
   </form>
  </div>
 </div>\n\n
 ");
 }

else{
// Wenn die momentane session_id NICHT mit der in der Datei übereinstimmt, dann ist man nicht eingeloggt. Formular zum einloggen anzeigen
 echo("
<div style="width:100%; text-align:right;">
 <form action="login.php" method="get">
  <div style="float:left;">Einloggen:</div>
  Name:&nbsp;<input type="text" name="usr_name">&nbsp;
  Passwort:&nbsp;<input type="password" name="usr_psw">&nbsp;
  <input type="submit" value="Einloggen">
 </form>
</div>\n\n
");

}

@fclose($dh);

// Öffne Ordner "cont", in dem die Einträge des Forums sind
$dh  = opendir("cont");
while (false !== ($filename = readdir($dh))) {
   $files[] = $filename;
}

sort($files);

array_shift($files);
array_shift($files);

echo "<br>\n";

// Jetzt alle vorhandenen Foren auflisten, in abwechselnder Farbe. Diese wird durch Wechseln der Variable $i gewährleistet
echo "<table border="0" cellpadding="0" cellspacing="0" bordercolor="#000000" class="overvw">\n";
$i=0;

foreach($files as $entry){

// Erste zwei Zeichen aus $entry entfernen
$new_entry = explode(" ",$entry);
array_shift($new_entry);
$entry=implode(" ",$new_entry);

// Tabelle in Abhängigkeit von Ordnern zeichnen
if($i==0){
  echo "<tr>\n<td bgcolor="#00FFCC" width="70%"><a href="#">$entry</a></td>\n";
  echo "<td bgcolor="#00FFCC" width="30%">Letzter Post</td>\n</tr>\n\n";
  $i=1;
   }
else{
  echo "<tr>\n<td bgcolor="#CCFFCC" width="70%"><a href="#">$entry</a></td>\n";
  echo "<td bgcolor="#CCFFCC" width="30%">Letzter Post</td>\n</tr>\n\n";
  $i=0;
 }
}

echo "</table>\n";
echo "<br>";

?>

<div class="div_new_topic"><br><a onclick="fctpopup()" href="">Neues Forum eröffnen</a></div>
<div class="div_bottom">- Registrieren - Wer ist registriert? - Wer ist gerade online? - Gehts auch ohne Registrierung? - Benutzereinstellungen - </div>

</body>
</html>

----------------------------------------------------------

Die login.php:

----------------------------------------------------------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
 <title>LogIn</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php // session_start() ?>

<?php

$usr_name=ucfirst($usr_name);

$usr_psw=md5($usr_psw);

$dh  = opendir("members");
while (false !== ($filename = readdir($dh))) {
   $files[] = $filename;
}

sort($files);

array_shift($files);
array_shift($files);

if(!(in_array($usr_name,$files))){
 echo("<h3>Benutzer nicht registriert</h3>\nBitte versuche nicht, andere Benutzerkonten zu knacken, du wirst es nicht schaffen.<br><br>\n\n");
 echo("<h4>Wenn du dich nur verschrieben hast, dann versuche es hier nochmals:<br>");

echo("
  <form style="font-family:Arial, Helvetica, sans-serif; font-size:12px;" action="login.php" method="get">
   Name:&nbsp;<input type="text" name="usr_name">&nbsp;
   Passwort:&nbsp;<input type="password" name="usr_psw">&nbsp;
   <input type="submit" value="Einloggen">
  </form>
");
}

else{
 $dh=fopen("members/$usr_name/pw.ghi","r+");
 $usr_psw_rl=file_get_contents("members/$usr_name/pw.ghi");

/*
 echo($usr_psw_rl);
 echo("<br>");
 echo($usr_psw);
 */

$dh2=fopen("members/$usr_name/session.ghi","r+");

if($usr_psw==$usr_psw_rl){
  fwrite($dh2,session_id());
  echo("<script type="text/javascript">self.location="index.php?user=$usr_name"</script>");
 }

fclose($dh2);
 fclose($dh);

}

?>

</body>
</html>

----------------------------------------------------------

Also. Das Problem ist, dass ich auf der hochgeladenen Seite (die auf dem Webspace) sofort eingeloggt bin. Unter meinem PHP5 muss ich erst den Namen und Passwort eintragen, um eingeloggt zu sein.

Entscheidend ist auch noch die Ordnerstruktur, nach dem dieses Forum geht:

-------------------------------------------------------------

  • forum
        index.php
        login.php
        logout.php
        new_forum.php
        [...]
        + members
            + User1
                pw.ghi
                session.ghi
                status.ghi
                [...]
            +User2
                pw.ghi
                session.ghi
                status.ghi
                [...]
            [...]
        +cont
            + Topic1
            + Topic2
            + Topic3
            [...]
    -------------------------------------------------

Wo liegt hier der Fehler? Bin ich weider mal zu blond, so was zu machen?

Danke, eure myrte.

PS. : Seid bitte nicht böse, dass ihr den gesamten Quelltext zu lesen bekommt, ich will nur, dass ihr mein Problem versteht...