guma: Ist dieser Code ..Register-Globals-OFF-Kompatibel..?

Hallo ich stelle gerade einiges in meinem alten script um, das sich noch auf Globals = On verlassen hat.

Sind folgende Code-Elemente Register-Globals-OFF-Kompatibel?

//saugt die Variablen aus dem Array heraus
if (isset($HTTP_GET_VARS))
extract($HTTP_GET_VARS);

//form mit einem input hidden, um eine $action=deldb  und $id zu übergeben
<form action="<? printf("%s",$_SERVER['PHP_SELF']) ?>" method="post" name="del">

<input name="id" type="hidden" value="<? $db->p("nid"); ?>">
   <input name="action" type="hidden" value="deldb">
   <input name="" type="submit" value=" ja " class="button">
  </form>

//Variable wird aus einer Session geholt
$mykid = $_SESSION['kidkat'];

Ich bin dankbar für jede Anregung und Hilfe. Ich will  einen sauberen Code hinbekommen.

Guma

  1. hi,

    Sind folgende Code-Elemente Register-Globals-OFF-Kompatibel?

    //saugt die Variablen aus dem Array heraus
    if (isset($HTTP_GET_VARS))
    extract($HTTP_GET_VARS);

    Das ist so kompatibel, dass es auch die gleichen Risiken mit sich bringt.

    Wenn schon extract - dann bitte wenigstens in Verbindung mit einem sinnvoll ausgewählten Flag.

    Und $HTTP_GET_VARS? Schreibst du für eine so alte PHP-Version, dass du nicht $_GET an der Stelle benutzen kannst?

    <input name="id" type="hidden" value="<? $db->p("nid"); ?>">

    Das funktioniert natürlich nur, wenn short_open_tags aktiviert ist.
    Wenn du aber schon eine Umstellung machst, um die Kompabilität zu verbessern - dann besser auch an solchen Stellen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo Wahsager,

      danke für die Anregung.
      FALSCH:

      Mit dieser Umstellung wäre mir laut deinem Urteil nicht geholfen, da es weiter unsicher ist. Ich umgehe zwar damit mein Problem kümmere mich aber nicht um die Gefahr?! Richtig?

      if (isset($_GET))
      extract($_GET);

      wäre also auch nicht gut!?

      RICHTIG?

      Da eine übergebene Variable nicht sofort global zur Verfügung steht muss ich jede Variable explizit aus dem Array fischen?

      Beispiel:
      $var1 = $_GET["variable1"];
      $var2 = $_GET["variable2"];
      echo $var1 $var2;

      Ist das sicher genug?

      Guma

      1. hi,

        Mit dieser Umstellung wäre mir laut deinem Urteil nicht geholfen, da es weiter unsicher ist. Ich umgehe zwar damit mein Problem kümmere mich aber nicht um die Gefahr?! Richtig?

        Ja, das grundsätzliches Problem bleibt das gleiche - das, was PHP vorher mit register_globals=on "automatisch" gemacht hat, holst du hier selber nach.
        Hat für den Script den Effekt, dass es genauso "läuft" wie vorher - was die gleichen potentiellen Schwachstellen mit einschließt.

        if (isset($_GET))
        extract($_GET);

        wäre also auch nicht gut!?

        Ist exakt das gleiche.

        Da eine übergebene Variable nicht sofort global zur Verfügung steht muss ich jede Variable explizit aus dem Array fischen?

        Beispiel:
        $var1 = $_GET["variable1"];
        $var2 = $_GET["variable2"];
        echo $var1 $var2;

        Du brauchst sie nicht unbedingt "herausfischen" - du kannst auch jeweils $_GET["variable1"] an den Stellen benutzen, wo du den Wert brauchst.
        Hat den Vorteil, dass du so beim Überfliegen des Scriptes immer sofort siehst, wo dieser Wert herkommt - es handelt sich um einen per GET übergebenen Wert.
        $var1 hingegen würdest du das nicht unbedingt auf Anhieb ansehen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Danke für die genaue Beschreibung und Hilfe. Ich habe genau verstanden wie ich es umsetzen kann.

          Jetzt noch eine Frage zu dem Form mit hidden-feld:
          ALT:

          <form action="<? printf("%s",$_SERVER['PHP_SELF']) ?>" method="post">
             <input name="action" type="hidden" value="new">
             <input name="" type="submit" value="Neuer Eintrag" class="button">
          </form>

          NEU:

          <form action="<? printf("%s?action=new",$_SERVER['PHP_SELF']) ?>" method="post">
          <input name="" type="submit" value="Neuer Eintrag" class="button">
          </form>

          Ist das neue die beste Lösung, um action zu übergeben? Hidden ist nur möglich, wenn die Einstellungen im PHP dafür auf ON sind.

          Was denskst Du?
          Guma

          1. hi,

            <form action="<? printf("%s?action=new",$_SERVER['PHP_SELF']) ?>" method="post">

            Ist das neue die beste Lösung, um action zu übergeben?

            "Beste" Lösungen existieren selten, vieles ist auch Geschmacksache.

            Hidden ist nur möglich, wenn die Einstellungen im PHP dafür auf ON sind.

            Wie meinst du das?
            Natürlich kannst du den Parameter action auch in einem hidden field übergeben - aber dann findest du ihn, bei der gewählten Versandmethode deines Formulars, natürlich in $_POST wieder, nicht in $_GET.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Ah, verstanden. Macht nichts ich benötige das Hidden-Feld hier nicht, da ich die Variable $action mit dem Link übergebe und ihn wie besprochen auf der Folgeseite mit $_GET anspreche.

              Danke nochmal. Have a nice Day Wahsaga!

              Guma

  2. Moin!

    Hallo ich stelle gerade einiges in meinem alten script um, das sich noch auf Globals = On verlassen hat.

    Sehr gute Idee!

    Sind folgende Code-Elemente Register-Globals-OFF-Kompatibel?

    //saugt die Variablen aus dem Array heraus

    if (isset($HTTP_GET_VARS))
    extract($HTTP_GET_VARS);

      
    Dazu hat [wahsaga](https://forum.selfhtml.org/?t=124680&m=803569) schon ein paar schlaue Worte gesagt, nimm lieber  
      
    ~~~php
    $style = $_GET['style'];  
    $category = $_GET['cat'];
    

    Der Vorteil ist auch, dass du eher auf die Idee kommst, solche Variablen zu prüfen; wenn $category z.B. auf eine Datei verweist:

    $category = basename($_GET['cat']);

    //form mit einem input hidden, um eine $action=deldb  und $id zu übergeben

    <form action="<? printf("%s",$_SERVER['PHP_SELF']) ?>" method="post" name="del">

      
    Anstelle von [printf](http://de.php.net/manual/de/function.printf.php) bietet sich hier wohl eher [echo](http://de.php.net/manual/de/function.echo.php) an.  
      
    
    > `   <input name="id" type="hidden" value="<? $db->p("nid"); ?>">`{:.language-php}  
      
    Ist es sinnvoll zu wissen, wo `$db`{:.language-php} herkommt (aus `$_GET`{:.language-php} stammt es wohl nicht)?  
      
    
    > ~~~php
    
       <input name="action" type="hidden" value="deldb">  
    
    >    <input name="" type="submit" value=" ja " class="button">  
    >   </form>  
    >   
    > //Variable wird aus einer Session geholt  
    > $mykid = $_SESSION['kidkat'];
    
    

    Geh genau so ^^^ auch mit deinen GET-Variablen um. Das Problem mit register_globals kann sehr subtil sein, schau dir dazu z.B. die PHP-Dokumentation zur Verwendung von Register Globals an.

    Ich bin dankbar für jede Anregung und Hilfe. Ich will einen sauberen Code hinbekommen.

    Ich kann nur noch einmal betonen: Sehr löblich, viele (die meisten?) PHP-„Progger“ kümmern sich leider praktisch gar nicht um Sicherheit, da ist jede Ausnahme nur zu begrüßen und unterstützen.

    Viele Grüße,
    Robert

    1. Vielen Dank Robert,

      klar Sicherheit ist mir wichtig und sollte allen PHPlern wichtig sein. Bestimmt lesen das hier einige durch und entscheiden sich auch dazu einiges an CODE-Altlasten zu ändern.

      Ich habe da noch ne Frage:
      Es bietet sich an, bei eventuell fehlenden oder nicht übergebenen Variablen einen Default-Wert zu setzen:

      if (! ($my_chichi=$_POST["chichi"]))
      {
      $my_chichi="Default";
      }
      echo $my_chichi;

      Ist das wichtig oder gut? Etwas aufwendig das für alle übergebenen Variablen zu machen. Oder?!

      Grüße von Guma

      1. hi,

        Es bietet sich an, bei eventuell fehlenden oder nicht übergebenen Variablen einen Default-Wert zu setzen:

        if (! ($my_chichi=$_POST["chichi"]))
        {
        $my_chichi="Default";
        }
        echo $my_chichi;

        Ist das wichtig oder gut?

        Andernfalls, wenn eine Variable _nicht_ definiert wurde, müsstest du vor jedem (lesenden) Zugriff auf diese erst überprüfen, _ob_ sie existiert (isset(), ggf. empty()) - sonst meldet dir PHP, wenn du das error_reporting auf E_ALL gestellt hast (und das solltest du zum Entwickeln natürlich tun) einen Fehler (Notice).
        (Das würde es bei obigem Code übrigens eh schon tun, wenn $_POST["chichi"] nicht gesetzt wäre. Also auch dort überprüfen ...)

        Etwas aufwendig das für alle übergebenen Variablen zu machen. Oder?!

        Noch etwas aufwendiger, jedes mal prüfen zu müssen, oder? ;-)

        gruß,
        wahsaga

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

        klar Sicherheit ist mir wichtig und sollte allen PHPlern wichtig sein. Bestimmt lesen das hier einige durch und entscheiden sich auch dazu einiges an CODE-Altlasten zu ändern.

        Hoffentlich!

        Ich habe da noch ne Frage:

        Nur her damit.

        Es bietet sich an, bei eventuell fehlenden oder nicht übergebenen Variablen einen Default-Wert zu setzen:

        if (! ($my_chichi=$_POST["chichi"]))

        {
        $my_chichi="Default";
        }
        echo $my_chichi;

          
        Falls du [error_reporting](http://de.php.net/manual/de/ref.errorfunc.php#ini.error-reporting) auf E\_ALL gesetzt hast, wirst du feststellen, dass sich PHP beschwert, wenn `$_POST`{:.language-php} keinen Schlüssel namens `"chichi"`{:.language-php} enthält:  
          
        ~~~php
        if (! (array_key_exists('chichi', $_POST) && ($my_chichi = $_POST['chichi']))) {  
            $my_chichi = 'Default';  
        }  
        echo $my_chichi;
        

        Was mir gerade noch aufgefallen ist: Ich bevorzuge, wenn möglich, die einfachen 'Quotes', doppelte "Quotes" sollte man nur nehmen, wenn im String Escapesequenzen stehen oder Variablen ausgewertet werden. Der Interpreter braucht bei einfachen 'Quotes' nicht nach Escapes und Variablen Ausschau zu halten, es ist bei einfachen Zeichenketten performanter.

        Ist das wichtig oder gut? Etwas aufwendig das für alle übergebenen Variablen zu machen. Oder?!

        Das ist wichtig und gut und natürlich etwas aufwändig für alle übergebenen Variablen, die man benutzt. Aber nicht immer sind einfache Dinge automatisch sicherer als kompliziertere.

        Viele Grüße,
        Robert