如果PHP文件包含在另一个PHP文件中,那么只允许执行它是正确的吗?
例如,假设我的主应用程序文件为“main.php”。该文件包含“settings.php”:
// www.mydomain.com/MAIN.PHP
<?php
require 'settings.php';
?>
// www.mydomain.com/SETTINGS.PHP
<?php
// DO SOMETHING
?>
如果用户从浏览器运行“www.mydomain.com/SETTINGS.PHP”,如何才能执行“settings.php”?
我正在寻找一种仅限PHP的解决方案。
答案 0 :(得分:4)
第一个解决方案显然是不将其放在可访问Web的位置。有时候这是不可行的,所以你可以检查一下:
// www.mydomain.com/MAIN.PHP
<?php
define('SOMETHING', true);
require 'settings.php';
// www.mydomain.com/SETTINGS.PHP
<?php
if(!defined('SOMETHING')) { die(); }
// DO SOMETHING
或者您可以在全局标题中使用类似的内容:
if(strpos($_SERVER["PHP_SELF"], basename(__FILE__) !== false) { die(); }
答案 1 :(得分:1)
在settings.php
中,您可以检查$_SERVER['SCRIPT_FILENAME']
是否为settings.php
;如果是:直接访问脚本,如果不是:正在包含脚本
//settings.php
echo $_SERVER['SCRIPT_FILENAME']; // echoes 'settings.php'
//file.php
include 'settings.php'; //echoes 'file.php';
这意味着您可以执行以下操作:
//settings.php
if($_SERVER['SCRIPT_FILENAME'] != 'path/to/the/settings/file/settings.php'){
define('SETTING', true);
}
答案 2 :(得分:0)
如果要允许包含远程文件,则必须在php.ini中将指令allow_url_include设置为On
答案 3 :(得分:0)
一种方法是检查&#34;魔法&#34;包含settings.php。
时设置的值// www.mydomain.com/MAIN.PHP
<?php
$magic = "c00f0c4675b91fb8b918e4079a0b1bac";
require 'settings.php';
?>
// www.mydomain.com/SETTINGS.PHP
<?php
if ($magic != "c00f0c4675b91fb8b918e4079a0b1bac") {
die("Cannot be executed independently.");
}
// DO SOMETHING
?>
这可以防止偶然的愚弄; 不保护您免受可以阅读您的PHP文件的人的伤害,即有权访问您服务器的人。
答案 4 :(得分:0)
另一种方法是检查所请求的文件(通常为$_SERVER['REQUEST_FILENAME']
)是否与__FILE__
匹配。 __FILE__
设置为您当前所在文件的名称,即使在包含中也是如此。如果它们相同,那么您直接加载文件。如果不同,可以假设它包括在内。