允许php文件仅在另一个PHP文件包含时执行

时间:2014-07-14 17:04:09

标签: php

如果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的解决方案。

5 个答案:

答案 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

See reference

答案 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__设置为您当前所在文件的名称,即使在包含中也是如此。如果它们相同,那么您直接加载文件。如果不同,可以假设它包括在内。