daChris: Warning: session_start()

Hallo,

Ich benutze Session-Variablen und habe folgende Fehlermeldungen:

Warning: session_start() [function.session-start]: open(/home/www/htdocs/[...].de/tmp/sess_428ea2adf88551f567529b6437bfc238, O_RDWR) failed: No such file or directory (2) in /home/www/htdocs/[...].de/index.php on line 3

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/www/htdocs/[...].de/index.php:1) in /home/www/htdocs/[...].de/index.php on line 3

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/www/htdocs/[...].de/index.php:1) in /home/www/htdocs/[...].de/index.php on line 3

Warning: Unknown(): open(/home/www/htdocs/[...].de/tmp/sess_428ea2adf88551f567529b6437bfc238, O_RDWR) failed: No such file or directory (2) in Unknown on line 0

Warning: Unknown(): Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/home/www/htdocs/[...].de/tmp) in Unknown on line 0

Hier der abgespeckte Quellcode:

<?php echo "<?xml version="1.0"?".">"; ?>
<?php
session_start();

$text="Hallo";
session_register( "text" );

echo $text;
?>

Warum funzt das auf dem Server nicht?

  1. $text="Hallo";
    session_register( "text" );

    Warum funzt das auf dem Server nicht?

    1. Weil du vielleicht die Einstellungen unter php.ini für Sessions falsch eingestellt hast?

    2. Weil die Syntax falsch ist?

    http://www.php.net/manual/de/ref.session.php

    1. Hallo,

      ich komme da glaub ich nicht an PHP.INI ran, bin bei Evanzo...

      Tschau.

      1. Hallo,

        du kannst Dir aber sicher die php.ini anschauen? Die Datei lautet normalerweise "phpinfo.php"

        Gruß

        Mustino

        1. Hallo,

          die findsch nicht auf der Domain, wie das Unterverzeichnis lautet, weiß ich leider auch nicht...

          Tschau.

          1. Hi,

            <?php
              phpinfo();
            ?>

            muss es lauten. Sorry.

            1. Hallo,

              hab ne Idee, hab nen tmp Ordner gefunden, aber hab windoof und kein Unix/Linux, wie kann ich dort die Berechtigung verändern, CHMOD ist mir bekannt aber wie komme ich druff?

              Tschau.

              1. Hallo,

                möchtest du deine *.php Datei lokal ausführen, also auf Deinem Windows-Rechner oder willst du sie bei deinem Provider ausführen?

                Und wo hast du den /tmp Ordner gefunden?

                • Falls Dein Provider Unix nutzt, dann ist die Einstellung wahrscheinlich richtig.

                • Willst du aber die Datei lokal ausführen und bist Windows-User, dann solltest du es unter C:\Windows\php.ini die Einstellung auf C:\Windows\Temp ändern.

                Gruß

                Mustino

                1. Hallo,

                  Ich jetzt folgende Mail gekriegt:
                  Fuer PHP-Sessions und PHP-Upload muessen Sie dem Verzeichniss
                      /tmp das Recht CHMOD 777  (rwxrwxrwx) geben.

                  Tja, könnte man per PHP mit chmod() ändern?

                  Tschau.

                  1. Moin!

                    Ich jetzt folgende Mail gekriegt:
                    Fuer PHP-Sessions und PHP-Upload muessen Sie dem Verzeichniss
                        /tmp das Recht CHMOD 777  (rwxrwxrwx) geben.

                    Tja, könnte man per PHP mit chmod() ändern?

                    "Könnte" - ja, wenn die Eigentumsrechte passen.
                    "Kann" - wohl eher nicht, weil die Eigentumsrechte nicht passen.

                    Log dich per FTP ein und regel das dort.

                    - Sven Rautenberg

                    1. Hallo,

                      ich hab das jetzt per LIST CHMOD 777 [...] gemacht,
                      funzt, aber zwei von sieben hab ich noch:

                      Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/www/htdocs/[...]/index.php:1) in /home/www/htdocs/[...]/index.php on line 3

                      Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/www/htdocs/[...]/index.php:1) in /home/www/htdocs/[...]/index.php on line 3

                      wie kann ich das beheben?

                      Tschau.

                      1. Hallo,

                        Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/www/htdocs/[...]/index.php:1) in /home/www/htdocs/[...]/index.php on line 3

                        Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/www/htdocs/[...]/index.php:1) in /home/www/htdocs/[...]/index.php on line 3

                        wie kann ich das beheben?

                        Bevor du session-start ausführst darf der Header noch nicht gesendet worden sein. Das ist insbesondere dann der Fall, wenn du schon vorher irgendwelche Ausgaben mit HTML tätigst, auch ein einzelnes Leerzeichen reicht schon.

                        Gruß,
                        Henning

                        1. Hallo,

                          He, danke, das war's.
                          Der Dank geht an alle.

                          Noch nen schönen Samstag Tschau.

      2. Hallo,

        um Einsicht in die PHP-Datei von deinem Provider zu Gewinnen machst du folgendes:

        Erstelle eine PHP-Datei mit folgendem Inhalt:

        <?php
        phpinfo()
        ?>

        und speichere diese in deinem Stammverzeichnis als info.php ab.
        Anschließend gibst du in deinem Browser die URL:

        http://www.deine-domäin.de/info.php

        Dann kannst du die Einstellungen des Servers sehen.

        Gruß

        Mustino

        1. Hallo,

          hab ich schon gemacht. Nützte mir leider nix.

          Tschau.

      3. Moin!

        ich komme da glaub ich nicht an PHP.INI ran, bin bei Evanzo...

        Die Fehlermeldung sagt: PHP kann die in der Session abgelegten Variablen nicht speichern, weil das konfigurierte Verzeichnis dafür nicht existiert.

        Da das normalerweise auf einem angemieteten Serverwebspace aber funktionieren sollte, schreibst du einfach deinem Provider eine Mail, dass er das in Ordnung bringen möge.

        Fehlermeldung rein, so wie in deinem Posting hier, vielleicht noch Beispielcode zum Demonstrieren (oder Link auf Beispielprogramm), und gut ist.

        Es gibt eben Dinge, die kann man als Kunde nicht selber regeln - und außerdem muß der Support, den man mitbezahlt, ja für irgendwas gut sein.

        OPS: Nimm niemals mehr session_register(). Du hast in PHP die Variable $_SESSION, die kannst du als Array verwenden und dort alles reinspeichern, was du brauchst.

        Statt
          $variable = "Wert";
          session_register("variable");
        also lieber
          $_SESSION['variable'="wert";

        Es ist auch nicht notwendig, die Werte in $_SESSION am Skriptanfang da rauszuholen und erst am Ende wieder reinzupacken. $_SESSION ist eine ganz normale Variable, die man wie jede andere benutzen kann.

        - Sven Rautenberg

        1. Hallo Sven

          OPS: Nimm niemals mehr session_register(). Du hast in PHP die Variable $_SESSION, die kannst du als Array verwenden und dort alles reinspeichern, was du brauchst.

          Weil du es grad ansprichst: Wieso sollte man man denn nicht session_register() verwenden?

          Gruss
          Carl

          1. Hallo,

            sie verstoßen gegen das ocp (open-closed-prinzip), z.b.
            es gibt unsichtbare seiteneffekte.

            Tschau.

            1. Hallo,

              sorry da hab ich mich wohl vertan...

              Tschau.

          2. Halihallo Carl

            OPS: Nimm niemals mehr session_register(). Du hast in PHP die Variable $_SESSION, die kannst du als Array verwenden und dort alles reinspeichern, was du brauchst.
            Weil du es grad ansprichst: Wieso sollte man man denn nicht session_register() verwenden?

            Ein kleiner Blick in die Doku hätte dir die Frage erspart und mir
            das Antworten:

            http://www.php.net/session_register
            <cite>
            Wenn Sie wollen, dass ihr Script unabhängig von der Einstellung von
            register_globals funktioniert, müssen Sie stattdessen das Array
            $_SESSION verwenden, weil $_SESSION-Einträge automatisch registriert
            werden. Wenn Sie in Ihrem Script session_register() verwenden,
            funktioniert es nicht in Umgebungen, in denen die PHP-Anweisung
            register_globals deaktiviert ist.
            </cite>

            Viele Grüsse

            Philipp

            --
            The only program that runs perfectly every time, is a virus.
          3. Moin!

            Hallo Sven

            OPS: Nimm niemals mehr session_register(). Du hast in PHP die Variable $_SESSION, die kannst du als Array verwenden und dort alles reinspeichern, was du brauchst.

            Weil du es grad ansprichst: Wieso sollte man man denn nicht session_register() verwenden?

            Weil es böse ist. Weil es von den PHP-Entwicklern verdammt wurde. Und weil es sicherlich deswegen irgendwann aus dem Funktionsumfang entfernt werden wird.

            Die Sache ist die: Früher hat man bei PHP einen anderer Ansatz verfolgt, Daten von "außen" entgegenzunehmen. Dieser Ansatz hat sich als äußerst problematisch erwiesen, weil die Programmierer nicht die notwendige Sorgfalt für saubere Programmierung an den Tag gelegt haben. Viele unnötige, aber gefährliche Sicherheitslücken in den Skripten waren die Folge.

            Zusammenfassen kann man diese Misere unter dem Stichwort: register_globals=on

            Und die Wirkung war, dass die Parameter aus GET, die Formularfelder aus POST, alle Werte aus COOKIES, die SERVERumgebung und das ENVironment, und auch die SESSIONvariablen alle als globale Variablen angelegt wurden. Aus /link.php?var=wert wurde z.B. $var.

            Das hat mehrere Probleme. Zum einen ist es sehr problematisch, wenn man als Angreifer einfach beliebige globale Variablen mit Werten vorbelegen kann, indem man einfach einen ?-Parameter an den Link dranhängt. Wenn der Programmierer nicht sehr vorsichtig agiert und alle benutzten Variablen zuerst mit einem Startwert initialisiert, dann ist das Skript dadurch unsicher. Beispiele dazu gibts genug im Archiv.

            Zweitens kann man auf diese Weise nicht denselben Parameternamen in mehreren Quellen verwenden. Wenn ein POST-Formularfeld "login" heißt, und ein COOKIE-Wert ebenso, dann gibt es zwangsläufig einen Konflikt, weil es eben nur eine Variable $login geben kann - welcher Wert steht da jetzt drin, der vom POST oder der vom COOKIE? Antwort: Es hängt davon ab. In PHP kann man die Reihenfolge, in der GET, POST, COOKIE, SERVER und ENV ausgewertet werden, beliebig festlegen. Standard ist "EGPCS", es werden also zuerst die Werte aus $_ENV, dann $_GET, $_POST, $_COOKIE und zuletzt $_SERVER in den globalen Namensraum getan - das COOKIE in meinem Beispiel würde also den Wert aus POST überschreiben. Und sowas ist ziemlich doof, denn man muß bei Dingen, die eigentlich nichts miteinander zu tun haben (die Wahl, welche Namen ich für meine Cookies wähle, ist vom Prinzip her ja völlig frei, genauso wie ich (oder jemand anderes, der mitarbeitet) ja vollkommen frei Formularfeldnamen wählen kann. Wenn ich also in meinem Cookieskript den Parameter "login" setzte, und irgendwo anders benutzt jemand ein Formularfeld gleichen Namens, dann stört mein Cookie sein Formularfeld, wenn er sich auf register_globals = on verläßt und nur $login benutzt. Denn Cookies werden an alle Skripte der gesamten Domain gesendet (man kann es einschränken, aber das geht aus anderen Gründen nicht immer).

            Deshalb ist die einzige Lösung: register_globals = off, und die Werte aus den jeweiligen Arrays holen: Das Cookie-Login aus $_COOKIE['login'], und das Formular-Login aus $_POST['login'].

            So weit, so gut. Was ist jetzt mit Sessions?

            Für die soll das Gleiche gelten! Es gibt deshalb also das Array $_SESSION, damit man dort alle Variablen reinspeichert, die per Session-Mechanismus an alle anderen Skripte weitergegeben werden sollen. So kann man ohne Probleme auch noch eine Session-Variable $_SESSION['login'] definieren, und in allen dreien können unterschiedliche Werte drinstehen, weil vielleicht drei verschiedene Programmierer desselben Projektes drei vollkommen verschiedene Inhalte definiert haben, nur zufällig mit demselben Namen.

            Wenn du aber mit session_register() arbeitest, dann übergibst du ja der Funktion den Namen der globalen Variablen, die in die Session gespeichert und später wiederhergestellt werden soll.

            Das Wiederherstellen ist dabei wieder das Problem. Angenommen, du oder jemand anderes programmiert noch ein weiteres Skript, was die Session ebenfalls benutzt. Der hat, bevor er session_start() macht, noch diverse Berechnungen und Prüfungen auszuführen, und speichert das Ergebnis dann in der Variablen $result.

            Wenn du jetzt irgendwo in deinen anderen Session-Skripten irgendwo session_register("result") machst, weil du irgendein Ergebnis in der Session sichern wolltest, dann wird in dem neuen Skript nach session_start() die vorher errechnete Variable $result überschrieben durch den Inhalt der Session-Variablen.

            Es ist also das gleiche Thema: Die Werte der Session sollen gefälligst in $_SESSION bleiben, und nicht unkontrolliert von dort aus in den globalen Namensraum eindringen.

            Sowas kann nämlich auch zu tollen Problemen führen. Angenommen, du programmierst und machst dabei einen Fehler: Du registrierst die Variable $result in der Session, obwohl du das garnicht wolltest. Also löschst du den Befehl session_register("result") wieder, willst aber die Variable $result natürlich als Nicht-Session-Variable weiterverwenden. Nur dummerweise: Durch das einmalige session_register() ist diese Variable in deiner Session zu einer Session-Variablen geworden, d.h. immer wenn du session_start() aufrufst, wird in $result der Wert gespeichert, den du irgendwann man irrtümlich dort reingespeichert hattest. Es hängt natürlich von deinem Skript ab, was für Auswirkungen das hat, aber du wirst dir vorstellen können, dass du irgendwann verzweifelst, wenn dein Skript, was offensichtlich doch funktionieren muß, immer wieder mit falschen Inhalten von $result Probleme macht, und du dir nicht erklären kannst, woher das kommt.

            Wenn du nur $_SESSION verwendest, bist du dir sicher, dass alle globalen Variablen wirklich jedesmal neu und unverfälscht sind, und dass alle Session-Variablen gesammelt in diesem Array stehen (da kann man dann auch mal nachgucken, was so alles drin gespeichert ist: var_dump($_SESSION) beispielsweise).

            - Sven Rautenberg

          4. Hallo

            danke schön für die antworten, muss wohl mal meine scripte ändern, da ich immer session_register() verwendet habe.

            Gruss
            Carl