现在我想知道只需要require($path)
的文件是否安全。
对于来说,这只是最简单的例子:
我有一些形式域folder
和name
。因此,当我执行require($somepath.'/'.$folder.'/'.$name.'.php')
时,输入'../..可以很容易地重新定位它/admin/或/else/things/'
这是一个简单的例子,但还有许多其他方法可以重新定位$path
。
所以问题是:
-提供传入路径的检查
-如果是。。那么如何正确地进行呢?
如果您需要另一个文件,根据用户输入,您应该非常仔细地验证文件夹和名称字段。你不希望用户需要他们自己的文件(可能是他们刚刚上传的文件)或任何其他肮脏的东西。
理想情况下,您应该创建一个可接受值的列表,如下所示:
$allowedIncludes = array('a/foo.php', 'b/bar.php'); // etc
然后你可以检查他们提供的名称和文件夹字段的组合是否有效:
if(false !== array_search("$folder/$name", $allowedIncludes) {
// OK
// require ...;
} else {
// not ok
}
但是,当允许用户做这样的事情时,要非常小心。您不想让人们在您的机器上执行任意代码。
这是我的方法:
/* 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']);