Tom: Verlässliche Aussage zu Predefined Variables gesucht

Hello,

wo finde ich denn eine verlässliche Aussage darüber, welche Predefined Variables wann zur Verfügung gestellt werden?

unter http://www.php.net/manual/en/language.variables.superglobals.php finde ich jetzt nicht wirklich etwas, oder habe es überlesen.

$_SESSION ist nur vorhanden, wenn eine Session gestartet wurde.

Wenn ich mich richtig erinnere, war $_FILES früher auch nur vorhanden, wenn Files hochgeladen wurden bzw. zumindest ein Versuch dazu unternommen worden war. Jetzt ist es immer vorhanden, genauso wie $_COOKIE. Oder irre ich mich da?

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de
  1. Tach,

    unter http://www.php.net/manual/en/language.variables.superglobals.php finde ich jetzt nicht wirklich etwas, oder habe es überlesen.

    steht im ersten Punkt unter Notes: "By default, all of the superglobals are available but there are directives that affect this availability. For further information, refer to the documentation for variables_order."

    mfg
    Woodfighter

    1. Hello,

      unter http://www.php.net/manual/en/language.variables.superglobals.php finde ich jetzt nicht wirklich etwas, oder habe es überlesen.

      steht im ersten Punkt unter Notes: "By default, all of the superglobals are available but there are directives that affect this availability. For further information, refer to the documentation for variables_order."

      Ja eben. Das steht da.
      Aber $_SESSION ist nur vorhanden, wenn auch eine Session gestartet wurde.

      Und mMn war das früher mit $_FILES auch so. Ich versuche nun, herauszufinden, ob ich mir das nur einbilde, oder seit wann das nicht mehr so ist.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
    2. Hi,

      unter http://www.php.net/manual/en/language.variables.superglobals.php finde ich jetzt nicht wirklich etwas, oder habe es überlesen.

      steht im ersten Punkt unter Notes: "By default, all of the superglobals are available but there are directives that affect this availability. For further information, refer to the documentation for variables_order."

      “are available” interpretiere ich hier eher in Bezug darauf, welche dieser Arrays zur Verfügung gestellt werden - unabhängig davon, ob mit Daten gefüllt oder nicht.
      variables_order schränkt ja auch nur Environment, Get, Post, Cookie und Server ein - auf Session oder Files hat es überhaupt keine Auswirkung.
      Und vom Geltungsbereich dieser Option her kann sich “Setting to "" means no superglobals will be set” ja auch nicht auf Session oder Files beziehen, das wäre ja unsinnig.

      MfG ChrisB

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Hi!

    Wenn ich mich richtig erinnere, war $_FILES früher auch nur vorhanden, wenn Files hochgeladen wurden bzw. zumindest ein Versuch dazu unternommen worden war. Jetzt ist es immer vorhanden, genauso wie $_COOKIE. Oder irre ich mich da?

    Wie testest du denn das Vorhandensein?

    Lo!

    1. Hello,

      Wenn ich mich richtig erinnere, war $_FILES früher auch nur vorhanden, wenn Files hochgeladen wurden bzw. zumindest ein Versuch dazu unternommen worden war. Jetzt ist es immer vorhanden, genauso wie $_COOKIE. Oder irre ich mich da?

      Wie testest du denn das Vorhandensein?

      Ich lasse mir $GLOBALS anzeigen.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi!

        Wie testest du denn das Vorhandensein?
        Ich lasse mir $GLOBALS anzeigen.

        Ok, sind also vom auto_globals_jit nicht betroffen sondern ständig da. Hätte ja sein können, dass du ihre Existenz befragst und sie dann erst auftauchen (wie $_ENV).

        Was ist eigentlich das Problem an dem du forschst?

        Lo!

        1. Hello,

          Wie testest du denn das Vorhandensein?
          Ich lasse mir $GLOBALS anzeigen.

          Ok, sind also vom auto_globals_jit nicht betroffen sondern ständig da. Hätte ja sein können, dass du ihre Existenz befragst und sie dann erst auftauchen (wie $_ENV).

          Was ist eigentlich das Problem an dem du forschst?

          Es geht mir im Wesentlich nur darum, ob man direkt nach dem Scriptstart

          if($_FILES)

          oder

          if ($_POST)

          usw.

          benutzen darf, ohne eine Notice zu kassieren.
          Bei $_SESSION geht es eben nicht. Und ob das jetzt bei $_FILES abgesichert ist, versuche ich eben herauszufinden.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi!

            Es geht mir im Wesentlich nur darum, ob man direkt nach dem Scriptstart
                if($_FILES)
            oder
                if ($_POST)
            benutzen darf, ohne eine Notice zu kassieren.
            Bei $_SESSION geht es eben nicht.

            Sessions müssen sowieso mit session_start() eröffnet werden. Erst dann ist die Infrastruktur für $_SESSION initialisiert. Ohne das Starten weiß PHP nicht, ob und wenn ja welche Session-Datei zu öffnen ist.

            Lo!

      2. Hello,

        Wie testest du denn das Vorhandensein?

        Ich lasse mir $GLOBALS anzeigen.

        register_long_arrays = off

        Außerdem habe ich vorher (optional) noch derartige Zeilen eingebaut, damit durch den Erstzugriff die Arrays auch erzeugt werden. Ohne den Zugriff ist $_SERVER in $GLOBALS nicht vorhanden/nicht sichtbar.

        Bei $_SERVER klappt das auch; es wird dann in $GLOBALS auch sichtbar. $_SESSION wird nicht sichtbar. $_FILES ist immer vorhanden. Darum geht es hier: ob das jetzt sicher ist und so bleibt, dass $_FILES immer vohanden und von Anfang an sichtbar ist.

        echo '<p>'.((isset($_SESSION))?'$_SESSION ist vorhanden':'$_SESSION ist nicht vorhanden').'</p>';
            echo '<p>'.((isset($_SERVER))?'$_SERVER ist vorhanden':'$_SERVER ist nicht vorhanden').'</p>';

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hi!

          Ohne den Zugriff ist $_SERVER in $GLOBALS nicht vorhanden/nicht sichtbar.

          Wegen auto_globals_jit. Gilt auch für $_ENV, braucht aber k(aum )einer.

          Bei $_SERVER klappt das auch; es wird dann in $GLOBALS auch sichtbar. $_SESSION wird nicht sichtbar.

          $_SESSION ist immer erst da, wenn du die Voraussetzung mit session_start() oder session.auto_start geschaffen hast.

          Lo!

          1. Hello,

            Ohne den Zugriff ist $_SERVER in $GLOBALS nicht vorhanden/nicht sichtbar.

            Wegen auto_globals_jit. Gilt auch für $_ENV, braucht aber k(aum )einer.

            Bei $_SERVER klappt das auch; es wird dann in $GLOBALS auch sichtbar. $_SESSION wird nicht sichtbar.

            $_SESSION ist immer erst da, wenn du die Voraussetzung mit session_start() oder session.auto_start geschaffen hast.

            Aus Erfahrung weiß ich das auch.
            Aber wo steht es dokumentiert, welche globale Variable welches Verhalten hat?

            Und meine ursprüngliche Frage, ob $_FILES auch schon immer sofort zur Verfügung stand, oder früher auch nur angelegt wurde, wenn ein Upload(versuch) stattgefundn hatte, kann mir die jemand beantworten?

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hi!

              Und meine ursprüngliche Frage, ob $_FILES auch schon immer sofort zur Verfügung stand, oder früher auch nur angelegt wurde, wenn ein Upload(versuch) stattgefundn hatte, kann mir die jemand beantworten?

              In PHP 4.3.11 gibt es $_FILES und $HTTP_POST_FILES auch ohne Upload. (POST gibt es auch bei GET-Requests, insofern ist das Vorhandensein von FILES ohne Upload keine Besonderheit.)

              Lo!

              1. Hello,

                Und meine ursprüngliche Frage, ob $_FILES auch schon immer sofort zur Verfügung stand, oder früher auch nur angelegt wurde, wenn ein Upload(versuch) stattgefundn hatte, kann mir die jemand beantworten?

                In PHP 4.3.11 gibt es $_FILES und $HTTP_POST_FILES auch ohne Upload. (POST gibt es auch bei GET-Requests, insofern ist das Vorhandensein von FILES ohne Upload keine Besonderheit.)

                Na gut. Dann will ich jetzt mal gutmütig annehmen, dass generell gilt:

                $_GET
                    $_POST
                    $_COOKIE
                    $_FILES
                    ...      ## $_REQUEST lasse ich hier bewusst aus.

                stehen immer bei Scriptstart zur Verfügung

                $_SERVER
                    $_ENV

                werden bei einem Zugriff auf die Arrays sofort aus dem Environment erzeugt

                $_SESSION

                ist nur vorhanden, wenn eine Session gestartet wurde (oder man es unqualifizert selber angelegt hat)

                Damit wäre die Abfrage, ob Elemente enthalten sind, bei den ersten sechs also generell erlaubt, ohne Gefahr zu laufen, eine Notice zu kassieren:

                if ($_*)

                bzw. eben der sofortige Zugriff mit count() auf die Arrays.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hi!

                  $_SERVER
                      $_ENV
                  werden bei einem Zugriff auf die Arrays sofort aus dem Environment erzeugt

                  Gilt seit PHP 5.0.0, wenn auto_globals_jit aktiviert ist.

                  Damit wäre die Abfrage, ob Elemente enthalten sind, bei den ersten sechs also generell erlaubt, ohne Gefahr zu laufen, eine Notice zu kassieren:
                      if ($_*)
                  bzw. eben der sofortige Zugriff mit count() auf die Arrays.

                  Warum nimmst du nicht empty()?

                  Lo!

                  1. Hello,

                    if ($_*)
                    bzw. eben der sofortige Zugriff mit count() auf die Arrays.

                    Warum nimmst du nicht empty()?

                    Das ist in diesem Fall tatsächlich zu überlegen, da hier ja keine Leerzeichen oder 0 als Inhalt zulässig sind. Es ist auch sprachlich "selbstdokumentierender".

                    Bleibt nur noch die Frage, welche Injection noch möglich wäre, wenn Register_Globals noch eingeschaltet ist. Könnte man z.B $_FILES dann von außen einschleusen? Kann ein beliebiges Typformat[1] sein. Wenn es zum Scriptstart verlässlich angelegt wird, müsste es ja jede Einschleppung von außen überschreiben, oder? Damit wäre dann auch immer der Datentyp "Array" sichergestellt.

                    Ich kann gerade nicht testen...

                    [1] Gibts ein besseres Wort dafür? soll heißen: verlustfrei umwandelbar in den Zieltyp

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. Hi!

                      Warum nimmst du nicht empty()?
                      Das ist in diesem Fall tatsächlich zu überlegen, da hier ja keine Leerzeichen oder 0 als Inhalt zulässig sind. Es ist auch sprachlich "selbstdokumentierender".

                      Leerstring, nicht Leerzeichen. Letztere wären nicht empty().

                      Bleibt nur noch die Frage, welche Injection noch möglich wäre, wenn Register_Globals noch eingeschaltet ist.

                      Keine, wenn du deine Variablen immer schön initialisierst.

                      Könnte man z.B $_FILES dann von außen einschleusen?

                      Nein, die vordefinierten Arrays werden damit nicht überschrieben. Diesen Bug hat man schon vor langer Zeit entfernt. Wenn du willst, kannst du die Namen dieser Arrays auf Existenz in $_REQUEST[...] abfragen, dann war das ein misslungener Versuch der Einschleusung.

                      Lo!

                      1. Hello,

                        Hi!

                        Warum nimmst du nicht empty()?
                        Das ist in diesem Fall tatsächlich zu überlegen, da hier ja keine Leerzeichen oder 0 als Inhalt zulässig sind. Es ist auch sprachlich "selbstdokumentierender".

                        Leerstring, nicht Leerzeichen. Letztere wären nicht empty().

                        Stimmt :-)

                        Bleibt nur noch die Frage, welche Injection noch möglich wäre, wenn Register_Globals noch eingeschaltet ist.

                        Keine, wenn du deine Variablen immer schön initialisierst.

                        Diese initialisiert aber das System, nicht der Programmierer.

                        Könnte man z.B $_FILES dann von außen einschleusen?

                        Nein, die vordefinierten Arrays werden damit nicht überschrieben. Diesen Bug hat man schon vor langer Zeit entfernt. Wenn du willst, kannst du die Namen dieser Arrays auf Existenz in $_REQUEST[...] abfragen, dann war das ein misslungener Versuch der Einschleusung.

                        Die Frage kam auf, weil ich mir etliche Uploadscripte angeschaut habe in den letzten Wochen, um die typischen Fehler zu finden. Diese Möglichkeit hatte ich noch nicht ausgeschlossen, auch wenn ich nicht daran geglaubt habe :-)

                        Es gibt da wirklich ganz pfiffige Sachen und auch ganz grausame ;-)

                        Da die meisten aber nicht wirklich dokumentiert sind, weiß man selten, welche Gedanken dem Programmierer im Kopf herumgegangen sind, oder ob es nur "zufällig sicher" ist.

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                         ☻_
                        /▌
                        / \ Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de