只允许包含PHP文件的最佳方法是什么?

时间:2008-10-06 03:49:02

标签: php

我想确保人们无法在URL中键入PHP脚本的名称并运行它。这样做的最佳方式是什么?

我可以在包含此文件的文件中设置一个变量,然后在包含的文件中检查该变量,但有更简单的方法吗?

8 个答案:

答案 0 :(得分:11)

在我讨论过的一些开源应用程序中,包括Joomla和PHPBB,它们在主包含文件中声明了一个常量,然后验证每个包含中是否存在常量:

// index.php
require_once 'includes.php';

// includes.php
define('IN_MY_PROJECT', true);
include 'myInc.php';

// myInc.php
defined('IN_MY_PROJECT') || die("No direct access, plsktnxbai");

答案 1 :(得分:7)

您可以检查URI并查看是否使用`

调用该文件
$_SERVER['SCRIPT_FILENAME']

或者你可以将文件移到公共文件夹之外,这是一个更好的解决方案。

答案 2 :(得分:4)

我一直保留除了Web根目录之外的可直接查看脚本以外的所有内容。然后配置PHP以在路径中包含脚本目录。典型的设置是:

appdir
  include
  html

在PHP配置中(全局PHP配置或.htaccess目录中的html文件)添加:

include_path = ".:/path/to/appdir/include:/usr/share/php"

或(对于Windows)

include_path = ".;c:\path\to\appdir\include;c:\php\includes"

请注意,此行可能已在您的php.ini文件中,但可能会被注释掉以允许默认值生效。它可能还包括其他路径。一定要保留这些。

如果要将其添加到.htaccess文件中,格式为:

php_value include_path .:/path/to/appdir/include:/usr/share/php

最后,您可以使用以下内容以编程方式添加路径:

$parentPath = dirname(dirname(__FILE__));
$ourPath = $parentPath . DIRECTORY_SEPARATOR . 'include';

$includePath = ini_get('include_path');
$includePaths = explode(PATH_SEPARATOR, $includePath);
// Put our path between 'current directory' and rest of search path
if ($includePaths[0] == '.') { 
    array_shift($includePaths);
}

array_unshift($includePaths, '.', $ourPath);
$includePath = implode(PATH_SEPARATOR, $includePaths);
ini_set('include_path', $includePath);

(基于工作代码,但已修改,未经测试)

这应该在您的前端文件中运行(例如index.php)。我将它放在一个单独的包含文件中,在修改上述内容后,可以包含#include '../includes/prepPath.inc'之类的内容。

我已经使用了我在这里展示的所有版本并取得了成功。使用的特定方法取决于首选项以及如何部署项目。换句话说,如果你不能修改php.ini,你显然不能使用那个方法

答案 3 :(得分:0)

Zend Framework建议您将文件保留在Web根目录之外,正如Unkwntech建议的那样。我认为这是最安全,最傻瓜的解决方案。

答案 4 :(得分:0)

来自PHP Nuke模块:

<?php
if (!eregi("modules.php", $PHP_SELF)) {
   die ("You can't access this file directly...");
}
// more code ...
?>

将modules.php替换为您的文件名,并且无法直接调用该文件。

答案 5 :(得分:0)

我经常看到的一种方法是创建一个必须存在于每个包含文件中的变量,并检查每个包含中的第一个内容:

if(!isset($in_prog)){
exit;
}

答案 6 :(得分:0)

我想最好的方法是将您要包含的文件放入&#34; / include &#34;文件夹并将访问权限700放到文件夹

答案 7 :(得分:0)

这是一个古老的问题,但我发现这种单线非常有效:

$inc = get_included_files(); if(basename(__FILE__) == basename($inc[0])) exit();

get_included_files()返回一个包含脚本中包含的文件的数组。第一个位置是根文件,其他位置是包含的文件。