chris: Session Start mit PHP 4.0.6

Hi,

baue mir gerade ein Login mit Sessions.

Komme aber nicht weiter, bitte um Hilfe.

Habe eine Datei indem in einem Formular das Passwort abgefagt wird
und bei senden auf folgende Seite verlinkt ist und das Passwort mit "POST" weitergegeben wird.
Im folgenden Quelltext stimmt aber was nicht...

<?php
include("pwd.dat.php");
if(!isset($pwd) OR $pwd != $password){
header("location: mlog.php?p=0");
}
else {
session_start();
$_SESSION["pwd"]=$pwd;
$sid=session_id();
header("location: main.php?sid=".$sid);
}
?>

danke.

  1. Hallo,

    Habe eine Datei indem in einem Formular das Passwort abgefagt wird
    und bei senden auf folgende Seite verlinkt ist und das Passwort mit "POST" weitergegeben wird.
    Im folgenden Quelltext stimmt aber was nicht...

    $_SESSION["pwd"]=$pwd;

    $_SESSION[] gibt es erst ab PHP 4.1. Verwende daher $HTTP_SESSION_VAR[].

    MfG, Thomas

    1. $_SESSION[] gibt es erst ab PHP 4.1. Verwende daher $HTTP_SESSION_VAR[].

      ^
                                                             $HTTP_SESSION_VARS[]

      MfG, Thomas

      1. Hi,

        der Ursprung sieht eigentlich so aus:

        <?
        include("pwd.dat.php");
        if(!isset($_POST["pwd"]) || $_POST["pwd"]!=$password){
        header("location: index.php?msg=Falsches Passwort oder Login ist fehlgeschlagen. Bitte erneut versuchen!");
        }else{
        session_start();
        $_SESSION["pwd"]=$_POST["pwd"];
        $sid=session_id();
        header("location: main.php?sid=".$sid);
        }
        ?>

        da ich aber PHP 4.0.6 habe und auch nicht umsteigen kann,
        habe ich es umgeschrieben so:

        <?php
        include("pwd.dat.php");
        if(!isset($pwd) OR $pwd != $password){
        header("location: mlog.php?p=0");
        }
        else {
        session_start();
        $HTTP_SESSION_VAR["pwd"]=$pwd;
        $sid=session_id();
        header("location: main.php?sid=".$sid);
        }
        ?>

        Diese Fehler erscheinen dann im Explorer:

        Warning: open(/tmp\sess_307f5cca224528eeafcbbdded28f744d, O_RDWR) failed: m (2) in c:\web\mlog\login.php on line 7

        Warning: Cannot add header information - headers already sent by (output started at c:\web\mlog\login.php:7) in c:\web\mlog\login.php on line 10

        danke

        1. Hallo,

          Warning: open(/tmp\sess_307f5cca224528eeafcbbdded28f744d, O_RDWR) failed: m (2) in c:\web\mlog\login.php on line 7

          Ich hatte das "S" in $HTTP_SESSION_VARS noch nachtraeglich korrigiert.

          Warning: Cannot add header information - headers already sent by (output started at c:\web\mlog\login.php:7) in c:\web\mlog\login.php on line 10

          Offenbar steht die header-Ausgabe nicht ganz am Anfang bzw. es wird vorher bereits HTML-Code ausgegeben.

          MfG, Thomas

          1. Hallo Thomas,

            Warning: Cannot add header information - headers already sent by (output started at c:\web\mlog\login.php:7) in c:\web\mlog\login.php on line 10
            Offenbar steht die header-Ausgabe nicht ganz am Anfang bzw. es wird vorher bereits HTML-Code ausgegeben.

            nein, in dem Fall nicht - php gibt aufgrund eines Fehlers in Zeile 7 eine Warnung, die nicht zum Abbruch führt, aus (und damit natürlich auch einen header) - dannach kommt php zu der Zeile mit dem header(...) was natürlich nicht funktioniert, da der header durch die Fehlermeldung schon verschickt ist.

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            1. Hi,

              wie ändert man dass?

              Es wird doch entweder oder ausgeführt und nicht beide.

              Und ich habe das S bei VARS hinzugefügt und die Fehlermeldung ist dennoch da.

              mfg chris

              1. Hallo chris,

                Und ich habe das S bei VARS hinzugefügt und die Fehlermeldung ist dennoch da.

                du musst natürlich alle $_SESSION[...] durch die ältere Version austauschen - aber auch $_POST[...] durch $HTTP_POST_VARS[...] ersetzen ($_POST gibt es auch erst seit php4.1)
                siehe auch http://www.php.net/manual/en/language.variables.predefined.php

                Grüße aus Nürnberg
                Tobias

                --
                Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
                1. Hi,

                  ich blicke da nicht mehr durch. Habe alles geändert, kommen aber noch die gleichen Fehler!
                  Habe die Passwörter jetzt anders gespeichert und rufe diese bei bedarf ab.
                  Hier der Code:

                  <?php
                  $curdir = dirname($HTTP_SERVER_VARS["PHP_SELF"]);
                  if ($curdir == "/") { $curdir = ""; }
                  $une = $HTTP_POST_VARS["uname"];
                  if (file_exists("../../daten/oall/pw/$une.dat")) {
                  $tf = fopen ("../../daten/oall/pw/$une.dat", "r-");
                  $name = fgets ($tf,25);
                  $name = substr ($name, 0, strlen ($name) - 1);
                  $password = fgets ($tf,10);
                  $password = substr ($password, 0, strlen ($password) - 1);
                  $status = fgets ($tf,5);
                  fclose ($tf); }
                  else { header("location: http://".$HTTP_SERVER_VARS["HTTP_HOST"].$curdir."/mlog.php?p=0"); }
                  if (!isset($HTTP_POST_VARS["pwd"]) OR $HTTP_POST_VARS["pwd"] != $password){
                  header("location: http://".$HTTP_SERVER_VARS["HTTP_HOST"].$curdir."/mlog.php?p=0"); }
                  else {
                  if (file_exists("../../daten/oall/pw/$uname.dat") AND $HTTP_POST_VARS["pwd"] == $password) {
                  session_start();
                  $HTTP_SESSION_VARS["pwd"]=$HTTP_POST_VARS["pwd"];
                  $sid=session_id();
                  header("location: http://".$HTTP_SERVER_VARS["HTTP_HOST"].$curdir."/main.php?sid=".$sid);
                  }}
                  ?>

                  1. Hi,

                    bin selbst zwar auch noch recht unerfahren im Umgang mit PHP, aber wie ich dir schon schrieb, liegt der Fehler mit an Sicherheit grenzender Wahrscheinlichkeit darin, daß Du zuvor schon etwas an den Browser schickst (was genau weiß ich natürlich nicht). Vielleicht sind nebenbei _auch_ die Bezeichner deiner Systemvariablen nicht ganz korrekt, kann ich aber nicht weiter beurteilen, da ich PHP 4.3 nutze.

                    An deiner Stelle würde ich folgendes probieren:

                    1. ganz am Anfang der Datei/Scripts (den anderen Aufruf von session_start() mußt natürlich löschen ...)

                    <?php
                    session_start();

                    ich blicke da nicht mehr durch. Habe alles geändert, kommen aber noch die gleichen Fehler!

                    ich/wir auch nicht ... übersichtlicher code hilft oft ... nicht nur anderen, sondern auch dir selbst ;-)

                    1. Würde mir nochmal ganz genau anschauen, welche Anführungszeichen du wann verwendest.

                    ... header("location: http://".$HTTP_SERVER_VARS["HTTP_HOST"].$curdir."/mlog.php?p=0")

                    ^^
                    so zumindest ist es IMHO nicht korrekt.

                    HTH
                    Frankie

                  2. Hallo chris,

                    Habe alles geändert, kommen aber noch die gleichen Fehler!

                    welchen? dessen Behebung Christian in [pref:t=56048&m=313245] unten beschrieben hat?

                    Habe die Passwörter jetzt anders gespeichert und rufe diese bei bedarf ab.

                    wie speicherst du die Passwörter?

                    $tf = fopen ("../../daten/oall/pw/$une.dat", "r-");

                    was ist "r-"? "r" und "r+" kenn ich ja, aber "r-"...

                    Grüße aus Nürnberg
                    Tobias

                    --
                    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        2. Hallo chris,

          der Ursprung sieht eigentlich so aus:
          header("location: index.php?msg=Falsches Passwort oder Login ist fehlgeschlagen. Bitte erneut versuchen!");

          Urgs. Woher hast Du denn das?

          Also Location-Header wird eigentlich eine absolute URI erwartet. Weder die Kriterien "absolut" noch "URI" wird von diesem Wert des Location-Headers erfüllt.

          $curdir = dirname($HTTP_SERVER_VARS['PHP_SELF']);
          if ($curdir == '/') {
            $curdir = '';
          }
          $msg = 'Falsches Passwort oder Login ist fehlgeschlagen. Bitte erneut versuchen!';
          Header ('Location: http://'.$_SERVER["HTTP_HOST"].$curdir.'/index.php?msg='.urlencode ($msg));

          da ich aber PHP 4.0.6 habe und auch nicht umsteigen kann,

          PHP 4.0.6 hat aber einige Sicherheitslücken, die in späteren Versionen korrigiert wurden. Ich würde Dir ein Upgrade _dringend_ ans Herz legen.

          Warning: open(/tmp\sess_307f5cca224528eeafcbbdded28f744d, O_RDWR) failed: m (2) in c:\web\mlog\login.php on line 7

          Du musst in Deiner php.ini den session.save_path anpassen, damit er auf ein gültiges Verzeichnis zeigt. /tmp scheint es bei Dir nicht zu geben.

          Viele Grüße,
          Christian

          1. Hallo nochmal,

            Header ('Location: http://'.$_SERVER["HTTP_HOST"].$curdir.'/index.php?msg='.urlencode ($msg));

            Natürlich ist bei PHP 4.0.6 $_SERVER Quatsch... Sorry... Meinte natürlich $HTTP_SERVER_VARS.

            Viele Grüße,
            Christian

  2. Hallo Chris,

    Unabhängig von dem Problem solltest Du Dein PHP aus Sicherheitsgründen und neuen Features auf die aktuellste Version 4.3.3 updaten.

    Habe eine Datei indem in einem Formular das Passwort abgefagt wird
    und bei senden auf folgende Seite verlinkt ist und das Passwort mit
    "POST" weitergegeben wird.

    Ok...

    Im folgenden Quelltext stimmt aber was nicht...

    <?php
    include("pwd.dat.php");
    if(!isset($pwd) OR $pwd != $password){
    header("location: mlog.php?p=0");
    }
    else {
    session_start();
    $_SESSION["pwd"]=$pwd;
    $sid=session_id();
    header("location: main.php?sid=".$sid);
    }
    ?>

    Soweit scheint doch alles zu stimmen, es wird eine Datei included, eine if-else-Schleife testet ob ein Passwort existiert und ob es mit einer Variablen übereinstimmt etc... also von der Syntax scheint ja alles zu passen. Du beschreibst leider nicht was passiert und was passieren sollte, "funktioniert nicht" hilft leider keinem weiter... :-)
    Was hast Du bisher zu Fehlersuche eingesetzt? Hast Du vor der Schleife Dir die Variablen $pwd und $passwort ausgeben lassen? Gibt es in PHP 4.06 eigentlich schon die Superglobale $_SESSION oder heisst es dort nicht noch $HTTP_SESSION_VARS? Teste es im Zweifelsfall doch mal mit der alten Schreibweise.
    Ansonsten hilft eine genauere Fehlerbeschreibung und die Beschreibung Deiner Debugergebnisse sehr weiter!

    Gruss AndreD

  3. Hallo,

    da Du uns deinen kompletten Code vorenthältst, kann ich nur mutmaßen, daß - unabhängig davon was andere schon dazu (richtiges) geschrieben haben - dein Fehler darin liegen könnte, daß Du in deiner pwd.dat.php schon irgendwas an den Browser schickst.

    Dafür spricht die Fehlermeldung (die Du weiter unten schreibst):

    Warning: Cannot add header information - headers already sent by (output started at c:\web\mlog\login.php:7) in c:\web\mlog\login.php on line 10

    [Zitat aus dclp-faq]
    Wie bei allen anderen HTTP-Headern, darf auch vor dem Setzen von Cookies (Sessionfunktionen von PHP4 benutzen standardmäßig Cookies) kein einziges Byte des Codes an den Client gesendet werden. Erst wenn alle HTTP-Header gesendet worden sind, dürfen entsprechende Daten (z. B. HTML) gesendet werden.

    Typische Stolperfallen sind Leerzeichen bzw. -zeilen vor dem ersten <? bzw. <?php Delimiter des Scripts oder mit include() oder require() importierte Scriptfragmente, die natürlich gar keine Ausgabe produzieren dürfen - weder vor dem ersten Delimiter, noch dazwischen, noch nach dem letzten.
    [/Zitat]

    HTH & Gruß
    Frankie