Fatal error - Ausgabe anders positionieren und auffälliger gestalten - Möglich?

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
Post Reply
lck
Posts: 2963
Joined: Wed Mar 23, 2011 11:43 am
Contact:

Fatal error - Ausgabe anders positionieren und auffälliger gestalten - Möglich?

Post by lck » Sat Sep 09, 2017 6:02 pm

Bei einem "Fatal error" erscheint die Meldung ja normalerweise an der Stelle, wo die Ursache des Problems aufgetreten ist.

Beispiel Plugin-Fehler, Ausgabe am Ende der Seite. Im Quelltext sieht die Meldung so aus:

Code: Select all

<br />
<b>Fatal error</b>:  Uncaught Error: Call to undefined function jm_landingpage() in D:\xampp\htdocs\cmsimplexh170\templates\fhs-simple\template.htm:164
Stack trace:
#0 D:\xampp\htdocs\cmsimplexh170\cmsimple\cms.php(1343): include()
#1 D:\xampp\htdocs\cmsimplexh170\index.php(6): include('D:\\xampp\\htdocs...')
#2 {main}
  thrown in <b>D:\xampp\htdocs\cmsimplexh170\templates\fhs-simple\template.htm</b> on line <b>164</b><br /> 
So ist es natürlich unmöglich, die Meldung anders zu gestalten und zu positionieren, da in kein div eingefasst und keine id oder class vorhanden. Da diese durch PHP ausgelöst wird, wird man da auch nichts daran ändern können, oder?
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Fatal error - Ausgabe anders positionieren und auffälliger gestalten - Möglich?

Post by cmb » Sun Sep 10, 2017 10:19 am

lck wrote:Beispiel Plugin-Fehler, Ausgabe am Ende der Seite. Im Quelltext sieht die Meldung so aus:
Zur Klarstellung: das passiert nur, wenn die Funktion im Template aufgerufen wird, und der Debug-Modus aktiviert ist.
lck wrote:So ist es natürlich unmöglich, die Meldung anders zu gestalten und zu positionieren, da in kein div eingefasst und keine id oder class vorhanden. Da diese durch PHP ausgelöst wird, wird man da auch nichts daran ändern können, oder?
Komplexes Thema. Zunächst mal ist hier display_errors relevant. Nur wenn dieses aktiv ist, wird von PHP überhaupt eine Fehlermeldung ausgegeben (auf die man dann aber keine Einfluss hat). Eigentlich sollte display_errors auf einem Produktionsssytem nie aktiv sein, und für unseren Debug-Modus wäre es normalerweise auch nicht nötig. Zum Ausprobieren kann man in dieser Zeile die 1 in 0 ändern. Dann wird bei aktiviertem Debug-Modus zunächst gar keine Meldung mehr angezeigt. Ist der Debug-Modus deaktiviert, dann sieht man einen konfigurierbaren Sprach-Text, etwa "A fatal error occurred. Enable debug mode for further information." Dieser wird im Shutdown-Handler erzeugt, aber eben nur, falls der Debug-Modus nicht aktiv ist. Man könnte das leicht ändern, so dass dieser Text (na ja, müsste natürlich umformuliert werden) immer angezeigt wird. Dieser Text könnte auch gestylt werden.

Allerdings ist es natürlich fraglich, eine solche Meldung überhaupt anzuzeigen. Das wurde eben v.a. wegen dem Problem eines fehlerhaften Funktionsaufrufs im Template eingeführt. Klar: ohne die Fehlermeldung kann man leicht denken, dass alles okay ist, wenn der Fehler erst weit unten im Template auftritt; aber dann gibt es andere Probleme ("Invalid CSRF Token").

Dann gibt es grundsätzlich die Möglichkeit, es erst gar nicht zu einem Fehler kommen zu lassen, indem man im Template schreibt:

Code: Select all

<?php if (function_exists('jm_landingpage')) jm_landingpage()?>
Ist aber auch suboptimal, weil man dann vielleicht nicht mal merkt, dass jm_landingpage nicht installiert ist. Um dem Abzuhelfen, könnte man einen else-Zweig ergänzen, der eine Fehlermeldung anzeigt, aber da wären wir wieder bei dem Problem, dass eine solche Meldung eigentlich nicht schön ist (genau wie die Meldung eines fehlschlagenden Pluginaufrufs im Frontend).

Aus Sicherheitsgründen ist es auf jeden Fall von Vorteil, wenn keine spezifischen Angaben zum Fehler im Frontend angezeigt werden, da dies einem Angreifer wertvolle Informationen liefern könnte.

Eine denkbare Lösung für dieses Dilemma wäre vielleicht, die konkreten Fehlermeldungen zu protokollieren, und display_errors immer zu deaktivieren. Dann müsste der Admin unter Umständen eben in der Protokolldatei nachschauen, um genaueres zu erfahren. Ein Nachteil dieser Variante wäre, dass zumindest bei voll aktiviertem Debug-Modus, das Logfile durch eine Menge weniger wichtiger Meldungen (deprecated, notice) vollgemüllt würde, was auch wieder verwirren kann. Ein großer Vorteil dieser Protokollierung wäre allerdings, dass man auch Fehlerhinweise erhält, die einem selbst nie begegnen würden (z.B. weil sie nur im Frontend auftreten).
Christoph M. Becker – Plugins for CMSimple_XH

lck
Posts: 2963
Joined: Wed Mar 23, 2011 11:43 am
Contact:

Re: Fatal error - Ausgabe anders positionieren und auffälliger gestalten - Möglich?

Post by lck » Sun Sep 10, 2017 11:49 am

Besten Dank für die ausführliche Erklärung. Komplexes Thema, dann belassen wir das lieber so wie es momentan ist.
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Fatal error - Ausgabe anders positionieren und auffälliger gestalten - Möglich?

Post by cmb » Thu Sep 14, 2017 12:49 am

Hm, ich habe gerade erfahren, dass der Aufruf von nicht definierten Funktionen unter PHP 7 keinen fatalen Fehler, sondern eine Exception auslöst. Somit könnten solche Probleme (zumindest unter PHP 7) abgefangen werden bevor es überhaupt zur Ausgabe kommt. Daher könnte/sollte hier wohl nachgebessert werden.
Christoph M. Becker – Plugins for CMSimple_XH

lck
Posts: 2963
Joined: Wed Mar 23, 2011 11:43 am
Contact:

Re: Fatal error - Ausgabe anders positionieren und auffälliger gestalten - Möglich?

Post by lck » Thu Sep 14, 2017 11:46 am

cmb wrote:Daher könnte/sollte hier wohl nachgebessert werden.
Das wäre gut.

Hintergrund der ganzen Geschichte ist: Ein solcher fataler Fehler blieb auf einer Webseite ein oder zwei Wochen unentdeckt, da die Fehlerausgabe ganz am Ende der Seite erfolgte und der content-Bereich unten auch noch ein margin von 1000px hatte um ein body-Hintergrundbild komplett betrachten zu können. Die Webseite funktionierte auch einwandfrei bis auf ein kleines scroll-to-top script.

Fatale Folgen:
Google-Bot sah die Seite aber als nicht erreichbar und entfernte daher ca. 130 gelistete Seiten aus seinem Index :shock: , erst dann wurde man aufmerksam. Das Google die Seite als nicht erreichbar einstufte, lag wohl an dem fehlenden abschließenden body- und html-Tag.
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Fatal error - Ausgabe anders positionieren und auffälliger gestalten - Möglich?

Post by cmb » Thu Sep 14, 2017 1:08 pm

lck wrote:Das wäre gut.
Ich hatte es zwischenzeitlich schon als Issue auf Github eingestellt.
lck wrote:Fatale Folgen:
Google-Bot sah die Seite aber als nicht erreichbar und entfernte daher ca. 130 gelistete Seiten aus seinem Index :shock: , erst dann wurde man aufmerksam. Das Google die Seite als nicht erreichbar einstufte, lag wohl an dem fehlenden abschließenden body- und html-Tag.
Au Backe! Das ist natürlich wirklich übel. Google dürfte sich allerdings weniger am fehlenden </body> und </html> gestört haben, als denn am "500 Internal Server Error" Status-Code, der vermutlich gesendet wurde.

Mein Vorschlag würde aber nur PHP 7 betreffen; eventuell sollten wir auch versuchen, für PHP 5 noch etwas nachzubessern – auch wenn der 500er nicht wegzubekommen ist, wenn PHP ihn erst mal erzeugt hat. Aber allgemein würde ich allen empfehlen PHP 7 zu nutzen, falls möglich, nicht nur wegen dieser Sache.

PS: An anderer Stelle habe ich vorgeschlagen, dass der Pluginaufruf auch Funktionen in Namespaces unterstützen sollte. Zusätzlich/alternativ wären auch statische Klassenmethoden denkbar. Das erlaubte einen Trick, um zu verhindern, dass zumindest im Fall eines nicht installierten Plugins dessen Aufruf im Template überhaupt einen PHP-Fehler auslöst. Man könnte dann nämlich dynamisch eine Klasse erzeugen, die __callStatic() implementiert, was ab PHP 5.3.0 möglich wäre. Das würde allerdings erfordern, dass Plugins auch davon Gebrauch machen.
Last edited by cmb on Thu Sep 14, 2017 1:17 pm, edited 1 time in total.
Reason: Add PS
Christoph M. Becker – Plugins for CMSimple_XH

Hartmut
Posts: 553
Joined: Sat Nov 05, 2011 6:13 pm
Location: Butzbach, Deutschland
Contact:

Re: Fatal error - Ausgabe anders positionieren und auffälliger gestalten - Möglich?

Post by Hartmut » Thu Sep 14, 2017 5:24 pm

cmb wrote: PS: An anderer Stelle habe ich vorgeschlagen, dass der Pluginaufruf auch Funktionen in Namespaces unterstützen sollte. Zusätzlich/alternativ wären auch statische Klassenmethoden denkbar. Das erlaubte einen Trick, um zu verhindern, dass zumindest im Fall eines nicht installierten Plugins dessen Aufruf im Template überhaupt einen PHP-Fehler auslöst. Man könnte dann nämlich dynamisch eine Klasse erzeugen, die __callStatic() implementiert, was ab PHP 5.3.0 möglich wäre.
Das würde allerdings erfordern, dass Plugins auch davon Gebrauch machen.
Aus meiner Sicht wäre da ein Hinweis in der Dokumentation für die Plugin Anforderungen / Empfehlungen sinnvoll, damit die Plugin Entwickler es leichter finden und berücksichtigen können.

Viele Grüße
Hartmut

Post Reply