我刚刚从 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 on
register_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.log
php.ini 并重新启动 Apache,以便将 PHP 错误与 Apache 错误分开。当您在那里时,我建议更改display_errors
为off
。错误消息通常可能包含您不希望攻击者看到的敏感信息。您很可能会在 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 格式的错误写入日志文件对我来说似乎很奇怪。如果有人了解这种行为,请告诉我 :)