v2.0.x Kein richtiger Bug, aber eine üble Nebenwirkung

Thema wurde von Avenger, 16. April 2013 erstellt.

  1. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Es gibt eine ganz üble Nebenwirkung von PHP, in Verbindung mit dem Weg, wie Gambio Eingabe-Felder erstellt….

    Ein Kunde hatte bei der Bearbeitung von Bestellungen in dem Bereich der "Zusammenfassung" nicht die Werte des jeweiligen Eintrags stehen, sondern immer den gleichen Text Wert...

    Diese Eingabe-Felder werden mit "xtc_draw_input_field('value',$ototal['value'])" erzeugt.

    Beim Debuggen hatte "$ototal['value']" aber immer den gewünschten Wert, so dass ich mir die "xtc_draw_input_field"-Funktion angesehen habe.

    Darin gibt es den folgenden Code:

    PHP:
          if ( ($GLOBALS[$name]) && ($reinsert_value) ) {
            
    $field .= ' value="' htmlspecialchars(trim($GLOBALS[$name])) . '"';
        } 
    wobei "$name" hier den Wert "value" hat.

    Und siehe da, "$GLOBALS['value']" hatte genau den Wert, der in allen Feldern angezeigt wurde....

    Und ohne, dass ich "$GLOBALS['value']" explizit definiert hatte.

    Weiteres Debugging ergab dann, dass "$GLOBALS['value']" bei Ausführung des Befehls

    PHP:
    $value=$irgendwas
    gesetzt wurde, obwohl die PHP-Config-Variable "register_globals" auf "Off" steht!

    PHP:
          if ( ($GLOBALS[$name]) && ($reinsert_value) ) {
            
    $field .= ' value="' htmlspecialchars(trim($GLOBALS[$name])) . '"';
        } 
    sollte man m.E. aus der "xtc_draw_input_field"-Funktion entfernen, ich habe da eh' noch nie einen tieferen Sinn gesehen, und es kann solche üblen Nebenwirkungen erzeugen.
     
  2. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.749
    Danke vergeben:
    137
    Moin,

    register_globals bezieht sich nur darauf, ob Werte aus Environment/GET/POST/Cookies/Server in den globalen Namensraum übernommen werden. (Dieser Kram verschwindet zum Glück mit PHP 5.4 endgültig.) Im eigentlichen PHP-Code können globale Variablen immer gesetzt werden.
     
  3. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Der Punkt ist ja, dass diese Variable eben nicht explizit, sondern durch eine Nebenwirkung gesetzt wurde.

    Und das Problem habe ich unter 5.4 hier auch noch.
     
  4. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.749
    Danke vergeben:
    137
    Du schriebst doch selbst, dass es irgendwo eine Zuweisung der Form

    PHP:
    $value $irgendwas;
    gibt. Wenn diese Zuweisung im globalen Namensraum geschieht, ist das semantisch identisch mit

    PHP:
    $GLOBALS['value'] = $irgendwas;
    Desweiteren ist

    PHP:
    function beispiel() {
      global 
    $value;
      echo 
    $value;
    }
    im Prinzip das gleiche wie

    PHP:
    function beispiel() {
      echo 
    $GLOBALS['value'];
    }
    Was ich meine: Mit register_globals hat das alles nichts zu tun. Das ist einfach nur das normale Verhalten des globalen Namensraumes in PHP.

    Problematisch ist hier, das xtc_draw_input_field() überhaupt Daten aus dem globalen Namensraum verwendet.
     
  5. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Genau das wollte ich eigentlich sagen, das sollte m.E. da 'raus....