2012-09-13 91 views
1

现在我想知道是否可以安全地只需要require($path)文件。php需要文件路径转义

对于只是simpliest例如
我有某种形式的现场foldername。因此,当我做require($somepath.'/'.$folder.'/'.$name.'.php')时,可以通过输入'../../admin/or/else/things/'轻松地重新定位。

这是一个简单的例子,但有(我希望如此)许多其他方式来搬迁$path

所以问题是:
- 提供检查传入路径?
- 如果是的话,那么它是如何正确的?

+0

要求应该只用于在代码把从其他PHP文件。在我看来,你应该将表单字段值传递给它(另外,只需要一个与你的变量同名的表单字段不会创建一个php变量)。你能详细说明你想做什么吗? – mtsvetkov

+0

你可能不应该让用户在第一时间做到这一点。如果你这样做,你的应用程序,甚至你的服务器都可能容易受到攻击。 – Borgtex

+0

@mtsvetkov所以你想说,即使我需要另一个文件 - 我不能做些什么来做它?听起来像是一个真相。 – StasGrin

回答

2

如果你想要另一个文件,根据用户输入,你应该非常仔细地验证文件夹和名称域。你不希望用户需要他们自己的文件(可能是他们刚刚上传的文件)或任何其他nasties。

理想情况下,你应该建立可接受值的列表,像这样:

$allowedIncludes = array('a/foo.php', 'b/bar.php'); // etc 

然后,你可以检查它们提供的名称和文件夹字段的组合是否有效:

if(false !== array_search("$folder/$name", $allowedIncludes) { 
    // OK 
    // require ...; 
} else { 
    // not ok 
} 

但是,当允许用户做这样的事情时,非常小心。你做不是想让人们在你的机器上执行任意代码。

1

这里是我的方法:

/* Valid Pages' Array */ 
$pages['welcome']['title'] = 'Welcome!';    // Page Title 
$pages['welcome']['path'] = './pages/welcome.php';  // Physical Valid Path 
$pages['welcome']['login'] = false;      // Log-in Required? 

$pages['my-account']['title'] = 'My Account'; 
$pages['my-account']['path'] = './user/my_account.php'; 
$pages['my-account']['login'] = true; 

/* Requested Page */ 
$page = !empty($_REQUEST['page']) ? $_REQUEST['page'] : 'welcome'; 

/* Including ... */ 
if (file_exists($pages[$page]['path'])) 
    include($pages[$page]['path']); 
else 
    include($pages['404']['path']);