$admpage=md5($_SERVER[DOCUMENT_ROOT]).'.php';
if(!@include($admpage)){echo "error opening Adminpage";}
因此,如果没有这样的文件,应该有错误error opening Adminpage
。
但是,如果在包含的文件 IS 代码中出现错误,则不会显示任何内容。
换句话说,我需要在包含时关闭错误报告,但在执行包含文件时打开它们。
附言我试过eval()
但这比@include()
.PPS
我需要包含任何文件,但如果错误(在包含或执行时(,则显示错误但从不显示文件名
看来,您的目标是禁止包含不存在的文件的错误消息。
这是您可以执行此操作的方法:
$old = ini_set('display_errors', 0); // Do not show errors to client
$fileExists = file_exists($someFile) && is_readable($someFile);
ini_set('display_errors', $old); // Restore old value
if (!$fileExists)
die('Error opening admin page');
include($someFile);
为什么要采取许多步骤?
file_exists
并且is_readable
将在某些情况下打印错误消息:可能存在safe_mode
或open_basedir
限制问题(并非每个人都在使用 PHP 5.3(。服务器也可能使用suPHP
运行,这也会使文件不可读。
为什么错了?
您的概念:依靠模糊文件的名称进行伪身份验证称为"隐蔽安全性"。例如,任何有权访问您的浏览器历史记录的人都会知道该 URL。这不是很安全...
我的回答:简单地关闭display_errors
就像将error_reporing
设置为零一样安全:根本不安全。 例如:一旦安装了自定义错误处理程序,这两个设置都会被"忽略"。自定义错误处理程序负责相应地检查这些值。
您可以考虑为生产和开发环境使用不同的php.ini
设置。理想情况下,前者应不显示任何错误消息,而后者应溢出所有错误消息。
继续阅读:
- 默默无闻的安全
- 使用 PHP 进行 HTTP 身份验证
-
error_reporting
仅当文件确实存在时才包含:
if (file_exists($admpage) && is_readable($admpage)) {
include($admpage);
}
file_exists
是怎么回事?
if(!file_exists($admpage)){echo "error opening Adminpage";}
如果您真的想在包含以下内容的同时关闭错误报告:@include("script.php");
然后将文件中的代码包装在一个函数中,例如 myFunc()
,然后在包含之后调用它。