1:检查包含文件的数量
if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
{
exit('Restricted Access');
}
逻辑:如果未满足最小包含计数,PHP 将退出。请注意,在 PHP5 之前,基本页面不被视为包含。
2:定义和验证全局常量
// In the base page (directly accessed):
define('_DEFVAR', 1);
// In the include files (where direct access isn't permitted):
defined('_DEFVAR') or exit('Restricted Access');
逻辑:如果未定义常量,则执行不会从基本页面开始,PHP 将停止执行。
注意,为了跨升级和未来更改的可移植性,使这种身份验证方法模块化将显着减少编码开销,因为更改不需要硬编码到每个文件。
// Put the code in a separate file instead, say 'checkdefined.php':
defined('_DEFVAR') or exit('Restricted Access');
// Replace the same code in the include files with:
require_once('checkdefined.php');
这样可以将额外的代码添加到checkdefined.php用于记录和分析目的,以及生成适当的响应。
功劳归于功劳:可移植性的绝妙想法来自this answer。
3:远程地址授权
// Call the include from the base page(directly accessed):
$includeData = file_get_contents("http://127.0.0.1/component.php?auth=token");
// In the include files (where direct access isn't permitted):
$src = $_SERVER['REMOTE_ADDR']; // Get the source address
$auth = authoriseIP($src); // Authorisation algorithm
if( !$auth ) exit('Restricted Access');
这种方法的缺点是执行隔离,除非内部请求提供了会话令牌。在单服务器配置的情况下通过环回地址进行验证,或者在多服务器或负载平衡服务器基础架构的情况下通过地址白名单进行验证。
4:令牌授权
与上一种方法类似,可以使用 GET 或 POST 将授权令牌传递给包含文件:
if($key!="serv97602"){header("Location: ".$dart);exit();}
一种非常混乱的方法,但如果以正确的方式使用,可能同时也是最安全和最通用的方法。
5:网络服务器特定配置
大多数服务器允许您为单个文件或目录分配权限。您可以将所有包含在此类受限目录中,并将服务器配置为拒绝它们。
例如在 APACHE 中,配置存储在 .htaccess 文件中。教程here.
注意但是,我不推荐特定于服务器的配置,因为它们不利于跨不同 Web 服务器的可移植性。在拒绝算法复杂或拒绝目录列表相当大的内容管理系统等情况下,它可能只会使重新配置会话变得相当可怕。最后最好在代码中处理。
6:将包含放置在站点根目录之外的安全目录中
由于服务器环境中的访问限制,最不受欢迎,但如果您可以访问文件系统,这是一种相当强大的方法。
//Your secure dir path based on server file-system
$secure_dir=dirname($_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR."secure".DIRECTORY_SEPARATOR;
include($secure_dir."securepage.php");
逻辑:
- 用户无法请求
htdocs 文件夹之外的任何文件,因为这些链接超出了网站地址系统的范围。
- php 服务器本地访问文件系统,因此可以访问计算机上的文件,就像具有所需权限的普通程序一样。
- 通过将包含文件放在此目录中,您可以确保 php 服务器可以访问它们,同时拒绝用户进行热链接。
- 即使网络服务器的文件系统访问配置未正确完成,此方法也可以防止这些文件意外公开。
请原谅我的非正统编码约定。任何反馈都表示赞赏。