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: MODUL: Adminer Datenbank-Verwaltung im Backend

    hpzeller

    • Experte
    • Beiträge: 4.130
    • Geschlecht:
    MODUL: Adminer Datenbank-Verwaltung im Backend
    am: 29. Dezember 2020, 02:09:52
    Hallo Community

    Ich habe hier mal was zusammengestellt, damit integriert man das Datenbank Verwaltungsprogramm Adminer in den modified Shop. Kurz getestet habe ich es mit der modified Shopversion 2.0.5.0 und 2.0.5.1 auf PHP-7.4.13. Wer es selbst auch testen möchte, einfach die angehängte ZIP-Datei herunterladen. Eine SQL-Konsole ist natürlich im Adminer auch enthalten.

    [ Für Gäste sind keine Dateianhänge sichtbar ] [ Für Gäste sind keine Dateianhänge sichtbar ]

    Mehr Infos zum Adminer gibt es hier -> https://www.adminer.org/de/

    Gruss
    Hanspeter

    [EDIT Tomcraft 08.06.2022: Modul & Screenshots aktualisiert.]

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

    awids

    • Experte
    • Beiträge: 3.789
    • Geschlecht:
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #1 am: 29. Dezember 2020, 02:37:58
    Wunderbar. Eine gelungene Umsetzung - und optisch viel schöner als die Demo auf der verlinkten Seite. :-D

    Herzlichen Dank, Hanspeter!
     :king:

    Da du kein Screenshot mitgeliefert hast, bin ich mal so frei und hänge eines an:

    [ Für Gäste sind keine Dateianhänge sichtbar ]

    hpzeller

    • Experte
    • Beiträge: 4.130
    • Geschlecht:
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #2 am: 29. Dezember 2020, 11:11:42
    Wunderbar. Eine gelungene Umsetzung - und optisch viel schöner als die Demo auf der verlinkten Seite. :-D
    [...]

    Freut mich wenn das Design gefällt, aber es ist nicht auf meinem Mist gewachsen, sondern es handelt sich dabei um dieses Adminer-Plugin -> https://github.com/pematon/adminer-theme

    Das Theme ist übrigens responsive und touch-friendly, die Shopadministration aber leider nicht.

    Gruss
    Hanspeter

    Q

    • Fördermitglied
    • Beiträge: 1.499
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #3 am: 29. Dezember 2020, 15:55:21
    :thx:
    Ist besonders für die "Laborversion" praktisch. :D

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.739
    • Geschlecht:
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #4 am: 31. Dezember 2020, 15:30:15
    @hpzeller
    Nice, Merci beaucoup.

    Was ist denn das für komprimierter Code in der /admin/a/adminer.php ?
    Sowas mag ich ja gar nicht wenn man Code nicht lesen kann und somit nicht weiß ob man sich da Schadecode einfängt, insbesondere im Javascript-Teil.
    Gut, ich kann ihn  dekomprimieren und mir anzeigen lassen, aber der Aufwand. Da hätte man auch gleich ein  *.phar daraus machen können.
    Überhaupt ist in der genannten Datei der Code ja herzzereißend formatiert.
    Kann man 100%ig davon ausgehen, daß der Code sicher ist oder hast du da einfach nur drauf vertraut ?

    Gruß,
    noRiddle

    webald

    • modified Team
    • Beiträge: 2.795
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #5 am: 02. Januar 2021, 14:56:40
    Setzt PHP 7.x voraus. Die Funktion random_bytes() gibt es in in 5.x nicht.

    Folgenden Code in eine Datei in admin/includes/extra/functions speichern:

    Code: PHP  [Auswählen]
    // random_bytes() does not exist in PHP 5.6 or earlier
    if (version_compare(PHP_VERSION, '5.6.40', '<=')) {
      function random_bytes($length){
            for ($i = 1; $i <= $length; $i++) {
        $bytes = openssl_random_pseudo_bytes($i, $cstrong);
        return $bytes;
            }
      }
    }

    Warum wird die Config der Verzeichnisse nicht in der DB gespeichert, sondern in einer Config-Datei?

    Bei der Installation sollte die Aktivierung eines Moduls am Ende stehen, sonst wird ein Modul aktiviert, das nicht sauber installiert wurde (wie hier wegen fehlender Funktion random_bytes.)

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.739
    • Geschlecht:
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #6 am: 02. Januar 2021, 18:03:52
    Warum der for-loop und nicht einfach so ?

    Code: PHP  [Auswählen]
    if(version_compare(PHP_VERSION, '5.6.40', '<=')) {
      function random_bytes($length) {
        $bytes = openssl_random_pseudo_bytes($length);

        return $bytes;
      }
    }

    Deine Frage zur Config könnte man dann auch für die modified-eigene configure.php stellen (außer DB-Verbindung).

    Gruß,
    noRiddle

    hpzeller

    • Experte
    • Beiträge: 4.130
    • Geschlecht:
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #7 am: 02. Januar 2021, 19:56:54
    Setzt PHP 7.x voraus. Die Funktion random_bytes() gibt es in in 5.x nicht.
    [...]

    Sorry, daran habe ich gar nicht gedacht, dass es noch Shops gibt die auf PHP5 laufen. Um auch diese, wie ich hoffe, sehr seltenen Fälle nicht hängen zu lassen würde ich dann, als Kondensat aus deinem und noRiddle's Vorschlag,  die Datei adminer_dba_tool.php in admin/includes/extra/functions/ mit folgendem Code einfügen.

    Code: PHP  [Auswählen]
    <?php

    if (!function_exists('random_bytes')) {
      function random_bytes($length) {
        return openssl_random_pseudo_bytes($length);
      }
    }

    [...]
    Warum wird die Config der Verezichnisse nicht in der DB gespeichert, sondern in einer config-Datei?
    [...]

    Die Verzeichniskonstanten stehen ja üblicherweise bei modified in Dateien und nicht in der Datenbank, und ausserdem braucht das Mudul in den Dateien admin_xxxxxxxxxx/axxxxxxxxx/axxxxxxxx.php und admin_xxxxxxxxxx/axxxxxxxxx/plugins/AdminerForModified.php die folgenden Konstanten ADMINER_DBA_TOOL_TOKEN und ADMINER_DBA_TOOL_LOG_SQL, aber dort habe ich keine Verbindung zur Shopdatenbank.

    Gruss
    Hanspeter

    Q

    • Fördermitglied
    • Beiträge: 1.499
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #8 am: 02. Januar 2021, 22:42:19
    Vermutlich hab ich wieder  :tomato: oder zu tief  :cheers1:

    Gibt es keinen horizontalen Scrollbalken? Mit den Pfeiltasten kann ich nach rechts scrollen. :-?

    hpzeller

    • Experte
    • Beiträge: 4.130
    • Geschlecht:
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #9 am: 03. Januar 2021, 09:15:41
    Nachtrag zu meiner Antwort #7:

    Ich habe festgestellt, dass  die PHP-Funktion "openssl_random_pseudo_bytes()" nur existiert wenn die PHP-Erweiterung "OpenSSL" installiert ist, und davon kann man nicht selbstredend ausgehen, deshalb habe ich jetzt die gleiche Funktion in die Datei "admin/includes/modules/system/adminer_dba_tool.php" eingebaut welche auch das Shopsystem verwendet um den Ordner admin umzubenennen.

    Wer die Änderung gleich umsetzen möchte der kann den kompletten Inhalt der Datei admin/includes/modules/system/adminer_dba_tool.php mit folgendem Code ersetzen, dann das Modul deinstallieren und wieder installieren.

    Code: PHP  [Auswählen]
    <?php
    /**
     * --------------------------------------------------------------
     * File: adminer_dba_tool.php
     * Version: 0.1
     * Date: 16.12.2020
     *
     * Author: Hanspeter Zeller
     * Copyright: (c) 2020 - Hanspeter Zeller
     * Web: https://(( Wir dulden keine kommerziellen Werbelinks - Bitte <a href="index.php?topic=3013.0">Forenregeln</a> beachten! ))
     * Contact: info@(( Wir dulden keine kommerziellen Werbelinks - Bitte <a href="index.php?topic=3013.0">Forenregeln</a> beachten! ))
     * --------------------------------------------------------------
     * Released under the GNU General Public License
     * --------------------------------------------------------------
     */


    defined( '_VALID_XTC' ) or die( 'Direct Access to this location is not allowed.' );
     
    class adminer_dba_tool {
        var $code, $title, $description, $enabled, $sort_order;

        function __construct() {
            $this->code = 'adminer_dba_tool';
            $this->title = MODULE_ADMINER_DBA_TOOL_TEXT_TITLE;
            $this->description = MODULE_ADMINER_DBA_TOOL_TEXT_DESCRIPTION;
            $this->sort_order = 0;
            $this->enabled = ((MODULE_ADMINER_DBA_TOOL_STATUS == 'true') ? true : false);
        }

        function process() {
            //do nothing
        }

        function display() {
            return array('text' => '<br /><div align="center">' . xtc_button(BUTTON_SAVE) .
              xtc_button_link(BUTTON_CANCEL, xtc_href_link(FILENAME_MODULE_EXPORT, 'set=' . $_GET['set'] . '&module=' . $this->code)) . "</div>");
        }

        function check() {
            if (!isset($this->_check)) {
                $check_query = xtc_db_query("SELECT configuration_value
                                               FROM "
    . TABLE_CONFIGURATION . "
                                              WHERE configuration_key = 'MODULE_ADMINER_DBA_TOOL_STATUS'"
    );
                $this->_check = xtc_db_num_rows($check_query);
            }
            return $this->_check;
        }

        function install() {
            xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value,  configuration_group_id, sort_order, set_function, date_added)
                                            VALUES ('MODULE_ADMINER_DBA_TOOL_STATUS', 'true',  '6', '1', 'xtc_cfg_select_option(array(\'true\', \'false\'), ', now())"
    );
            xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value,  configuration_group_id, sort_order, set_function, date_added)
                                            VALUES ('MODULE_ADMINER_DBA_TOOL_FILL_LOGIN', 'true',  '6', '2', 'xtc_cfg_select_option(array(\'true\', \'false\'), ', now())"
    );
            xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value,  configuration_group_id, sort_order, set_function, date_added)
                                            VALUES ('MODULE_ADMINER_DBA_TOOL_LOG_SQL', 'true',  '6', '3', 'xtc_cfg_select_option(array(\'true\', \'false\'), ', now())"
    );                      

            xtc_db_query("ALTER TABLE `" . TABLE_ADMIN_ACCESS . "` ADD `" . $this->code . "` INT(1) NOT NULL DEFAULT '0'");
            xtc_db_query("UPDATE `" . TABLE_ADMIN_ACCESS . "` SET `" . $this->code . "` = '1' WHERE customers_id = '1'");
           
            require_once(DIR_FS_INC . 'xtc_random_charcode.inc.php');
           
            $random_charcode_1 = xtc_random_charcode(10);
            $random_charcode_2 = xtc_random_charcode(10);
           
            rename(DIR_FS_CATALOG . DIR_ADMIN . (defined('DIR_ADMINER') ? DIR_ADMINER : 'a') . '/' . (defined('ADMINER_INDEX_FILE') ? ADMINER_INDEX_FILE : 'a.php'), DIR_FS_CATALOG . DIR_ADMIN . (defined('DIR_ADMINER') ? DIR_ADMINER : 'a') . '/a' . $random_charcode_2 . '.php');        
            rename(DIR_FS_CATALOG . DIR_ADMIN . (defined('DIR_ADMINER') ? DIR_ADMINER : 'a'), DIR_FS_CATALOG . DIR_ADMIN . 'a' . $random_charcode_1);
                                               
            $file_contents = '<?php' . "\n" .                    
                             '' . "\n" .
                             'define(\'ADMINER_DBA_TOOL_TOKEN\', \'' . xtc_random_charcode(10) . '\');' . "\n" .
                             'define(\'ADMINER_DBA_TOOL_LOG_SQL\', \'true\');' . "\n" .
                             'define(\'DIR_ADMINER\', \'a' . $random_charcode_1 . '\');' . "\n" .
                             'define(\'ADMINER_INDEX_FILE\', \'a' . $random_charcode_2 . '.php\');';                            
                           
            $fp = fopen(DIR_FS_CATALOG . 'includes/extra/configure/adminer_dba_tool.php', 'w');
            fputs($fp, $file_contents);
            fclose($fp);    
            @chmod(DIR_FS_CATALOG . 'includes/extra/configure/adminer_dba_tool.php', 0644);            
        }

        function remove() {
            xtc_db_query("DELETE FROM " . TABLE_CONFIGURATION . " WHERE configuration_key LIKE 'MODULE_ADMINER_DBA_TOOL_%'");
         
            $query_result = xtc_db_query("SHOW COLUMNS FROM `" . TABLE_ADMIN_ACCESS . "`");
            $db_table_rows = [];
            while ($row = xtc_db_fetch_array($query_result)) {
              $db_table_rows[] = $row['Field'];
            }
           
            if (in_array($this->code, $db_table_rows)) {
              xtc_db_query("ALTER TABLE `" . TABLE_ADMIN_ACCESS . "` DROP `" . $this->code . "`;");
            }      
                   
            if (defined('DIR_ADMINER')) {
              $file_contents = '<?php' . "\n" .                    
                               '' . "\n" .
                               'define(\'ADMINER_DBA_TOOL_TOKEN\', \'false\');' . "\n" .
                               'define(\'ADMINER_DBA_TOOL_LOG_SQL\', \'' . ADMINER_DBA_TOOL_LOG_SQL . '\');' . "\n" .
                               'define(\'DIR_ADMINER\', \'' . DIR_ADMINER . '\');' . "\n" .
                               'define(\'ADMINER_INDEX_FILE\', \'' . ADMINER_INDEX_FILE . '\');';  
                               
              $fp = fopen(DIR_FS_CATALOG . 'includes/extra/configure/adminer_dba_tool.php', 'w');
              fputs($fp, $file_contents);
              fclose($fp);    
              @chmod(DIR_FS_CATALOG . 'includes/extra/configure/adminer_dba_tool.php', 0644);                            
           }                                              
        }

        function keys() {
            return ['MODULE_ADMINER_DBA_TOOL_STATUS','MODULE_ADMINER_DBA_TOOL_FILL_LOGIN','MODULE_ADMINER_DBA_TOOL_LOG_SQL'];
        }
    }

    PS: Zu einem späteren Zeitpunkt werde ich dann ein aktualisiertes Komplettpaket hier posten.

    Gruss
    Hanspeter

    webald

    • modified Team
    • Beiträge: 2.795
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #10 am: 03. Januar 2021, 11:02:37
    @noRiddle:
    mit dem Code hast Du natürlich Recht. Wurde weiter unten von hpzeller aber eh schon anders gelöst.

    Was die Konstanten betrifft, ist der Vorschlag von noRiddle nahezu alles in die DB zu verlagern überlegenswert. Es würde Möglichkeiten eröffnen einen Shop unter mehreren Domains mit unterschiedlichem Layout/Kategorien/Artikel/.... zu betreiben.

    @hpzeller
    mich stören 2 Dinge. Zum einen finde ich sollten keine Dateien on-the-fly in Verzeichnissen für Programmerweiterungen erstellt werden. Zum anderen funktioniert das Setzen von Berechtigungen mit chmod nicht auf jedem System.

    p3e

    • Experte
    • Beiträge: 2.395
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #11 am: 03. Januar 2021, 15:34:12
    [...]
    Was die Konstanten betrifft, ist der Vorschlag von noRiddle nahezu alles in die DB zu verlagern überlegenswert. Es würde Möglichkeiten eröffnen einen Shop unter mehreren Domains mit unterschiedlichem Layout/Kategorien/Artikel/.... zu betreiben.
    [...]

    Das Thema hatten wir schon mal vor ein paar Jahren. Das ist dann leider unter gegangen. Gerade das Erweitern von modified auf einen Multishop würde das deutlich erleichtern. :pro: :thx:

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.739
    • Geschlecht:
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #12 am: 03. Januar 2021, 22:21:55
    [...]
    Ich habe festgestellt, dass  die PHP-Funktion "openssl_random_pseudo_bytes()" nur existiert wenn die PHP-Erweiterung "OpenSSL" installiert ist, und davon kann man nicht selbstredend ausgehen, deshalb habe ich jetzt die gleiche Funktion in die Datei "admin/includes/modules/system/adminer_dba_tool.php" eingebaut welche auch das Shopsystem verwendet um den Ordner admin umzubenennen.
    [...]

    ...was mich dazu bringt dem Team vorzuschlagen die Funktion crypto_rand_secure(), auf die am Ende xtc_random_charcode() ja aufbaut, so anzupassen, daß in der erstgenannten random_bytes() benutzt wird wenn vorhanden, wenn nicht openssl_random_pseudo_bytes() und letztendlich der Rückfall auf mt_rand(), wie auch jetzt bereits, wenn OpenSSL nicht zur Verfügung steht, ähnlich wie es im PHPMailer bereits umgesetzt ist.

    Übrigens wird openssl_random_pseudo_bytes() ohne Fallback in der aktuellen Shop-Version zum generieren der Session-ID benutzt. Da sollte man dann wohl um der Konsistenz und auch der Sicherheit willen nach dem o.g. Anpassen auch xtc_rand() benutzen.

    Gruß,
    noRiddle

    webald

    • modified Team
    • Beiträge: 2.795
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #13 am: 04. Januar 2021, 09:52:30
    Ich habe da mal 2 Tickets draus gemacht

    hpzeller

    • Experte
    • Beiträge: 4.130
    • Geschlecht:
    Re: MODUL: Adminer Datenbank-Verwaltung im Backend
    Antwort #14 am: 04. Januar 2021, 10:54:21
    [...]
    Ich habe festgestellt, dass  die PHP-Funktion "openssl_random_pseudo_bytes()" nur existiert wenn die PHP-Erweiterung "OpenSSL" installiert ist, und davon kann man nicht selbstredend ausgehen, deshalb habe ich jetzt die gleiche Funktion in die Datei "admin/includes/modules/system/adminer_dba_tool.php" eingebaut welche auch das Shopsystem verwendet um den Ordner admin umzubenennen.
    [...]

    ...was mich dazu bringt dem Team vorzuschlagen die Funktion crypto_rand_secure(), auf die am Ende xtc_random_charcode() ja aufbaut, so anzupassen, daß in der erstgenannten random_bytes() benutzt wird wenn vorhanden, wenn nicht openssl_random_pseudo_bytes() und letztendlich der Rückfall auf mt_rand(), wie auch jetzt bereits, wenn OpenSSL nicht zur Verfügung steht, ähnlich wie es im PHPMailer bereits umgesetzt ist.

    Übrigens wird openssl_random_pseudo_bytes() ohne Fallback in der aktuellen Shop-Version zum generieren der Session-ID benutzt. Da sollte man dann wohl um der Konsistenz und auch der Sicherheit willen nach dem o.g. Anpassen auch xtc_rand() benutzen.
    [...]

    Da fragt sich jetzt natürlich,  da ja schon seit Ende 2018 PHP5 den Status "End of life" hat, ob man beim nächsten Shopupdate nicht die Mindestanforderung für PHP, auf sagen wir mal Version 7.1 setzen sollte, zumal wir seit Ende November 2020 bereits bei PHP8 angelangt sind, und man annehmen darf, siehe -> hier, dass mit dem nächsten Shopudate auch PHP8 unterstützt wird. Im hier geposteten konkreten Fall würde das bedeuten, dass man für die empfohlene Funktion "random_bytes() " , da sie in PHP7 immer vorhanden ist, keine Alternative braucht.

    https://www.php.net/supported-versions.php

    PS:
    Das endlose Pflegen veralteter PHP-Versionen bindet meiner Meinung nach Entwickler-Ressourcen die man für wichtigeres und besseres einsetzen könnte.

    Gruss
    Hanspeter