php需要文件路径转义

时间:2012-09-13 12:03:28

标签: php security

现在我想知道要求只有require($path)的文件是否安全。

对于最简单的例子
我有一些表单字段foldername。因此,当我require($somepath.'/'.$folder.'/'.$name.'.php')时,可以通过输入'../../admin/or/else/things/'轻松重新定位。

这是一个简单的例子,但有(我希望如此)许多其他方法来重新定位$path

所以问题是:
- 提供传入路径的检查?
- 如果是的话......那怎么做呢?

2 个答案:

答案 0 :(得分:2)

如果您想要根据用户输入要求另一个文件,您应该验证文件夹和名称字段非常小心。您不希望用户需要他们自己的文件(可能是他们刚上传的文件)或任何其他恶意文件。

理想情况下,您应该创建一个可接受的值列表,如下所示:

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

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

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

但是,当允许用户执行此类操作时,再次非常小心。您希望允许人们在您的计算机上执行任意代码。

答案 1 :(得分: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']);