我正在做一个管理面板,我试图做一个安全的查询字符串,以便导航到我的管理文件夹。
首先在我的登录表单页面中,如果用户使用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;,里面我有:
你看到我做错了吗?
答案 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
最后但并非最不重要的是,您可能还想在需要之前检查文件是否存在。