我的安全导航白名单无效

时间:2014-06-26 19:05:15

标签: php

我正在做一个管理面板,我试图做一个安全的查询字符串,以便导航到我的管理文件夹。

首先在我的登录表单页面中,如果用户使用sucess登录,我会使用管理员信息存储会话$结果。

$result = $readUser->fetch(PDO::FETCH_ASSOC);
$_SESSION['result'] = $result;

然后我有我的管理员dashboard.php文件,我想让我的查询字符串进行导航。

首先,我看看是否存在会话:

ob_start();
session_start();

if(!$_SESSION['result'])
{
    header('Location: index.php?restricted=true');
}

然后我有我的查询字符串:

echo '<div id="panel">';
if(empty($_GET['exe'])){
    require('home.php');
}
elseif(file_exists($_GET['exe'].'.php')){
    require($_GET['exe'].'.php');
}
else{
    require('404.php');
}
echo '</div><!-- /panel -->';

我的查询字符串工作正常,但我想添加更多安全性,并且我为此目的阅读了白名单。

现在我试着像这样做我的查询字符串:

我的代码如下:

$whitelist = array('sis/home', 'sis/404', 'posts/index', 'posts/edit', 'categories/index', 'categories/edit', 'dashboard', 'inc/header.php','inc/footer.php');
if(empty($_GET['exe'])){
    require('sis/home.php');
}
elseif(in_array($_GET['exe'].'.php', $whitelist)){
    require($_GET['exe'].'.php');
}
else{
    require('sis/404.php');
}

但是当我试图访问我的网址时:

http://localhost/adminPanel/admin/dashboard.php?exe=posts/index:

我总是得到我的404.php文件。我的所有导航都会发生这种情况。

我在主页上取得了成功:

http://localhost/adminPanel/admin/dashboard.php

我的项目文件夹组织是这样的:

1个主文件夹&#34; adminPanel&#34;,里面我有:

  • 1 index.php文件,我有登录表单
  • 1 dashobard.php文件,我在做我的查询字符串
  • 1个文件夹&#34; admin&#34;,在admin文件夹中我有:
    • 1个文件夹帖子,里面有一个index.php文件和一个edit.php文件
    • 1个文件夹包含,里面有一个footer.php文件和一个header.php文件
    • 1个文件夹inc,里面我有一个404.php文件和一个home.php文件

你看到我做错了吗?

1 个答案:

答案 0 :(得分:1)

@Shai评论的那样,连接'.php'会导致你的in_array()返回false。删除concat或将“.php”添加到数组中的每个项目。第一种选择对性能更好。

此外,您可能需要对您的GET参数进行url编码。

http://localhost/adminPanel/admin/dashboard.php?exe=posts/index

http://localhost/adminPanel/admin/dashboard.php?exe=posts%2Findex

最后但并非最不重要的是,您可能还想在需要之前检查文件是否存在。