php 将弃用的错误写入 apache 错误日志

php 将弃用的错误写入 apache 错误日志

我刚刚从 Debian Lenny 升级到 Squeeze,发现我的 /var/log/apache2/errors.log 被以下错误轰炸:

<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 />

我觉得这很奇怪,因为这是一个系统日志,而 php(通过 apache)正在尝试将 html 代码写入其中。这似乎发生在服务器上的每次页面加载时(包括任何虚拟主机)。

目前无法将这些值设置为关闭(我正在运行一个未维护的代码库)。我的 php.ini 包含以下内容:

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

我不确定这是 php 配置错误还是 apache 配置错误。有人知道如何避免每次页面加载时这些消息都写入 errors.log 吗?

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

谢谢,Gardar

答案1

虽然这里的其他答案将要停止将错误写入错误日志,他们只是忽略了错误信息而不是修复错误

在这种情况下,错误在于您的 php.ini 中仍然包含 或magic_quotes_gpc on。或 也是magic_quotes_gpc off如此。register_globals onregister_globals off

错误不在于指令是打开还是关闭。错误在于指令根本不应该存在。从 php.ini 中注释掉这些行或将其完全删除,PHP 将停止输出有关弃用指令的错误。

当然,如果您的应用程序需要其中任何一个,这可能会导致问题。

这是 PHP 5.3 中的错误,因为在 PHP 6 中,这些指令根本不存在,PHP 6 的行为就像它们被设置为关闭一样。如果您计划升级到 PHP 6,现在是开始升级或替换应用程序的好时机。

您可以尝试的另一种解决方案是将 PHP 降级回 5.2 或 5.1 分支。

至于 PHP 将错误写入 Apache 的日志,这是很自然的,因为 PHP 是作为 Apache 模块运行的。您可以将类似这样的内容放入error_log = /var/log/php_errors.logphp.ini 并重新启动 Apache,以便将 PHP 错误与 Apache 错误分开。当您在那里时,我建议更改display_errorsoff。错误消息通常可能包含您不希望攻击者看到的敏感信息。您很可能会在 php.ini 中看到以下内容:

; - 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.

没有任何合理理由可以解释为什么错误消息中包含 HTML。

回答您没有问到的另一个问题,PHP 报告此问题的原因in <b>Unknown</b> on line <b>0</b>是,错误消息是针对您编写的 PHP 代码行设计的,但它发现的错误是在解析 php.ini 时发现的,当时它甚至还没有读取一行代码,甚至还没有打开 .php 文件。由于它没有打开文件,也没有行号,因此它将其报告为“未知”和“0”。

答案2

删除 ~E_DEPRECATED

太棒了:)

答案3

可以通过设置 display_errors = Off 来避免此行为。我对这个解决方案并不十分满意,将 html 格式的错误写入日志文件对我来说似乎很奇怪。如果有人了解这种行为,请告诉我 :)

相关内容