考虑到 PHP 是服务器端,内部工作不应向客户端公开任何内容。只有输出(除非您的服务器配置错误并且不解析 PHP 文件)。为了解决这个问题,大多数人只会index.php
在他们的文档根目录中有一个文件,该文件是include
文档根目录之外的 PHP 文件(引导文件)。这样,即使文件没有被 PHP 解析,唯一可访问的就是其中包含的文件require __DIR__ . '/../bootstrap.php';
。
但是,当您启用错误报告(您应该始终这样做)并且您启用了显示错误时,可能会泄漏信息。
泄漏信息的示例可能如下所示:
致命错误:/path/to/Template/stream/stream.phtml:20 中未捕获的异常 'Exception' 和消息 'Eeeeeeeeek' 堆栈跟踪:#0 /path/to/PitchBlade/src/PitchBlade/Mvc/View/View。 php(179): require() #1 /path/to/PitchBlade/src/PitchBlade/Mvc/View/View.php(196): PitchBlade/Mvc/View/View->render('stream/stream.p. ..')
/path/to/View/Stream/Stream.php(46): PitchBlade/Mvc/View/View->renderPage('stream/stream.p...')
ETC
您可以通过在代码深处“伪造”异常来自己找出答案:
<?php throw new \Exception('Eeeeeeeek'); ?>
如果将显示整个堆栈跟踪,则会显示大量信息。
另一个常见的陷阱是通过更改扩展名来重命名 PHP 文件(出于备份或其他目的)。例如重命名index.php
为index.php.bak
. 现在默认情况下 PHP 不再解析文件,它可以从客户端读取。
另请注意,(一些?)网络服务器向客户端公开了一些信息(即网络服务器类型,有时使用的版本和 php 版本)。根据网络服务器,这可以通过expose_php
指令和您使用的网络服务器的指令进行更改。对于 apache,您可以将以下内容添加到服务器配置中,以防止暴露使用的网络服务器(ServerTokens Prod
和ServerSignature Off
)。尽管人们通常仍然能够通过使用指纹技术获得至少部分此类信息。
我能想到的最后一件事是用户(或可能的攻击者)通过附加以下查询字符串之一来尝试不同的 PHP“复活节彩蛋”:
?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
但是 IIRC 这在禁用时也是不可能的php_expose
。