CONTENIDO unter PHP8 und MariaDB10

Fragen zur Installation von CONTENIDO 4.10? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
bodil
Beiträge: 364
Registriert: Fr 7. Okt 2011, 04:10
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von bodil »

Puh!
Noch eine Einschränkung meinerseits.
Es ging im Forum bereits mehrfach um Tests des aktuellsten Branchs von Github.
In diesem Thread hier geht es aber um den Einsatz der 4.10.1 unter PHP 8.
Das habe ich verwechselt.
Ich habe mir vor einiger Zeit die Version des neusten Branchs geholt und die getestet und war insgesamt sehr zufrieden. Ich empfehle, diese zu verwenden. Die Version 4.10.1 unter PHP 8 zum Laufen zu bringen, würde ich mir nicht zutrauen.
Auch dann gibt es Fehler, deren Zahl sollte aber übersichtlich sein.
Achtung: die Version, die man sich da runterladen kann, ist für den Einsatz im Web noch nicht freigegeben. Sie könnte noch Sicherheitslücken haben. Ich benutze sie (bisher) auch nur zur Entwicklung, bin dann aber am Start, wenn es eine offizielle Version gibt. Und ich denke, hier die Bugs zu diskutieren, die noch auftreten, kann helfen, zu einer offiziellen und lauffähigen Version zu kommen.
Grundsätzlich halte ich die Version im Branch für seriöser, als eine selbstumgebastelte 4.10er Version.
Hier noch der Link, die Version, mit der ich arbeite ist aber älter und enthält vermutlich auch noch mehr Fehler als diese hier:
https://github.com/CONTENIDO/CONTENIDO/ ... e-datetime
(Und für diese Version an dieser Stelle ein fettes Dankeschön an alle Beteiligten!)
Bodil
Bernhard_4711
Beiträge: 144
Registriert: Do 25. Jul 2019, 16:08
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von Bernhard_4711 »

Vielen Dank. Die Version von github habe ich mir gerade heruntergeladen und werde sie mir hinsichtlich Verwendbarkeit unter PHP8 anschauen.
Denn, um PHP8 kommen wir nicht herum! :|
---
Munterbleiben... Bernhard
Bernhard_4711
Beiträge: 144
Registriert: Do 25. Jul 2019, 16:08
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von Bernhard_4711 »

Ich habe nun meine Webseite auf den neuen Server (den mit PHP8) umgezogen und die im LOG mit

Code: Alles auswählen

PHP Fatal Error
gekennzeichneten Codestellen wie in meinen vorhergehenden Posts abgeändert.
Läuft soweit! :D
Ich bekomme nur noch

Code: Alles auswählen

PHP Deprecated
und

Code: Alles auswählen

PHP Warning
Meldungen.

Ich lasse das jetzt zunächst mal eine Weile laufen, sehe zwischendurch nach dem LOG und beobachte das.
Sollte es zu einem erneuten Crash kommen, davon geht die Welt nicht unter.
---
Munterbleiben... Bernhard
Bernhard_4711
Beiträge: 144
Registriert: Do 25. Jul 2019, 16:08
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von Bernhard_4711 »

Ich versuche ja immer, die Dinge zu verstehen; aber hierbei komme ich nicht weiter:

Code: Alles auswählen

[php:warn] [pid 21147] [client 195.123.227.7:35568] PHP Warning:  Undefined array key "lang" in /var/www/btmr/contenido/classes/class.requestvalidator.php on line 220
Ich kann "lang" nicht finden. Wo ist das "versteckt"?
---
Munterbleiben... Bernhard
Faar
Beiträge: 1945
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 3 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von Faar »

Bernhard_4711 hat geschrieben: Di 23. Aug 2022, 09:20 Ich kann "lang" nicht finden. Wo ist das "versteckt"?
Es ist nur eine Warnung und "lang" kann man nicht finden, weil diese Warnung genau darauf hinweist, dass "lang" nicht da ist.
In meiner Version (Entwicklerversion) ist an dieser Stelle die Funktion checkParams(), wo in Zeile 220 eine Message ist.
Wie sieht der Code in Deiner Version aus?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Bernhard_4711
Beiträge: 144
Registriert: Do 25. Jul 2019, 16:08
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von Bernhard_4711 »

Ich weiß, daß das nur eine Warnung ist. Ich hätte nur gerne gewußt, wo sich "lang" "versteckt"...
Der Code in meiner Version:

Code: Alles auswählen

    public function checkParams() {

        if ((!$this->checkGetParams()) || (!$this->checkPostParams() || (!$this->checkCookieParams()))) {
            $this->logHackTrial();

            if ($this->_mode == 'stop') {
                ob_end_clean();
                $msg = 'Parameter check failed! (%s = %s %s %s)';
                // prevent XSS!
                $msg = sprintf($msg, htmlentities($this->_failure), htmlentities($_GET[$this->_failure]), htmlentities($_POST[$this->_failure]), htmlentities($_COOKIE[$this->_failure]));
                die($msg);
            }
        }

        return true;
    }
Zeile 220 ist diese hier:

Code: Alles auswählen

$msg = sprintf...
---
Munterbleiben... Bernhard
bodil
Beiträge: 364
Registriert: Fr 7. Okt 2011, 04:10
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von bodil »

In diesem Fall muss die Variable $this->_failure den Wert 'lang' haben.
Und dann ist für bspw. $_GET['lang'] kein Wert gesetzt.
Bernhard_4711
Beiträge: 144
Registriert: Do 25. Jul 2019, 16:08
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von Bernhard_4711 »

Das verstehe ich leider nicht. Sorry. :?
---
Munterbleiben... Bernhard
homtata
Beiträge: 1145
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von homtata »

Also mal ein Beispiel, wie solche Fehler entstehen, prinzipiell, jetzt nicht genau auf dieses Skript bezogen.
Du schreibst in einem Modul z.B. sowas wie

Code: Alles auswählen

<?php echo $_GET["lang"]; ?>
ABER
"lang" ist als GET-Parameter aktuell überhaupt nicht gesetzt. Dann ist der key "lang" des GET ein "undefined key", denn er ist nicht gesetzt.
Die Zeile 220 spuckt in dieser weiß der Himmel wo aufgerufenen Funktion also beim Durchchecken von Parametern, die irgendwo anders abgefragt werden, durch, dass der angefragte Parameter "lang" da ist. Ist er aber nicht, also: PHP Warning.
bodil
Beiträge: 364
Registriert: Fr 7. Okt 2011, 04:10
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von bodil »

Ja, etwas unübersichtlich wird das dadurch, dass wir hier ein Array ($_GET) haben. Dass es ein Array ist, erkennt man daran, dass dahinter ein Wert in eckigen Klammern steht.
Ein Array ist letztlich auch nur eine Variable, das heißt, es ist möglich darin Informationen zu speichern. 'Normale' Variablen funktionieren wie eine Kiste: Vorne steht der Name drauf und du kannst dann in die Kiste reinpacken, was du willst.
Das Array ist in diesem Bild eher ein Schubladenschrank. Der Schrank hat einen Namen ($_GET), aber auf den Schubladen steht auch immer noch was. Z. B. 'lang'.
In unserem speziellen Fall fehlt aber die Schublade 'lang' und das fällt im Programmablauf auf, wird bemängelt und führt zu einer Warnung. Leere Schubladen können aber auch zu Warnungen führen ...
Bernhard_4711
Beiträge: 144
Registriert: Do 25. Jul 2019, 16:08
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von Bernhard_4711 »

Und wie wäre die Lösung? Sorry, aber ich weiß es wirklich nicht!

Noch etwas: die vielen

Code: Alles auswählen

PHP Deprecated
spammen das LOG ganz schön voll, so daß es immer eine Warnung im Backend gibt...
---
Munterbleiben... Bernhard
bodil
Beiträge: 364
Registriert: Fr 7. Okt 2011, 04:10
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von bodil »

Naja. Um zu verhindern das die Warnung mit dem 'lang' auftritt, müsste man, ehe man auf das Feld zugreift, checken, ob es überhaupt gesetzt ist und sich bei der Gelegenheit entscheiden, was man tut, wenn es nicht gesetzt ist. Quasi: gibt es die Schublade 'lang'? Falls ja, nimm den Wert der drinnesteht, anderenfalls nehmen wir den Wert xy. Oder wir lassen die Zeile ganz aus. In unserem Fall würden wir alternativ einen leeren String ('') nehmen.
Das sähe dann so aus:

Code: Alles auswählen

        $msg = sprintf(
                $msg,
                htmlentities($this->_failure),
                htmlentities(isset($_GET[$this->_failure]) ? $_GET[$this->_failure] : ''),
                htmlentities(isset($_POST[$this->_failure]) ? $_POST[$this->_failure] : ''),
                htmlentities(isset($_COOKIE[$this->_failure]) ? $_COOKIE[$this->_failure] : '')
         );
Die Sytax sagt dann jeweils: Ist der Wert gesetzt ('?') Dann nimm eben diesen Wert ':' andernfalls schreib einen leeren String ('').

Die Deprecated-Meldungen weisen auf Code hin, der zwar problemlos funktioniert, der aber in zukünftigen Versionen nicht mehr funktionieren wird.
Du kannst Contenido dazu bringen, diese Meldungen nicht mehr anzuzeigen.
In meiner Version finde ich die Zeile dazu in der Datei config.misc.php im Verzeichnis /data/config/production/ in Zeile . Da steht bei mir:

Code: Alles auswählen

$cfg['php_error_reporting'] = E_ALL & ~(E_STRICT | E_NOTICE);
Um jetzt die Deprecated-Meldungen zu ignorieren müsstest du die Zeile so ergänzen:

Code: Alles auswählen

$cfg['php_error_reporting'] = E_ALL & ~(E_STRICT | E_NOTICE | E_DEPRECATED);
Viel Erfolg!
Bodil
Zuletzt geändert von bodil am Mo 29. Aug 2022, 07:04, insgesamt 1-mal geändert.
Bernhard_4711
Beiträge: 144
Registriert: Do 25. Jul 2019, 16:08
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von Bernhard_4711 »

bodil hat geschrieben: Sa 27. Aug 2022, 12:31 Viel Erfolg!
Vielen Dank. :D
---
Munterbleiben... Bernhard
Bernhard_4711
Beiträge: 144
Registriert: Do 25. Jul 2019, 16:08
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von Bernhard_4711 »

Diese Meldung taucht in der Datei data/logs/security.txt recht oft auf. Was könnte das bedeuten; bzw.: wie könnte man das abstellen? Ist das ebenfalls das "lang"-Ding, dessen Lösung ich nicht sehe oder verstehe?

Code: Alles auswählen

2022-09-05 12:17:58    152.89.196.23    
    Query String: lang=/../../../..//////////dev/cmdb/sslvpn_websession
    Bad parameter: lang
    POST array: Array
(
)

    GET array: Array
(
    [lang] => /../../../..//////////dev/cmdb/sslvpn_websession
)

    COOKIE array: Array
(
)
---
Munterbleiben... Bernhard
bodil
Beiträge: 364
Registriert: Fr 7. Okt 2011, 04:10
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: CONTENIDO unter PHP8 und MariaDB10

Beitrag von bodil »

Dazu zwei Fragen:
1. Passiert das in einem produktiven System?
2. Kommt dir irgendwas von der Zeichenkette /../../../..//////////dev/cmdb/sslvpn_websession vertraut vor?

Vieles im Contenido-CMS funktioniert mit sog. Get-Parametern, das sind Informationen, die in der URL stehen. Bevor Contenido diese Informationen verarbeitet, überprüft es die Werte der fürs System relevanten Parameter auf Sinnhaftigkeit. Bei lang würde ich vermuten, dass es sich dabei um eine Ganzzahl (1, 2, 3...) handeln muss. Das wäre die ID der Sprache, die gerade bearbeitet oder angezeigt wird. Passen das erwartete und das tatsächliche Format nicht zusammen, ignoriert Contenido den Wert und notiert die Abweichung in der security.txt.
Das bedeutet in deinem Fall, dass es irgndwo einen Link geben könnte, in dem ...&lang=/../../../..//////////dev/cmdb/sslvpn_websession&... steht.
Für die Fehlersuche könnte es helfen, den ausgelieferten Quellcode nach "dev/cmdb/sslvpn_websession" oder "lang" zu durchsuchen.
Denkbar wäre aber auch ein Fehler in der Konfiguration, der im Quelcode gar nicht sichtbar ist. Da wäre dann wieder die Frage relevant, wo besagte Zeichenkette (s. o.) herkommt.
Antworten