Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: BUG? - application_top.php

    webald

    • modified Team
    • Beiträge: 2.791
    BUG? - application_top.php
    am: 02. März 2015, 13:44:22
    Ich habe wieder was.

    shoproot/includes/application_top.php:
    Code: PHP  [Auswählen]
    // load configuration
    $configuration_query = xtc_db_query('select configuration_key as cfgKey, configuration_value as cfgValue from '.TABLE_CONFIGURATION);
    while ($configuration = xtc_db_fetch_array($configuration_query)) {
      define($configuration['cfgKey'], stripslashes($configuration['cfgValue'])); //Web28 - 2012-08-09 - fix slashes
    }
    // Set the length of the redeem code, the longer the more secure
    // Kommt eigentlich schon aus der Table configuration
    if(SECURITY_CODE_LENGTH=='')
      define('SECURITY_CODE_LENGTH', '10');

    define(SECURITY_CODE_LENGTH, '10') ist nicht gleich define('SECURITY_CODE_LENGTH', '10')

    Prüft man auf das Vorhandensein einer Konstanten gibt das u. U. fehlerhafte Infos. Zu prüfen mit unten stehendem Code:
    Code: PHP  [Auswählen]
    // load configuration
    $configuration_query = xtc_db_query('select configuration_key as cfgKey, configuration_value as cfgValue from '.TABLE_CONFIGURATION);
    while ($configuration = xtc_db_fetch_array($configuration_query)) {
      define($configuration['cfgKey'], stripslashes($configuration['cfgValue'])); //Web28 - 2012-08-09 - fix slashes
    }
    // Set the length of the redeem code, the longer the more secure
    // Kommt eigentlich schon aus der Table configuration
    if(SECURITY_CODE_LENGTH=='')
      define('SECURITY_CODE_LENGTH', '10');

    if (defined(SECURITY_CODE_LENGTH)){echo ' SECURITY_CODE_LENGTH1: '.SECURITY_CODE_LENGTH;}
    if (defined('SECURITY_CODE_LENGTH')){echo ' SECURITY_CODE_LENGTH2: '.SECURITY_CODE_LENGTH;}

    Ich habe das noch nicht geprüft, aber befürchte, dass dies in weiteren Dateien im Shop ähnlic ungenaus sein dürfte.

    Linkback: https://www.modified-shop.org/forum/index.php?topic=32400.0

    web0null

    • Experte
    • Beiträge: 1.998
    Re: BUG? - application_top.php
    Antwort #1 am: 02. März 2015, 13:56:41
    Das existieren einer Konstante wird so geprüft:
    Code: PHP  [Auswählen]
    if(defined('SECURITY_CODE_LENGTH')){
      ...
    }

    Code: PHP  [Auswählen]
    if(SECURITY_CODE_LENGTH = '')
    Prüft den Inhalt der Konstante, wenn die Konstante nicht angelegt ist, würde der Inhalt "SECURITY_CODE_LENGTH" sein.

    Code: PHP  [Auswählen]
    defined(SECURITY_CODE_LENGTH)
    habe ich auch schon öfter gesehen, ist aber falsch.

    webald

    • modified Team
    • Beiträge: 2.791
    Re: BUG? - application_top.php
    Antwort #2 am: 02. März 2015, 14:11:33
    Code: PHP  [Auswählen]
    defined(SECURITY_CODE_LENGTH)
    habe ich auch schon öfter gesehen, ist aber Falsch.
    Tja, aber genauso werden im Shop die Config-Daten aus der Datenbank angelegt.

    Siehe application_top.php:
    Code: PHP  [Auswählen]
    // load configuration
    $configuration_query = xtc_db_query('select configuration_key as cfgKey, configuration_value as cfgValue from '.TABLE_CONFIGURATION);
    while ($configuration = xtc_db_fetch_array($configuration_query)) {
      define($configuration['cfgKey'], stripslashes($configuration['cfgValue'])); //Web28 - 2012-08-09 - fix slashes
    }

    web0null

    • Experte
    • Beiträge: 1.998
    Re: BUG? - application_top.php
    Antwort #3 am: 02. März 2015, 14:19:01
    Zitat
    Tja, aber genauso werden im Shop die Config-Daten aus der Datenbank angelegt.
    Was hat das jetzt damit zu tun?
    Das eine ist die function "defined" zum prüfen, und das andere ist die function "define" zum anlegen.

    So jetzt was zum nachdenken,

    Folgendes wäre genauso korrekt,
    Code: PHP  [Auswählen]
    define('TEST', 'NEU_TEST');
    define(TEST, 'neu_test');
    if (defined('NEU_TEST')) {
      echo('<pre>'.print_r(NEU_TEST, true).'</pre><hr />');
    }
    define('NEU_TEST4', 'neu_test4');
    define('NEU_TEST2', 'NEU_TEST3');
    define(NEU_TEST2, 'NEU_TEST4');
    if (defined(NEU_TEST3)) {
      echo('<pre>'.print_r(NEU_TEST4, true).'</pre><hr />');
    }

     

    webald

    • modified Team
    • Beiträge: 2.791
    Re: BUG? - application_top.php
    Antwort #4 am: 02. März 2015, 14:47:51
    Teste:
    Code: PHP  [Auswählen]
      //define('SECURITY_CODE_LENGTH', '10');
      define(SECURITY_CODE_LENGTH, '20');

    if (defined(SECURITY_CODE_LENGTH)){echo ' SECURITY_CODE_LENGTH1: '.SECURITY_CODE_LENGTH;}
    if (defined('SECURITY_CODE_LENGTH')){echo ' SECURITY_CODE_LENGTH2: '.SECURITY_CODE_LENGTH;}
     
    Ergebnis:
    Zitat
    Notice: Use of undefined constant SECURITY_CODE_LENGTH - assumed 'SECURITY_CODE_LENGTH' in D:\apache\xampp181\htdocs\xtc\test2.php on line 4
    SECURITY_CODE_LENGTH2: 20

    Code: PHP  [Auswählen]
     define('SECURITY_CODE_LENGTH', '10');
      define(SECURITY_CODE_LENGTH, '20');

    if (defined(SECURITY_CODE_LENGTH)){echo ' SECURITY_CODE_LENGTH1: '.SECURITY_CODE_LENGTH;}
    if (defined('SECURITY_CODE_LENGTH')){echo ' SECURITY_CODE_LENGTH2: '.SECURITY_CODE_LENGTH;}
     
    Ergebnis:
    Zitat
    SECURITY_CODE_LENGTH1: 10 SECURITY_CODE_LENGTH2: 10

    Code: PHP  [Auswählen]
      define('SECURITY_CODE_LENGTH', '10');
      define('SECURITY_CODE_LENGTH', '20');

    if (defined(SECURITY_CODE_LENGTH)){echo ' SECURITY_CODE_LENGTH1: '.SECURITY_CODE_LENGTH;}
    if (defined('SECURITY_CODE_LENGTH')){echo ' SECURITY_CODE_LENGTH2: '.SECURITY_CODE_LENGTH;}
     
    Ergebnis:
    Zitat
    Notice: Constant SECURITY_CODE_LENGTH already defined in D:\apache\xampp181\htdocs\xtc\test2.php on line 4
    SECURITY_CODE_LENGTH2: 10

    web0null

    • Experte
    • Beiträge: 1.998
    Re: BUG? - application_top.php
    Antwort #5 am: 02. März 2015, 14:52:06
    Zitat
    define('SECURITY_CODE_LENGTH', '10');
    define(SECURITY_CODE_LENGTH, '20');

    Das bedeutet das selbe wie,
    Code: PHP  [Auswählen]
    define('SECURITY_CODE_LENGTH', '10');
    define('10', '20');
     

    Wäre zwar von Schreibweise korrekt (bis auf das, dass eine Konstante mit einem Buchstaben oder Unterstrich beginnen muss), aber in dem Fall nicht gewollt,

    So wie ich oben angeführt habe, kann es solche Konstellationen geben.

    In dem Fall deines ersten Beispiels ist ein
    Code: PHP  [Auswählen]
    defined(SECURITY_CODE_LENGTH)
    Falsch, in dem sinne das etwas anderes geprüft werden sollte.

    In diesem konkreten Fall:
    Wenn "SECURITY_CODE_LENGTH" in der DB steht mit "10"

    Würde ein
    Code: PHP  [Auswählen]
    defined(SECURITY_CODE_LENGTH)
     

    dasselbe bedeuten wie,

    Code: PHP  [Auswählen]
    defined('10')
     

    Wenn "SECURITY_CODE_LENGTH" nicht in der DB steht (also auch nicht definiert wird)

    Würde ein
    Code: PHP  [Auswählen]
    defined(SECURITY_CODE_LENGTH)
     

    dasselbe bedeuten wie,

    Code: PHP  [Auswählen]
    defined('SECURITY_CODE_LENGTH')
     

    In diesem Fall ist es aber nicht gewollt Den INHALT von "SECURITY_CODE_LENGTH" zu prüfen sondern, ob eine Konstante mit dem Namen "SECURITY_CODE_LENGTH" besteht.

    webald

    • modified Team
    • Beiträge: 2.791
    Re: BUG? - application_top.php
    Antwort #6 am: 02. März 2015, 15:26:39
    Du hast den Code oben schon gesehen?
    Code: PHP  [Auswählen]
    // load configuration
    $configuration_query = xtc_db_query('select configuration_key as cfgKey, configuration_value as cfgValue from '.TABLE_CONFIGURATION);
    while ($configuration = xtc_db_fetch_array($configuration_query)) {
      define($configuration['cfgKey'], stripslashes($configuration['cfgValue'])); //Web28 - 2012-08-09 - fix slashes
    }
    // Set the length of the redeem code, the longer the more secure
    // Kommt eigentlich schon aus der Table configuration
    if(SECURITY_CODE_LENGTH=='')
      define('SECURITY_CODE_LENGTH', '10');

    Im Prinzip steht da doch:
    Code: PHP  [Auswählen]
    define(SECURITY_CODE_LENGTH, '');
    if(SECURITY_CODE_LENGTH=='')
      define('SECURITY_CODE_LENGTH', '10');

    Prüft man nun die Konstante etwa mit
    Code: PHP  [Auswählen]
    if (defined(SECURITY_CODE_LENGTH)){echo ' SECURITY_CODE_LENGTH1: '.SECURITY_CODE_LENGTH;}
    if (defined('SECURITY_CODE_LENGTH')){echo ' SECURITY_CODE_LENGTH2: '.SECURITY_CODE_LENGTH;}
    kommt als Ergebnis:
    Zitat
    SECURITY_CODE_LENGTH2: 

    Ist auch logisch, Konstanten kann man nicht mit neuen Werten belegen. Die Kontrolle läuft damit ins Leere.

    Code: PHP  [Auswählen]
    while ($configuration = xtc_db_fetch_array($configuration_query)) {
            $cfgkey="'".$configuration['cfgKey']."'";
            $cfgvalue="'".stripslashes($configuration['cfgValue'])."'";
            define($cfgkey,$cfgValue); //Web28 - 2012-08-09 - fix slashes
            //define($configuration['cfgKey'], stripslashes($configuration['cfgValue'])); //Web28 - 2012-08-09 - fix slashes
    }
    führt beim Aufruf von shoproot/index.php übrigens zur bekannten weißen Seite. Irgendwo in templates/xtc5/source/boxes.php steigt er da aus. Bis jetzt habe ich aber keine Ahnung warum. Spielt aber erstmal keine Rolle.

    web0null

    • Experte
    • Beiträge: 1.998
    Re: BUG? - application_top.php
    Antwort #7 am: 02. März 2015, 15:35:02
    Zitat
    Du hast den Code oben schon gesehen?
    Ja habe ich,
    ...du hast ihn aber nicht verstanden.

    Das
    Code: PHP  [Auswählen]
    define($configuration['cfgKey'], stripslashes($configuration['cfgValue']));

    bedeutet nicht,
    Code: PHP  [Auswählen]
    define(SECURITY_CODE_LENGTH, '???');

    sondern es bedeutet,
    Code: PHP  [Auswählen]
    define('SECURITY_CODE_LENGTH', '???');

    Und das
    Code: PHP  [Auswählen]
    if(SECURITY_CODE_LENGTH=='')
      define('SECURITY_CODE_LENGTH', '10');

    muss so lauten,
    Code: PHP  [Auswählen]
    if(!defined('SECURITY_CODE_LENGTH'))
      define('SECURITY_CODE_LENGTH', '10');

    ..und wenn noch geprüft werden soll ob der Inhalt >0 ist, müsste man das noch in der schleife prüfen (und ggf. den Wert dort berichtigten), weil eben eine Konstante nicht überschrieben werden kann.

    Und nochmal...
    folgendes,
    Code: PHP  [Auswählen]
     
    if (defined(SECURITY_CODE_LENGTH)){echo ' SECURITY_CODE_LENGTH1: '.SECURITY_CODE_LENGTH;}
    bedeutet das selbe wie folgendes (wenn der Wert z.B. in der DB mit "10" steht),
    Code: PHP  [Auswählen]
     
    if (defined('10')){echo ' SECURITY_CODE_LENGTH1: '.SECURITY_CODE_LENGTH;}

    eine Konstante mit der Bezeichnung "10" (bzw. was auch immer der wert ist) gibt es nicht.

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: BUG? - application_top.php
    Antwort #8 am: 02. März 2015, 15:58:54
    Hallo webald

    Vieleicht hilft folgendes:

    Syntax richtig
    Code: PHP  [Auswählen]
    $key = 'GREETING';
    $value = 'Hallo Leute';

    define($key, $value);
    define('GREETING', 'Hallo Leute');
     

    Syntax falsch
    Code: PHP  [Auswählen]
    $key = 'GREETING';
    $value = 'Hallo Leute';

    define('$key', '$value');
    define("$key", "$value");
    define(GREETING, 'Hallo Leute');
     

    Der folgende Code, da hast Du recht, ist Quatsch
    Code: PHP  [Auswählen]
    if(SECURITY_CODE_LENGTH=='')
      define('SECURITY_CODE_LENGTH', '10');
     

    Gruss
    Hanspeter

    web0null

    • Experte
    • Beiträge: 1.998
    Re: BUG? - application_top.php
    Antwort #9 am: 02. März 2015, 16:08:00
    Das wäre nicht falsch.
    Code: PHP  [Auswählen]
    $key   = 'GREETING';
    $value = 'Hallo Leute';
    define("$key", "$value");
     

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: BUG? - application_top.php
    Antwort #10 am: 02. März 2015, 16:15:18
    Das stimmt  natürlich! :paperbag:

    Gruss
    Hanspeter

    webald

    • modified Team
    • Beiträge: 2.791
    Re: BUG? - application_top.php
    Antwort #11 am: 02. März 2015, 16:16:29
    Ich geb mich ja geschlagen...

    Ich bin da nur hängen geblieben, weil ich die gesamte Konfigurtion aus der Tabelle configuration in eine Datei speicher, da man diese auch im Fehlerfall lesen kann. Die Datenbank mi der Konfiguration drin aber nicht unbedingt, womit auch Einstellung wie SMTP, Admin-Mailadresse o. ä. nicht zugänglich sind. Stattdessen produziert der Shop nur  eine Meldung "Es ist ein Fehler augetreten". Der Kunde kann keine Mail an den Admin senden (hat je keine Daten) und auch eine Auto-Mail geht nicht, da diese Daten ja fehlen.

    web28

    • modified Team
    • Beiträge: 9.404
    Re: BUG? - application_top.php
    Antwort #12 am: 04. März 2015, 10:12:41
    So steht es bereits in der zukünftigen Version:

    Code: PHP  [Auswählen]
        if(!defined('SECURITY_CODE_LENGTH'))
          define('SECURITY_CODE_LENGTH', '10');

    Gruss Web28

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 14.000
    • Geschlecht:
    Re: BUG? - application_top.php
    Antwort #13 am: 04. März 2015, 22:17:42
    Hier ist aber jetzt einiges durcheinander.
    Die Frage ist auf was man hier testen möchte.

    Code: PHP  [Auswählen]
    define('FOO', '');

    if (defined('FOO')) {
        echo 'FOO is defined<br />'; // gibt aus: FOO is defined
        if (FOO) {
            echo 'FOO is not empty<br />';
        }
        else {
            echo 'FOO is empty<br />'; // gibt aus: FOO is empty
        }
        if(FOO == '') {
            echo 'FOO is empty<br />'; // gibt aus: FOO is empty
        }
    }
    else {
        echo 'FOO is not defined<br />';
    }

    Will man also abbfragen ob FOO ein leerer String ist ist das ursprüngliche
    Code: PHP  [Auswählen]
    if(SECURITY_CODE_LENGTH == '') { ...
    korrekt,
    oder eben einfach
    Code: PHP  [Auswählen]
    if (!FOO) { ...
    weil, wenn die Konstante mit einem leeren String definiert ist Boolean 'false' return-t wird.

    Die Abfrage die du, web28, hier schreibst gibt 'true' aus, weil auch bei einem leeren String die Konstante definiert ist.

    Gruß,
    noRiddle

    web0null

    • Experte
    • Beiträge: 1.998
    Re: BUG? - application_top.php
    Antwort #14 am: 05. März 2015, 02:15:43
    Zitat
    Will man also abbfragen ob FOO ein leerer String ist ist das ursprüngliche
    Code: PHP  [Auswählen]
    if(SECURITY_CODE_LENGTH == '') { ...
    korrekt,

    Nee, das ursprüngliche schaut im ganzen so aus:
    Code: PHP  [Auswählen]
    if(SECURITY_CODE_LENGTH=='')
      define('SECURITY_CODE_LENGTH', '10');

    Man wollte hier prüfen ob es die Konstante gibt, sonst wäre kein define() bei Nichterfüllung.

    Denn in dem Falle dass die Konstante definiert wäre, und man "nur" prüfen wollte ob sie "leer" ist, würde man so nichts erreichen, da man eine Konstante nicht überschreiben kann.

    Wie ich oben schon schrieb, wenn man prüfen will ob ein Wert eingetragen ist, müsste man das machen bevor man die Konstante definiert.

    Gruß
    Marktplatz - Eine große Auswahl an neuen und hilfreichen Modulen sowie modernen Templates für die modified eCommerce Shopsoftware
    1 Antworten
    2239 Aufrufe
    02. Juni 2011, 12:14:05 von Tomcraft
    9 Antworten
    4129 Aufrufe
    02. März 2018, 10:26:29 von Timm
    2 Antworten
    2703 Aufrufe
    04. April 2016, 14:34:20 von webald
    0 Antworten
    1492 Aufrufe
    13. Januar 2014, 08:23:29 von webald
               
    anything