PHP schreibt veraltete Fehler in das Apache-Fehlerprotokoll

7

Ich habe gerade ein Upgrade von Debian Lenny auf Squeeze durchgeführt und festgestellt, dass mein /var/log/apache2/errors.log mit den folgenden Fehlern bombardiert wird:

<b>Warning</b>:  Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in <b>Unknown</b> on line <b>0</b><br />
<br />
<b>Warning</b>:  Directive 'register_globals' is deprecated in PHP 5.3 and greater in <b>Unknown</b> on line <b>0</b><br />

Ich finde das seltsam, da dies ein Systemprotokoll ist und PHP (über Apache) versucht, HTML-Code hinein zu schreiben. Dies scheint bei jeder Seitenlast auf dem Server (einschließlich eines virtuellen Hosts) zu geschehen.

Das Deaktivieren dieser Werte ist derzeit keine Option (ich verwende eine nicht verwaltete Codebasis). Meine php.ini enthält unter anderem:

error_reporting  = E_ALL & ~E_NOTICE & ~E_DEPRECATED
display_errors = On
register_globals = On
magic_quotes_gpc = On

Ich bin nicht sicher, ob dies ein Fehler mit PHP-Konfiguration oder Apache-Konfiguration ist. Weiß jemand, wie ich verhindern kann, dass diese Nachrichten bei jedem Seitenladen in error.log geschrieben werden?

  • PHP: Version 5.3.2-2 Apache:
  • Apache / 2.2.16 (Debian)

Danke, Gardar

Gardarh
quelle
Wenn Sie diese Einstellungen benötigen, damit Ihr Code funktioniert, müssen Sie die Aktualisierung der installierten PHP-Version beenden. Veraltet bedeutet, dass die Unterstützung für diese Einstellungen entfernt wird. Und sie sind aus gutem Grund veraltet.
Symcbean
(oder
korrigieren Sie

Antworten:

9

Während die anderen Antworten hier verhindern , dass die Fehler in Ihr Fehlerprotokoll geschrieben werden, ignorieren sie einfach die Fehlermeldung und beheben den Fehler nicht .

Der Fehler in diesem Fall ist, dass Ihre php.ini noch entweder magic_quotes_gpc onoder magic_quotes_gpc offirgendwo darin ist. Gleiches gilt für register_globals onoder register_globals off.

Der Fehler ist nicht, dass die Direktive ein- oder ausgeschaltet ist. Der Fehler ist, dass die Direktive überhaupt nicht existieren sollte. Kommentieren Sie diese Zeilen aus Ihrer php.ini oder entfernen Sie sie vollständig, und PHP schreibt keine Fehler mehr über veraltete Anweisungen.

Dies kann natürlich zu Problemen mit Ihrer Anwendung führen, wenn eine dieser Anwendungen aktiviert sein muss.

Der Grund, warum dies ein Fehler in PHP 5.3 ist, ist, dass diese Anweisungen in PHP 6 nicht einmal existieren und PHP 6 sich so verhält, als ob sie deaktiviert wären. Wenn Sie jemals ein Upgrade auf PHP 6 planen, ist jetzt ein guter Zeitpunkt, um mit dem Upgrade oder Ersetzen Ihrer Anwendung zu beginnen.

Eine andere Lösung, die Sie versuchen könnten, ist das Downgrade von PHP auf den Zweig 5.2 oder 5.1.

PHP-Schreibfehler in das Apache-Protokoll sind natürlich, da PHP als Apache-Modul ausgeführt wird. Sie können so etwas error_log = /var/log/php_errors.login Ihre php.ini einfügen und Apache neu starten, um die PHP-Fehler von Ihren Apache-Fehlern zu trennen. Während Sie dort sind, dann würde ich empfehlen Wechsel display_errorszu off. Fehlermeldungen können häufig vertrauliche Informationen enthalten, die ein Angreifer nicht sehen soll. Sie werden dies höchstwahrscheinlich in Ihrer php.ini sehen:

; - display_errors = Off           [Security]
;     With this directive set to off, errors that occur during the execution of
;     scripts will no longer be displayed as a part of the script output, and thus,
;     will no longer be exposed to remote users.  With some errors, the error message
;     content may expose information about your script, web server, or database
;     server that may be exploitable for hacking.  Production sites should have this
;     directive set to off.

Es gibt keinen vernünftigen Grund, warum die Fehlermeldungen HTML enthalten.

Um eine andere Frage zu beantworten, die Sie nicht gestellt haben, meldet PHP dies als Grund dafür, in <b>Unknown</b> on line <b>0</b>dass die Fehlermeldung für von Ihnen geschriebene Zeilen PHP-Code entwickelt wurde, der gefundene Fehler jedoch darin bestand, die php.ini zu analysieren, bevor sie überhaupt aufgetreten ist Lesen Sie eine einzelne Codezeile oder öffnen Sie sogar eine .php-Datei. Da es keine Datei geöffnet hat und keine Zeilennummer hat, werden sie als "Unbekannt" und "0" gemeldet.

Ladadadada
quelle
0

entferne ~ E_DEPRECATED

tadam :)

Danny
quelle
Wenn ich ~ E_DEPRECATED entferne, werden veraltete Fehlermeldungen auf Webseiten geschrieben (die veraltete PHP-Funktionen verwenden), was noch schlimmer ist :) Ich bin mir nicht sicher, ob das Problem sowieso gelöst ist. ~ E_DEPRECATED ist dazu da, veraltete Fehler nicht zu melden.
Gardarh
0

Dieses Verhalten kann vermieden werden, indem display_errors = Off gesetzt wird. Ich bin nicht ganz glücklich über diese Lösung. Das Schreiben eines Fehlers im HTML-Format in Protokolldateien erscheint mir seltsam. Wenn jemand dieses Verhalten versteht, sagen Sie es bitte :)

Gardarh
quelle
4
Herzlichen Glückwunsch, Sie haben gerade das Abzeichen "Spotted one of the many PHP gotcha's" erhalten! PHP scheint genau die gleiche Nachricht in das Fehlerprotokoll zu schreiben, die auf Webseiten angezeigt wird - und auf den Webseiten werden die Fehlermeldungen mit <b> -Tags versehen. Um mutig <b> zu protokollieren, wo sich noch keine Software angemeldet hat ... aber hey, zumindest wird es nicht im XML-Format protokolliert, sodass es noch nicht vollständig unternehmensfähig ist.
Janne Pikkarainen