Moses: Verständinsfrage $_GET /$_Post Globals on oder off

Hallo,
habe gleich noch eine zweite Frage - nur des Verständnisses wegen.
Es wird immer wieder diskutiert, daß Register Globals On gefährlich wäre - aber irgendwie verstehe ich das Problem nicht.
Habe eine variable $a
der Inhalt dieser Variablen wird entweder über url anhang oder formular gefüllt, da ist es doch vollkommen egal ob ich diese Variable direkt beziehe oder über $_GET[$a] oder $_POST[$a] - der Inhalt ist doch exakt der gleiche, oder???
OK, durch get/post kann ich sehen woher der Inhalt der Variablen kommt, aber das ist doch schon alles.
In beiden Fällen ist es doch gleichwichtig, wie ich im Script mit der Variablen umgehe also je nach Verwendungszweck (htmlspecialchars, etc. etc.) die Variable "entschärfe".
Welche zusätzliche Sicherheit bietet mir das Globals Off?

Bitte nicht böse sein - versuche es nur zu verstehen :-)

Grüße,
Moses

  1. Mahlzeit,

    Habe eine variable $a

    WO hast Du die?

    der Inhalt dieser Variablen wird entweder über url anhang oder formular gefüllt, da ist es doch vollkommen egal ob ich diese Variable direkt beziehe oder über $_GET[$a] oder $_POST[$a] - der Inhalt ist doch exakt der gleiche, oder???
    OK, durch get/post kann ich sehen woher der Inhalt der Variablen kommt, aber das ist doch schon alles.

    Genau darum geht's: dass niemand Deine Variablen "von außen" manipulieren kann, sondern Du stattdessen die Werte explizit aus den genannten Arrays "abholen" musst (und sie dabei natürlich auf Gültigkeit usw. prüfen solltest).

    In beiden Fällen ist es doch gleichwichtig, wie ich im Script mit der Variablen umgehe also je nach Verwendungszweck (htmlspecialchars, etc. etc.) die Variable "entschärfe".
    Welche zusätzliche Sicherheit bietet mir das Globals Off?

    Wenn "Globals = On" gesetzt ist, hättest Du, wenn Du z.B. einen URL-Parameter wie "?a=foobar" an Dein Skript anhängst, automagisch eine mit dem String "foobar" gefüllte Variable $a zur Verfügung. Das Problem daran ist, dass man damit beliebe Inhalte in Dein Skript einschleusen könnte, wenn Du Deine Variablen vor der ersten Benutzung nicht initialisierst.

    Bitte nicht böse sein - versuche es nur zu verstehen :-)

    Aber gerne doch.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Moin, moin,

      Mahlzeit,

      Habe eine variable $a

      WO hast Du die?

      In meinem Script ich will ja irgendwas mit $a machen - sonst bräuchte ich die nicht

      Genau darum geht's: dass niemand Deine Variablen "von außen" manipulieren kann, sondern Du stattdessen die Werte explizit aus den genannten Arrays "abholen" musst (und sie dabei natürlich auf Gültigkeit usw. prüfen solltest).

      Wenn "Globals = On" gesetzt ist, hättest Du, wenn Du z.B. einen URL-Parameter wie "?a=foobar" an Dein Skript anhängst, automagisch eine mit dem String "foobar" gefüllte Variable $a zur Verfügung. Das Problem daran ist, dass man damit beliebe Inhalte in Dein Skript einschleusen könnte, wenn Du Deine Variablen vor der ersten Benutzung nicht initialisierst.

      ok hänge "?a=foobar" an

      ob $a sofort verfügbar ist, oder erst "abgeholt" werden muß ändert doch nichts am Inhalt von $a? Sprich die Variale ist genauso beliebig von außen manipulierbar: wenn ich jetzt böswillig "?a=<script>lösche Datenbank</script>" anhänge passiert das gleiche ob GLobals on oder Off gesetzt sind. Entweder ich überprüfe die Variable vor Gebrauch oder nicht (dann ist's blöd gelaufen) aber ob die Variable sofort zur Verfügung steht oder aus dem Array abgeholt werden muß macht doch keinen Unterschied - sorry ich peil's einfach nicht.

      Grüße,
      Moses

      1. Yerf!

        ob $a sofort verfügbar ist, oder erst "abgeholt" werden muß ändert doch nichts am Inhalt von $a? Sprich die Variale ist genauso beliebig von außen manipulierbar: wenn ich jetzt böswillig "?a=<script>lösche Datenbank</script>" anhänge passiert das gleiche ob GLobals on oder Off gesetzt sind. Entweder ich überprüfe die Variable vor Gebrauch oder nicht (dann ist's blöd gelaufen) aber ob die Variable sofort zur Verfügung steht oder aus dem Array abgeholt werden muß macht doch keinen Unterschied - sorry ich peil's einfach nicht.

        Das Problem sind nicht die Variablen, von denen du erwartest, dass sie per Post/Get kommen, sondern alle anderen. In PHP ist es möglich Variablen ohne vorherige Initialisierung zu verwenden. Ist dies der Fall, so kann jemand durch Modifizieren der URL dir ungünstige Werte in diese Variablen einbringen.

        Oder anders Ausgedrückt: mit register_globals muss *absolut jede* Variable als potentiell gefährlich betrachtet werden.

        Gruß,

        Harlequin

        --
        <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
        1. Hi,

          Das Problem sind nicht die Variablen, von denen du erwartest, dass sie per Post/Get kommen, sondern alle anderen. In PHP ist es möglich Variablen ohne vorherige Initialisierung zu verwenden. Ist dies der Fall, so kann jemand durch Modifizieren der URL dir ungünstige Werte in diese Variablen einbringen.

          Oder anders Ausgedrückt: mit register_globals muss *absolut jede* Variable als potentiell gefährlich betrachtet werden.

          Hmm, aber muß ich die Variablen nicht in meinem Script verarbeiten damit sie gefährlich werden?
          also es kann doch nur gefährlich sein was angesprochen wird, also z.B.
          "?a=inhalt&b=3&c=action";

          <script>
          <?php

          mache was mit $a;

          mache was mit $b;

          mache was mit $c;
          ?>

          wenn dann eine Variable angehängt wird, die keinen Sinn macht weil
          im Script nicht vorkommend also z.B. "?d=fremdeingabe";
          aber $d wird im Script nicht angesprochen - passiert doch auch nichts, oder?

          Grüße,
          Moses

          1. Yerf!

            wenn dann eine Variable angehängt wird, die keinen Sinn macht weil
            im Script nicht vorkommend also z.B. "?d=fremdeingabe";
            aber $d wird im Script nicht angesprochen - passiert doch auch nichts, oder?

            Im Prinzip ja, aber man benutzt ja normalerweise in einem Skript nicht nur die Parameter sondern auch Hilfsvariablen. Wenn da eine nicht vorinitialisiert wurde wirds gefährlich (z.B. wenn man einen String immer nur mit $var += "text" aufbaut)

            Man sollte beim Programmieren immer so vorgehen, dass möglichst viele Fehler bereits von vorneherein ausgeschlossen werden. Von daher solltest du die Tipps  von Vinzenz beherzigen.

            Gruß,

            Harlequin

            --
            <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
            1. Hallo,

              Man sollte beim Programmieren immer so vorgehen, dass möglichst viele Fehler bereits von vorneherein ausgeschlossen werden. Von daher solltest du die Tipps  von Vinzenz beherzigen.

              Das ist eh klar! :-) und ich teste bzw. "entschärfe" die Variablen auch vor gebrauch nur mir ist immer noch nicht ganz klar, wo die Gefahr liegt  - habe anscheind ein großes Brett vorm Kopf....
              Grüße,
              Moses

      2. Hallo Moses,

        ok hänge "?a=foobar" an
        ob $a sofort verfügbar ist, oder erst "abgeholt" werden muß

        Du solltest nicht

        $a = $_GET['a']

        schreiben. Du verschleierst die Herkunft. Verwende - soweit es geht - das
        superglobale Array $_GET ( bzw. $_POST oder $_<usw>). Das sind _auch_ Variablen.
        Wozu nochmals umkopieren?

        Und ja: verlasse Dich nicht auf register_globals = off.
        Initialisiere _grundsätzlich_ jede Variable, die Du benutzt.
        Dann spielt der Wert von register_globals keine Rolle mehr, zusammengefasst:

        1. Programmiere so, als sei register_globals = off, d.h. greife auf $_GET['a']
             und nicht auf $a zu.
        2. Programmiere so, als sei register_globals = on, d.h. initialisiere jede
             selbstdefinierte Variable, die Du benutzt, damit Dir nicht jemand Werte
             unterjubeln kann.

        Während der Entwicklung verwende die Einstellung error_reporting = E_ALL (und
        display_errors = on) und programmiere so, dass Du keine einzige Notice bekommst.

        Freundliche Grüße

        Vinzenz

        1. Hallo

          Warum kann man nicht mehr als einmal "fachlich hilfreich" vergeben?

          Du solltest nicht

          $a = $_GET['a']

          schreiben. Du verschleierst die Herkunft. Verwende - soweit es geht - das
          superglobale Array $_GET ( bzw. $_POST oder $_<usw>). Das sind _auch_ Variablen.
          Wozu nochmals umkopieren?

          Und ja: verlasse Dich nicht auf register_globals = off.
          Initialisiere _grundsätzlich_ jede Variable, die Du benutzt.
          Dann spielt der Wert von register_globals keine Rolle mehr, zusammengefasst:

          1. Programmiere so, als sei register_globals = off, d.h. greife auf $_GET['a']
               und nicht auf $a zu.
          2. Programmiere so, als sei register_globals = on, d.h. initialisiere jede
               selbstdefinierte Variable, die Du benutzt, damit Dir nicht jemand Werte
               unterjubeln kann.

          Während der Entwicklung verwende die Einstellung error_reporting = E_ALL (und
          display_errors = on) und programmiere so, dass Du keine einzige Notice bekommst.

          Achja, und: Warum kann man nicht mehr als einmal "fachlich hilfreich" vergeben?

          Tschö, Auge

          --
          Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
          (Victor Hugo)
          Veranstaltungsdatenbank Vdb 0.2
      3. Hi,

        ob $a sofort verfügbar ist, oder erst "abgeholt" werden muß ändert doch nichts am Inhalt von $a? Sprich die Variale ist genauso beliebig von außen manipulierbar: wenn ich jetzt böswillig "?a=<script>lösche Datenbank</script>" anhänge passiert das gleiche ob GLobals on oder Off gesetzt sind.

        nein. Du hast die wesentliche Aussage wohl überlesen:

        dass man damit beliebe Inhalte in Dein Skript einschleusen könnte, wenn Du Deine Variablen vor der ersten Benutzung nicht initialisierst.

        Wenn Dein Script z.B. so aussieht:
        if(isset($_POST['passwort']) && $_POST['passwort']=='geheim') $admin=true;
        und weiter hinten dann:
        if(isset($admin) && $admin) #lösche Datenbank
        dann kann bei register_globals=on ein User ?admin=1 an die URL hängen und prompt ist die Datenbank weg... (Schlampige Programmierer verzichten auch auf die isset-Abfrage, zumal wenn das error_reporting deaktiviert ist).

        Es geht hierbei ja gar nicht um _erwartete_ URL-Variablen, sondern eben um Variablen, die vom Script selbst angelegt und genutzt werden.

        Auch gerne gesehen:
        $text .= $_GET['text']
        bei register_globals=on ohne vorherige Initialisierung $text='' ist die Eingabe veredoppelt.

        Ich hatte es auch schon mit einem CMS zu tun, das bei register_globals=on fehlerhaft lief, wenn ich ein Formularfeld mit einem vom Script verwendeten Namen eingebaut hatte. Wie ich dann gesehen hatte, umschifften andere Autoren dieses Problem durch kryptische Feldnamen wie xyztext... ;-)

        freundliche Grüße
        Ingo

        1. Hi,

          Wenn Dein Script z.B. so aussieht:
          if(isset($_POST['passwort']) && $_POST['passwort']=='geheim') $admin=true;
          und weiter hinten dann:
          if(isset($admin) && $admin) #lösche Datenbank
          dann kann bei register_globals=on ein User ?admin=1 an die URL hängen und prompt ist die Datenbank weg... (Schlampige Programmierer verzichten auch auf die isset-Abfrage, zumal wenn das error_reporting deaktiviert ist).

          Ah! Jetzt kapiere ich so langsam! Ja, das Brett vorm Kopf war sogar größer als gedacht - Asche auf mein Haupt, manchmal brauche ich etwas länger....

          Danke,
          Moses