2008-10-06 98 views
9

我想确保人们不能在URL中输入PHP脚本的名称并运行它。这样做的最好方法是什么?什么是仅允许包含PHP文件的最佳方式?

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

+0

您能否更清楚一点?我真的不明白,如果你的浏览器指向它,你不希望文件不能运行... – 2008-10-06 03:53:17

+0

也许如果预制函数的功能,也许是为了安全起见,为什么不相关。 – UnkwnTech 2008-10-06 03:54:29

+0

@Unkwntech:我的困惑来自这样的事实,如果一个文件是在webroot下它应该是查看,任何安全必须在它之外... – 2008-10-06 03:58:46

回答

6

您可以检查URI,看看是否有文件被调用`

$_SERVER['SCRIPT_FILENAME'] 

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

0

正如Unkwntech建议的那样,Zend Framework建议您将文件保存在Web根目录之外。我会说这是最安全和最愚蠢的解决方案。

0

从PHP Nuke的模块:

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

替换modules.php您的文件名,该文件不能被直接调用。我见过很多

0

一种方法是创建具有存在于每一个包含文件,并检查第一件事就是在每一个变量包括:

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

我早就把一切除了直接可见的脚本在网页根目录之外。然后配置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,你显然不能使用这种方法

9

在我探讨过的一些开源应用程序中,包括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"); 
0

我想最好的办法就是把你要包括里面的文件“/包括”文件夹,并把访问权限700该文件夹

相关问题