Peter Bachmüller: aktellen link oder URL auslesen

Hallo,

ich möchte gerne die aktuelle URL auslesen.

Das heißt wenn ich dort http://shop/index.php?wg=2&ag=15 stehe
wie lese ich die String oder Pfad aus?

ich weiß das ich über $wg und $ag die variable habe aber ich möchte den ganzen pfad auslesen!?

gruss peter

  1. Hallo,

    ich möchte gerne die aktuelle URL auslesen.

    $_SERVER['HTTP_HOST']
    $_SERVER['PHP_SELF']
    $_SERVER['QUERY_STRING'] oder $_SERVER['argv']

    Siehe PHP-Manual: Predefined Variables (englisch,
    die deutsche Uebersetzung ist unvollstaendig/veraltet)
    http://www.php.net/manual/en/language.variables.predefined.php und
    http://www.php.net/manual/en/reserved.variables.php

    http://shop/index.php?wg=2&ag=15
    ich weiß das ich über $wg und $ag die variable habe

    Das ist aber schlecht.
    Und laeuft nur, weil register_globals "zufaellig" auf "on" ist.
    Besser:
    $_GET['wg'] bzw. $_REQUEST['wg']
    u.s.w.

    Gruesse,

    Thomas

    --
    Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
    Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
    Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
  2. Moin!

    ich weiß das ich über $wg und $ag die variable habe aber ich möchte den ganzen pfad auslesen!?

    Lass dir mal mit dem Befehl

    phpinfo(INFO_VARIABLES);

    die diversen Server-Variablen ausgeben. Dort sollte unter _SERVER auch irgendein Wert den aktuellen Pfad ergeben, wie du ihn dir wünschst.

    Obacht: Diese Information kann von Server zu Server, je nach Konfiguration, auch wechseln. Es mag zwar gewisse Standards geben, aber du kannst dich auf gewisse Dinge nicht 100% verlassen. Wenn dein Skript auf mehreren Servern laufen soll, mußt du da einen genaueren Blick drauf haben.

    PS: In den Variablen $wg und $ag sollte überhaupt nichts drinstehen, wenn man deine Beispiel-URL aufruft. Verwende $_GET['wg'] und $_GET['ag'], und schalte (nach Möglichkeit) register_globals aus. Diesen Zustand wird PHP nämlich mit Sicherheit in den nächsten Versionen zwingend annehmen (schon jetzt ist es der Standard auf vielen Servern und würde dir bei einem Serverwechsel Probleme bereiten).

    - Sven Rautenberg

    --
    "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
    1. PS: In den Variablen $wg und $ag sollte überhaupt nichts

      »»drinstehen, wenn man deine Beispiel-URL aufruft. Verwende $_GET
      »»['wg'] und $_GET['ag'], und schalte (nach Möglichkeit)
      »»register_globals aus. Diesen Zustand wird PHP nämlich mit
      »»Sicherheit in den nächsten Versionen zwingend annehmen (schon
      »»jetzt ist es der Standard auf vielen Servern und würde dir bei
      »»einem Serverwechsel Probleme bereiten).

      Hi was hast Du nun für mich mit $_GET['ag'];

      ich rufe doch momentan die variable mit $ag auf weil sie mir doch mit der url übergeben wird hat das schon was mit register_globals zutun?

      1. Hallo,

        ich rufe doch momentan die variable mit $ag auf weil sie mir doch mit der url übergeben wird hat das schon was mit register_globals zutun?

        Weil Dein Server zufaelligerweise in einer veralteten,
        unsicheren Weise konfiguriert ist (register_globals="on"),
        steht Dir die Variable $ag zufaelligerweise zur Verfuegung.

        Wenn Du einen zuverlaessigen, zukunftssicheren Weg suchst,
        um an die URL-Parameter zu kommen, dann nimm $_GET['ag'].

        Das funktioniert naemlich auf "allen" aktuellen und
        zukuenftigen PHP-Versionen (4.1, 4.2, 4.3, 5.0) und
        egal, wie register_globals eingestellt ist.

        Du tust Dir selbst keinen Gefallen, wenn Du mit den
        veralteten globalen Variablen wie $ag arbeitest.
        Wirklich nicht.

        Gruesse,

        Thomas

        1. Du tust Dir selbst keinen Gefallen, wenn Du mit den
          veralteten globalen Variablen wie $ag arbeitest.
          Wirklich nicht.

          Ok aber wenn ich register_golbals auf off stelle darf ich denn die parameter trotzdem mit der url übergeben?

          1. Hello,

            Ok aber wenn ich register_golbals auf off stelle darf ich denn die parameter trotzdem mit der url übergeben?

            Du darfst alles machen, was mir nicht wehtut *gg*.

            Die letzen tage gab es hier auch noch ein tolles Beispiel, was so passieren kann, wenn man Register_globals eingeschaltet hat. Du musst einfach mal die Threads durchschauen, zu denen ich meinen Senf dazugegeben habe. Ich glaube, dr Urposter hieß Tobias. kann mich aber nicht so genau erinnern.

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            1. Irgendwie weiß ich nicht wo dann noch der Unterschied ist wenn die Übergabe über die URL trotzdem geht.

              Nur das ich die Variablen im Script mit $_GET['ag'] abrufen brauch.

              Im Prinzip ändert sich dort doch gar nichts!?

              1. Hallo,

                Irgendwie weiß ich nicht wo dann noch der Unterschied ist wenn die Übergabe über die URL trotzdem geht.
                Nur das ich die Variablen im Script mit $_GET['ag'] abrufen brauch.
                Im Prinzip ändert sich dort doch gar nichts!?

                Es geht nicht um die Uebergabe-Methode.
                Es geht darum, wie Du im Skript auf den Parameter zugreifst.
                Es geht um Sicherheit.

                Beispiel:

                Du hast ein (etwas ungeschicktes) Skript wie z.B.

                if ($passwort=="geheim123")
                  $eingeloggt="ok";

                if ($eingeloggt=="ok")
                  { /* geheime Inhalte anzeigen */ }
                else
                  { die("Du bist nicht berechtigt!"); }

                Wenn der Angreifer z.B. weiss, wie das Skript aufgebaut ist,
                und wenn register_globals="on" ist, dann kann er jetzt mit
                blabla.html?eingeloggt=ok
                die Seite abrufen und damit gleich die Variable
                $eingeloggt, die im Skript verwendet wird, auf "ok" setzen.
                Wenn register_globals="off" ist, hat er keine Chance,
                diese Variable zu setzen.
                Er kann nur $_GET['ok'] setzen, aber nicht $ok.

                Das Beispiel ist sehr lueckenhaft (kein ELSE-Teil)
                und auch sonst nicht sehr praxisnah (Passwortuebergabe
                per GET bzw. URL ist nicht sehr schlau), aber es geht
                mir nur darum, zu zeigen, was moeglich ist.

                Da Du offenbar noch einige Verstaendnis- und Wissensluecken
                hast, empfehle ich Dir, mal die Kapitel zu Formularen und
                Variablen sowie zur Sicherheit in der dclp-FAQ durchzulesen:
                http://www.dclp-faq.de/ch/ch-webvariablen.html
                http://www.dclp-faq.de/ch/ch-security.html

                Gruesse,

                Thomas

                1. Hallo,

                  Sorry, Tippfehler.

                  blabla.html?eingeloggt=ok
                  [...]
                  Er kann nur $_GET['ok'] setzen, aber nicht $ok.

                  sollte heissen:

                  Er kann nur $_GET['eingeloggt'] setzen, aber nicht $eingeloggt.

                  Gruesse,

                  Thomas

              2. Hello,

                Irgendwie weiß ich nicht wo dann noch der Unterschied ist wenn die Übergabe über die URL trotzdem geht.

                Nur das ich die Variablen im Script mit $_GET['ag'] abrufen brauch.

                Im Prinzip ändert sich dort doch gar nichts!?

                Genau das war ja wunderbar in dem anderen Beispiel rausgekommen. Ich werde es nachher mal suchen, weil ich es sowieso für meine Sammlung brauche. Dann schau morgen hier nochnmal vorbei, dann habe ich den Thread bestimmt wiedergefunden.

                Liebe Grüße aus http://www.braunschweig.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                1. Und was wäre wenn ich folgendes machen würde wenn rigsters_globals auf on oder off stände?

                  $ag = $_GET['ag'];

                  Wenn ich eine Bedingung Abfrage darf ich dann nur noch folgendes schreiben?

                  If ($_GET['ag'] == 0 )
                   { ... }

                  Kann ich denn auch $_GET['ag'] einen neuen Wert zuweisen? So wie ich es nun mit $ag = 5; machen würde?

                  Ich kann das nun nicht wirklich überprüfen da ich irstmal herausfinden muß wie die php.ini auf meiner Linux Kiste ist...

                  Gruß Peter Bachmüller

                  1. Hello,

                    Und was wäre wenn ich folgendes machen würde wenn rigsters_globals auf on oder off stände?

                    $ag = $_GET['ag'];

                    Wenn ich eine Bedingung Abfrage darf ich dann nur noch folgendes schreiben?

                    If ($_GET['ag'] == 0 )
                     { ... }

                    Kann ich denn auch $_GET['ag'] einen neuen Wert zuweisen? So wie ich es nun mit $ag = 5; machen würde?

                    Ich kann das nun nicht wirklich überprüfen da ich irstmal herausfinden muß wie die php.ini auf meiner Linux Kiste ist...

                    Wie sie eingestellt ist, oder wo sie liegt? Das WO findest Du z.B. mit

                    find -name "php.ini"

                    Und die Einstellungen bekommst Du auch mit der PHP-Funktion

                    <?php
                    phpinfo();
                    ?>

                    angezeigt.

                    Du darfst mit den globalen Variablen alles machen, was Du mit selbst definierten Variablen auch machen darfst. Diese Arrays sind allerdings "superglobal". Das bedeutet, dass sie nach der Definition durch das System im gesamten Script erreichbar sind. Deshalb sind sie auch schon von Anfang an vorhanden. $_SESSION ist nach dem Aufruf von session_start() vorhanden.

                    Welche Variablen gerade vorhanden sind, erfährst Du mit

                    $_vars = get_defined_vars()
                    echo "<pre>";
                    print_r($_vars);
                    echo "</pre>";

                    Die Vorteile der globalen Arrays sind:

                    • Man kann sie von Außen nicht "faken", sie werden vom System immer angelegt
                    • Das $_GET-Array enthält immer die Paramter aus der URi
                    • Das $_POST-Array enthält immer die Paramter aus dem Formular (Post)
                    • Das $_COOKIE-Array enthält immer die vom Client mitgesandten Cookies
                      ...

                    Lies Dir mal http://de.php.net/manual/de/language.variables.predefined.php durch.

                    Den Thread habe ich auch wiedergefunden:
                    http://forum.de.selfhtml.org/archiv/2004/1/70213/#m404111

                    Wenn man gleichzeitig Paramter über $_GET, $_POST und $_COOKIE überträgt, dann landen die bei register_globals = on in denselben Variablen im Script, wenn sie gleichnamig sind. Ein Faker kann dann auch dafür sorgen, dass Post oder Cookie-Variablen einfach überschrieben werden. Allerdings ist die Reihenfolge meistens EGPC. siehe phpinfo() unter "variables_order: EGPCS"
                    und http://de.php.net/manual/de/configuration.directives.php

                    Viel Erfolg

                    Liebe Grüße aus http://www.braunschweig.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    1. Liebe Grüße aus http://www.braunschweig.de

                      Danke!!!

          2. Hallo,

            Ok aber wenn ich register_golbals auf off stelle darf ich denn die parameter trotzdem mit der url übergeben?

            Ja, klar darfst Du.
            Warum glaubst Du, dass Du das nicht mehr darfst?

            Beispiel:
            blabla.php?varname=wert

            Ab PHP 4.1 hast Du den Wert _immer in den Variablen
            $_GET['varname']
            und
            $_REQUEST['varname']
            und auch in der veralteten
            $HTTP_GET_VARS['varname']

            Wenn register_globals zufaellig noch auf "on" ist,
            dann hast Du den Wert auch noch in der Variablen
            $varname

            Du solltest nur noch $_GET oder $_REQUEST verwenden.

            Bei $_REQUEST ist es egal, ob der Parameter per
            GET (Formular oder URL-Anhaengsel), POST (Formular)
            oder Cookie (via HTTP) daherkommt.

            Bei $_GET _muss_ der Wert als GET-Formular bzw.
            URL-Parameter daherkommen.

            Gruesse,

            Thomas

  3. Hallo!

    ich möchte gerne die aktuelle URL auslesen.

    Das heißt wenn ich dort http://shop/index.php?wg=2&ag=15 stehe
    wie lese ich die String oder Pfad aus?

    Kennst Du die Funktion phpinfo()? Die zeigt die sämtliche Variablennamen und die darin enthaltenen Werte an, die Du in PHP verwenden kannst, siehe: http://de3.php.net/manual/en/function.phpinfo.php

    erstelle Dir so ein Script:
    <?php
    phpinfo();
    ?>

    und guck Dir mal die Ausgabe an. Das kannst Du auch mit Parametern aufrufen, um zu sehen wo Du die wieder findest, z.B. so:

    http://shop/phpinfo-script.php?param=such_mich

    Dann findest Du z.B. folgenden Eintrag:

    _SERVER["REQUEST_URI"] /phpinfo-script.php?param=such_mich

    Das heißt, dass Du eben diesen Wert in einem PHP-Script über die Variable $_SERVER["REQUEST_URI"]  auslesen kannst. Und den Rest bekommst Du bestimmt selber zusammen, den Hostnamen musst Du aus einer anderen Vaiable auslesen, aber guck es Dir mal selber an. Ist sehr hilfreich.

    ich weiß das ich über $wg und $ag die variable habe aber ich möchte den ganzen pfad auslesen!?

    Nein, das solltest Du nicht tun. Wenn Du GET-Parameter auslesen willst verwende:

    $_GET['wg'] ...

    Siehe:
    http://de3.php.net/manual/de/language.variables.predefined.php
    http://de3.php.net/manual/en/reserved.variables.php#reserved.variables.get...
    http://de3.php.net/manual/de/security.registerglobals.php
    http://www.dclp-faq.de/q/q-formular-register-globals.html

    Viele Grüße
    Andreas

    1. Hello,

      Kennst Du die Funktion phpinfo()? Die zeigt die sämtliche Variablennamen und die darin enthaltenen Werte an, die Du in PHP verwenden kannst, siehe: http://de3.php.net/manual/en/function.phpinfo.php

      erstelle Dir so ein Script:
      <?php
      phpinfo();
      ?>

      und guck Dir mal die Ausgabe an. Das kannst Du auch mit Parametern aufrufen, um zu sehen wo Du die wieder findest, z.B. so:

      Das ist so nicht ganz richtig. Sie zeigt auch Konfigurationseinstellungen an und das sind im Sinne von Scripten keine Variablen. Die meisten kan man zwar mit ini_get() abfragen oder mit ini_set() setzen, aber das macht sie auch noch nicht zu Variablen.

      Viel interessanter ist die Funktion nebst Ausgabe:

      $_vars = get_defined_vars();
      echo "<pre>";
      print_r($_vars);
      echo "</pre>";

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      1. Hi!

        Das ist so nicht ganz richtig. Sie zeigt auch Konfigurationseinstellungen an und das sind im Sinne von Scripten keine Variablen.

        Ja, aber das widerspricht ja nicht meiner obigen Aussage, dass phpinfo() sämtliche Variablen die Du verwenden kannst ausgibt ;-)

        IMHO sollte man phpinfo() schon kennen.

        Grüße
        Andreas

        1. Hello,

          Ja, aber das widerspricht ja nicht meiner obigen Aussage, dass phpinfo() sämtliche Variablen die Du verwenden kannst ausgibt ;-)

          IMHO sollte man phpinfo() schon kennen.

          Klar, das sollte gleich vor echo "Hello World"; drankommen.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          1. IMHO sollte man phpinfo() schon kennen.

            Klar, das sollte gleich vor echo "Hello World"; drankommen.

            Ja phpinfo(); kenne ich!

            Aber trotzdem habe ich auch was neues dazugelernt! :-)

      2. Das ist so nicht ganz richtig. Sie zeigt auch

        »»Konfigurationseinstellungen an und das sind im Sinne von Scripten
        »»keine Variablen. Die meisten kan man zwar mit ini_get() abfragen
        »»oder mit ini_set() setzen, aber das macht sie auch noch nicht zu
        »»Variablen.

        Viel interessanter ist die Funktion nebst Ausgabe:

        $_vars = get_defined_vars();
        echo "<pre>";
        print_r($_vars);
        echo "</pre>";

        hi!

        kann ich mit dem einfachen Befehl " ini_get(); " die php.ini umschreiben? vorausgesetzt die ist nicht vom hoster geschützt?

        und wenn das so ist wozu brauch man zb den befehl?

        1. Hallo,

          kann ich mit dem einfachen Befehl " ini_get(); " die php.ini umschreiben? vorausgesetzt die ist nicht vom hoster geschützt?

          Sorry, aber das ABC koennen wir Dir hier nicht beibringen.
          Das musst Du schon selbst lernen.

          Lies doch mal nach, was ini_get() tut:
          http://www.php.net/manual/en/function.ini-get.php

          Und dann, was ini_set() tut:
          http://www.php.net/manual/en/function.ini-set.php
          Was die Codes in der rechten Spalte der grossen Tabelle
          bedeuten, ist unten erklaert:

          PHP_INI_USER   Entry can be set in user scripts
                         => fuer Dich mit ini_set() aenderbar

          PHP_INI_PERDIR Entry can be set in php.ini, .htaccess or httpd.conf
                         => fuer Dich in der .htaccess aenderbar

          PHP_INI_SYSTEM Entry can be set in php.ini or httpd.conf
                         => sozusagen keine Chance fuer Dich als Miet-Kunde...

          PHP_INI_ALL    Entry can be set anywhere
                         => fuer Dich mit ini_set() oder .htaccess aenderbar

          Gruesse,

          Thomas

          --
          Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
          Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
          Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
        2. Hello,

          kann ich mit dem einfachen Befehl " ini_get(); " die php.ini umschreiben? vorausgesetzt die ist nicht vom hoster geschützt?

          und wenn das so ist wozu brauch man zb den befehl?

          Das geht nur für die laufzeit des Scriptes. Die Einstellungen werden damit nicht permanent verändert. Das wäre nicht so praktisch, da Du ja hunderte von Scripten unter einer php.ini laufen lassen kannst und wenn die sich gegenseitig die Konfiguration verändern würden...

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen