Alex: register_globals_on im Plesk

Hatte unten schon ein Problem, was aber gelöst wurde. Dabei ist mir aber aufgefallen das meine Änderung die globalen Variablen anzuschalten, wohl nicht genommen wurde.

Ich habe im conf-Ordner der jeweiligen Domain eine vhost.conf eingebunden in der folgendes drin steht:

php_admin_flag register_globals on

Das wird aber wohl nicht genommen, da ich immer noch über import_request_variables('gp',''); die globalen Variablen einbinden muss. Was mache ich falsch??

  1. echo $begrüßung;

    php_admin_flag register_globals on
    Das wird aber wohl nicht genommen, da ich immer noch über import_request_variables('gp',''); die globalen Variablen einbinden muss. Was mache ich falsch??

    Plesk kenne ich nicht, aber Ideen, was du falsch machst, habe ich.

    • Statt auf register_globals zu bauen kann man die Werte auch aus den Arrays $_GET, $_POST oder $_REQUEST abfragen.
    • Die Konfigurationswerte php_* wirken nur dann, wenn PHP als Apachemodul läuft.
    • Es gibt irgendwo noch andere Einstellungen, die deinen dort gesetzten Wert überschreiben.

    echo "$verabschiedung $name";

    1. Aber um aus GET und POST Werte ziehen zu können, müssen doch die globalen Variablen angeschaltet sein, oder steh ich gerade voll auf dem Schlauch? Ersetzt doch dann import_request_variable ('gp','') oder nicht?

      PHP läuft als Apache. Was meinst du mit irgendwo andere Einstellungen die den gesetzten Wert überschreiben? Also du meinst das auf dem Server irgendwo globale Einstellungen gesetzt sind, die diese conf-Datei quasi überschreiben? Die globalen Variablen sind für den Server ausgeschaltet, sollen aber für einzelne Domains freigeschaltet werden, was halt über diese conf-Dateien realisiert werden soll.

      1. Moin!

        Aber um aus GET und POST Werte ziehen zu können, müssen doch die globalen Variablen angeschaltet sein, oder steh ich gerade voll auf dem Schlauch? Ersetzt doch dann import_request_variable ('gp','') oder nicht?

        Alle Werte, die dem Skript per Get, Post oder Cookie übermittelt werden, stehen immer in den superglobalen (d.h. auch in Funktionen verfügbaren) Variablen $_GET, $_POST und $_COOKIE. Darüber hinaus existieren mit Konfigurations- und weiteren Werten des Requests $_ENV, $_SERVER und ggf. auch $_SESSION.

        Nutze ausschließlich diese Variablen. register_globals steht eindeutig auf der Abschußliste, es wird schon seit vielen Versionen absichtlich auf off stehend ausgeliefert!

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Moin Moin,

          irgendwie blick ich nicht ganz durch. Also Get, Post und Cookie sind superglobale Variablen die immer verfügbar sind, ohne register_globals on, richtig? Was sind dann globale Variablen (gibts da einen Unterschied?) bzw. was aktiviere ich mit register_globals on und was mit       import_request_variables('gp',''); ? Dachte da mit "aktiviert" man Get und Post.

          Das Problem ist halt das dieses Problem mehrere Seiten betrifft und eine Umstellung im Skript sehr aufwändig ist. Für alle Websites möchte ich register_globals aber nicht "aktivieren".

          Dieses Problem trat wie gesagt nach Umstellung von PHP3 auf PHP4 auf.

          mfg alex

          1. Moin!

            irgendwie blick ich nicht ganz durch.

            Wir helfen gern.

            Also Get, Post und Cookie sind superglobale Variablen die immer verfügbar sind, ohne register_globals on, richtig?

            Die Variablen werden alle durchgehend GROSS geschrieben, und haben vorneweg einen _UNTERSTRICH - und natürlich das Dollarzeichen. Ansonsten ist deine Aussage richtig.

            Was sind dann globale Variablen (gibts da einen Unterschied?)

            Da gibt es einen Unterschied. Globale Variablen sind die, die du außerhalb von Funktionen im Hauptprogramm definierst und benutzt. Im Unterschied zu superglobalen Variablen kannst du innerhalb von Funktionen nicht auf globale Variablen zugreifen. Und das ist auch gut so, weil Funktionen Werte mit der "Außenwelt" Hauptprogramm nur über ihre Parameter und Rückgabewerte austauschen sollen.

            was aktiviere ich mit register_globals on

            register_globals=on erzeugt dir vor dem Skriptstart schon eine Sammlung globaler Variablen mit den Inhalten aus GET, POST, FILES, COOKIE, ENV, SERVER und SESSION.

            Angenommen, folgende URL wird aufgerufen: http://www.example.com/test.php?wert=zwanzig

            Ohne register_globals kannst du den Wert so nutzen:

            echo $_GET['wert']; // schreibt den String 'zwanzig'

            Mit register_globals geht das obige immer noch.
            Und zusätzlich geht das hier:
            echo $wert; // schreibt ebenfalls 'zwanzig'

            Das Problem dabei ist: Jeder kann an der URL rummanipulieren, damit kann jeder beliebige globale Variablen definieren - auch die, die du später in deinem Skript selbst benutzt. Wenn du die Variablen dann "einfach so" nutzt, ohne ihnen zuerst einen definierten Wert zuzuweisen, kann ein Angreifer beliebige Vorbelegungen in die Variablen schreiben, und dein Skript so mißbrauchen, sich reinhacken etc.

            und was mit import_request_variables('gp','');

            Die Funktion import_request_variables erzeugt, genau wie register_globals, globale Variablen aus verschiedenen Quellen. Ist also im Ergebnis gleichwertig. Der einzige Unterschied: Es passiert nicht automatisch, sondern manuell, das bringt eventuell etwas mehr Sicherheit, zweitens kann man genau bestimmen, welche Datenquellen übernommen werden sollen (im Beispiel hast du "gp" angegeben, das steht für GET und POST, alle anderen Werte bleiben weg), und drittens kann man allen erzeugten Variablennamen noch einen Prefix vorsetzen (da hast du '' angegeben, also keinen Prefix).

            Um das Beispiel von oben fortzusetzen:

            import_request_variables('gp',''); // GET und POST importieren  
            echo $wert; // schreibt 'zwanzig'
            

            Kein Unterschied bei der URL:

            import_request_variables('g',''); // nur GET importieren  
            echo $wert; // schreibt 'zwanzig'
            

            Mit Prefix:

            import_request_variables('g','get_'); // GET mit Prefix importieren  
            echo $get_wert; // NEUER Variablenname! 
            

            Und der Import nur von POST bei gleicher URL:

            import_request_variables('p',''); // nur POST importieren  
            echo $wert; // schreibt nichts! Variable nicht definiert!
            

            Das Problem ist halt das dieses Problem mehrere Seiten betrifft und eine Umstellung im Skript sehr aufwändig ist. Für alle Websites möchte ich register_globals aber nicht "aktivieren".

            Du hast das Problem, dass du ein Skript hast, das noch auf PHP 3 abgestimmt ist. Mittlerweile haben wir PHP 5 als aktuelle Version, selbst PHP 4 stirbt schon aus.

            Der Schritt von 3 auf 4 war tatsächlich mit etlichen Umstellungen verbunden. Kein Versionswechsel läuft wirklich 100% reibungsfrei.

            Deshalb ja der ganz dringende Appell: Schreibe das Skript neu. Klar ist das aufwendig, aber wenn du für die nächste Zeit Ruhe haben willst, dann installier PHP 5 und schreibe das Skript gleich auf diese Version um. Ohne register_globals natürlich!

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Hallo,

              KLASSE!!! Super erklärt, jetzt blicke ich endlich durch! Das einzige was mich irritiert: register_globals on in der conf-Datei der jeweiligen Seite bewirkt wohl nicht das die globals "aktiviert" werden. Denn, der Zugriff funktioniert erst, wenn ich import_request.... ins Skript einhacke.

              Aber OK, das ist mit etwas mehr Aufwand noch zu bändigen. Würde mich mal interessieren ob jemand mit Plesk-Erfahrung weiß, wie man das hinbekommt.

              Noch mal Danke und viele Grüße! Alex!