Yadgar: Problem mit Umgebungsvariablen

High!

Obwohl ich register_globals in der php.ini auf "On" gesetzt habe, ist mein PHP-Interpreter (Apache ist lokal installiert) offensichtlich nicht imstande, Umgebungsvariablen wie z. B. REMOTE_HOST anzuzeigen - bei "Off" funktionierte es allerdings auch nicht. Gibt es noch mehr Switches, die zu berücksichtigen sind?

Dann gibt es im meinem gegenwärtigen Lehrbuch (ja, ich bin nunmal so autoritär veranlagt, dass ich für alles ein Lehrbuch brauche...), "PHP Grundlagen" von Bill McCarty, eine mir etwas ungewohnte Behandlung von Formulardaten: statt den bekannten Weg über $_POST[] zu gehen, werden einfach die Namen der input-Eingabefelder direkt als skalare Variablen an das php-Skript weitergereicht, aus

<input type="text" name="Vorname">

holt sich PHP einfach $Vorname...

Mit meiner Standard-PHP-Einstellung funktioniert dies aber nicht... was muss ich in der php.ini ändern?

Bis bald im Khyberspace!

Yadgar

  1. Hi!

    »»statt den bekannten Weg über $_POST[] zu gehen, werden einfach die Namen der input-Eingabefelder direkt als skalare Variablen an das php-Skript weitergereicht
    Das ist aber nicht gut...

    aus
    <input type="text" name="Vorname">
    holt sich PHP einfach $Vorname...

    D.h.: register_globals steht auf on.

    Mit meiner Standard-PHP-Einstellung funktioniert dies aber nicht... was muss ich in der php.ini ändern?

    Am besten gar nichts.
    register_globals sollte auf off stehen. So hast du die Kontrolle darüber, wo die Variablen herkommen und dein Script ist nicht so anfällig/angreifbar.

    BTW: Wenn du eine Einstellung in der php.ini vorgenommen hast und diese dann trotzdem nicht funktioniert, dann könnte es sein, daß dort eine Verzeichniseinstellung aktiv ist.
    Diese kann über eine htaccess-Datei gesetzt werden.
    Wenn du phpinfo() aufrufst, werden immer zwei Werte angezeigt: "Local Value" und "Master Value".
    Eventuell liegt es daran, wenn eine Einstellung nicht wie gewünscht funktioniert.

    Schöner Gruß,
    rob

    1. BTW: Wenn du eine Einstellung in der php.ini vorgenommen hast und diese dann trotzdem nicht funktioniert, dann könnte es sein, daß dort eine Verzeichniseinstellung aktiv ist.
      Diese kann über eine htaccess-Datei gesetzt werden.

      Wo in der ini finde ich diese Verzeichniseinstellung... bzw., was ist eine htaccess-Datei?

      Bis bald im Khyberspace!

      Yadgar

      1. hi,

        BTW: Wenn du eine Einstellung in der php.ini vorgenommen hast und diese dann trotzdem nicht funktioniert, dann könnte es sein, daß dort eine Verzeichniseinstellung aktiv ist.
        Diese kann über eine htaccess-Datei gesetzt werden.

        Wo in der ini finde ich diese Verzeichniseinstellung...

        Gar nicht, weil die in der .htaccess stünde (oder in der httpd.conf)

        bzw., was ist eine htaccess-Datei?

        http://de.selfhtml.org/servercgi/server/htaccess.htm
        Und für dieses spezielles Szenario: http://de.php.net/manual/de/configuration.changes.php

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. hi,

    Obwohl ich register_globals in der php.ini auf "On" gesetzt habe,

    Rückgängig machen, sofort bitte, danke.

    ist mein PHP-Interpreter (Apache ist lokal installiert) offensichtlich nicht imstande, Umgebungsvariablen wie z. B. REMOTE_HOST anzuzeigen - bei "Off" funktionierte es allerdings auch nicht.

    Solche Werte stehen in $_SERVER, richtige Environment-Variablen in $_ENV
    http://www.php.net/manual/de/language.variables.predefined.php

    Dann gibt es im meinem gegenwärtigen Lehrbuch (ja, ich bin nunmal so autoritär veranlagt, dass ich für alles ein Lehrbuch brauche...), "PHP Grundlagen" von Bill McCarty, eine mir etwas ungewohnte Behandlung von Formulardaten: statt den bekannten Weg über $_POST[] zu gehen, werden einfach die Namen der input-Eingabefelder direkt als skalare Variablen an das php-Skript weitergereicht

    Dann ist "gegenwärtig" ganz sicher nicht gleich "aktuell".

    Mit meiner Standard-PHP-Einstellung funktioniert dies aber nicht... was muss ich in der php.ini ändern?

    Nur register_globals wieder auf off stellen.

    (Ja, mit rg=on sollte der Zugriff über $parametername zwar "funzen" - wenn nicht, dann hast du die Änderung wohl nicht korrekt gemacht, bspw. falsche php.ini bearbeitet - aber das ist alles andere als optimal. Nutze diese Einstellung nicht, sondern schreibe stattdessen zukunftssichere Scripte. In PHP wird der register_globals-Unfug nämlich komplett rausgekickt.)

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hi!

      Dann ist "gegenwärtig" ganz sicher nicht gleich "aktuell".

      Da hast du recht.
      In letzter Zeit habe ich allerdings ein paar PHP-Bücher in die Hände bekommen, wo mit den Globals gearbeitet wird.
      Dabei handelt es sich tatsächlich um Bücher, die erst 2007 erschienen sind. (register_globals wurde nicht mal erwähnt.)
      Naja, wenn man eine neue Sprache lernen will, dann sollte man nicht zum erstbesten Buch greifen.
      Wenn "für Dummies" oder "Databecker" drauf steht, würde ich das Ding lieber im Regal stehen lassen...

      Nutze diese Einstellung nicht, sondern schreibe stattdessen zukunftssichere Scripte.

      Nicht nur aus dem Grund der Zukunftssicherheit sollte dies getan werden.
      Auch aus Sicherheitsgründen sollte man so programmieren.
      So hat man dann auch ein wenig mehr Kontrolle, wo die Variablen her kommen.
      Man könnte natürlich auch zusätzliche Abfragen dafür einbauen, aber viele machen das nicht...
      Außerdem sollte man, wenn man sauber programmieren will, möglichst immer auf globale Variablen verzichten, wenn es denn machbar ist. (Und das ist es in den meisten Fällen.)

      In PHP wird der register_globals-Unfug nämlich komplett rausgekickt.

      Fehlt die "6" auf deiner Tastatur? :)
      Neben register_globals werden in PHP 6 dann wohl auch die magic_quotes, der safe_mode und anderer "Unfug" verschwinden.

      Schöner Gruß,
      rob

      1. n'Abend!

        Wenn "für Dummies" oder "Databecker" drauf steht, würde ich das Ding lieber im Regal stehen lassen...

        Wohl wahr. Obwohl der Name Data Becker in den 80er und frühen 90er Jahren durchaus noch ein Qualitätsbegriff und ein Synonym für gut recherchierte, ausführliche und praxistaugliche Fachliteratur war.

        Außerdem sollte man, wenn man sauber programmieren will, möglichst immer auf globale Variablen verzichten, wenn es denn machbar ist. (Und das ist es in den meisten Fällen.)

        Ja, einverstanden. Aber man sollte nicht so weit gehen, globale Variablen *ganz* zu meiden. Für wirklich globale Daten, die im gesamten Programm-Kontext verfügbar sein sollen, sind sie nämlich sehr sinnvoll. Denn es ist sicher nicht vorteilhaft, allgemeine Konfigurationsdaten bei jedem Funktionsaufruf wieder als Argument mitzugeben.

        In PHP wird der register_globals-Unfug nämlich komplett rausgekickt.
        Fehlt die "6" auf deiner Tastatur? :)

        Warum? Das "wird" impliziert Zukunft, und da PHP5 bereits Gegenwart ist, erübrigt sich diese zusätzliche Angabe. ;-)

        Neben register_globals werden in PHP 6 dann wohl auch die magic_quotes, der safe_mode und anderer "Unfug" verschwinden.

        Juhuu. Endlich!

        So long,
         Martin

        --
        Es sagte...
        ein korpulenter Lehrer zu einem Schüler, der ihn ein Fass genannt hatte: "Nein. Ein Fass ist von Reifen umgeben, ich dagegen von Unreifen."
  3. Hallo,

    Obwohl ich register_globals in der php.ini auf "On" gesetzt habe, ist mein PHP-Interpreter (Apache ist lokal installiert) offensichtlich nicht imstande, Umgebungsvariablen wie z. B. REMOTE_HOST anzuzeigen

    bei register_globals=on solltest du die Environment-Variablen allerdings direkt als Variablen im Script haben. Der "normale" Weg wäre sonst, über das superglobale Array $_ENV[] darauf zuzugreifen.
    Allerdings ist gerade REMOTE_HOST, das du als Beispiel gewählt hast, auch über $_SERVER['REMOTE_HOST'] verfügbar.

    Dann gibt es im meinem gegenwärtigen Lehrbuch (ja, ich bin nunmal so autoritär veranlagt, dass ich für alles ein Lehrbuch brauche...), "PHP Grundlagen" von Bill McCarty, eine mir etwas ungewohnte Behandlung von Formulardaten: statt den bekannten Weg über $_POST[] zu gehen, werden einfach die Namen der input-Eingabefelder direkt als skalare Variablen an das php-Skript weitergereicht, aus

    <input type="text" name="Vorname">

    holt sich PHP einfach $Vorname...

    Ja, auch das leistet register_globals. Kurz gesagt, alle Daten aus dem Request (GET, POST, COOKIE), sowie die Umgebungs- und Sessionvariablen werden als benannte Variablen direkt im Script verfügbar gemacht.
    Ich halte es aber auch für sauberer, gezielt auf $_GET[], $_POST[], $_COOKIE[], $_ENV[] und $_SESSION[] zuzugreifen - und natürlich auf $_SERVER[] - anstatt den globalen Namespace mit -zig Variablen vollzumüllen, von denen das Script einen Großteil gar nicht braucht, die aber bei unsauberer Programmierung eine Gefahr darstellen könnten.

    So long,
     Martin

    --
    Ich bin 30. Ich demensiere apokalyptisch.
      (Orlando)
    1. Hallo Martin,

      bei register_globals=on solltest du die Environment-Variablen allerdings direkt als Variablen im Script haben. Der "normale" Weg wäre sonst, über das superglobale Array $_ENV[] darauf zuzugreifen.
      Allerdings ist gerade REMOTE_HOST, das du als Beispiel gewählt hast, auch über $_SERVER['REMOTE_HOST'] verfügbar.

      Kleine Ergänzung: Je nach Installationsvariante von PHP (CGI vs. FCGI vs. Modul vs. ...) steht REMOTE_HOST u.U. *NUR* in $_SERVER und *nicht* in $_ENV zur Verfügung, sprich: die ganzen CGI-Variablen wie REMOTE_HOST, SERVER_PROTOCOL, HTTP_*, ... sollte man sich *immer* aus $_SERVER ziehen, das funktioniert garantiert - $_ENV nur in bestimmten Konstellationen (weiß nicht mehr auswendig, würde aber mal raten, dass $_ENV nur bei CGI befüllt wird, bei Modul oder FCGI nicht).

      Viele Grüße,
      Christian

      1. Hi!

        $_ENV nur in bestimmten Konstellationen (weiß nicht mehr auswendig, würde aber mal raten, dass $_ENV nur bei CGI befüllt wird, bei Modul oder FCGI nicht).

        Das findet man im PHP Handbuch auf der Seite "vordefinierte Variablen".
        Zu beginn des Dokuments findet man alles zu $_SERVER, einschließlich aller Schlüssel dieses Arrays.
        Scrollt man weiter runter, kommt man zu "Umgebungsvariablen: $_ENV".
        Dort steht:
        "Andere Umgebungsvariablen einschließlich der CGI-Variablen, sind hier aufgeführt, egal ob PHP als Servermodul oder CGI Prozess läuft."

        Schöner Gruß,
        rob

        1. echo $begrüßung;

          $_ENV nur in bestimmten Konstellationen (weiß nicht mehr auswendig, würde aber mal raten, dass $_ENV nur bei CGI befüllt wird, bei Modul oder FCGI nicht).
          Das findet man im PHP Handbuch auf der Seite "vordefinierte Variablen".
          Zu beginn des Dokuments findet man alles zu $_SERVER, einschließlich aller Schlüssel dieses Arrays.

          Mitnichten sind es alle. Und es wird auch nicht garantiert, dass alle aufgeführten in jeder Situation zur Verfügung stehen oder der Inhalt die gleiche Bedeutung hat.

          Scrollt man weiter runter, kommt man zu "Umgebungsvariablen: $_ENV".
          Dort steht:
          "Andere Umgebungsvariablen einschließlich der CGI-Variablen, sind hier aufgeführt, egal ob PHP als Servermodul oder CGI Prozess läuft."

          Dieser Satz ist nicht ganz eindeutig formuliert. In der Modulvariante besteht anders als bei CGI keine Notwendigkeit, die Server-Informationen über Variablen in der Umgebung zu übergeben. In meiner Testumgebung befindet sich nur PATH in $_ENV, alles andere habe ich schon beim Start des Apache nicht mit übergeben. PHP füllt da auch nichts rein. Ich kenne auch keine php.ini-Konfigurationsdirektive, die dieses Verhalten ändert.

          echo "$verabschiedung $name";