0

我有一个受登录保护的 php 页面,我已将下面的代码放在我所有的 php 页面上

<?PHP
session_start();
session_destroy();
if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
header ("Location: infralogin.php");
}
?>

我有我的主页,在我登录后它被路由,

<table width="300" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td colspan="2" align="center">
<form id="form1" name="form1" method="post" action="checklogin.php">
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#FFFFFF">
<td align="center"><a href="tickettracker.php">Ticket Uploader</a></td>
</tr>
<tr bgcolor="#FFFFFF">
<td align="center"><a href="raptool.php">RAP Tool</a></td>
</tr>
<tr bgcolor="#FFFFFF">
<td>&nbsp;</td>
</tr>
<tr bgcolor="#FFFFFF">
<td align="center"><a href="login/add_user.php">Add User</a></td>
</tr>
<tr bgcolor="#FFFFFF">
<td align="center"><a href="login/logout.php">Logout</a></td>
</tr>
</table>
</form></td>
</table>

现在这个tickettracker.php有子页面,我通过里面的链接访问,下面是里面的示例链接,

<tr>
<td width="135"><strong>Ticket Source:</strong></td>
<td align="left"><select name="Ticket" id="Ticket">
<option value="tickettracker.php" selected="selected">Please select...</option>
<option value="wireless_new.php">Wireless - Remedy</option>
<option value="smp_backend.php">SMP - Backend</option>
<option value="ess_remedy.php">ESS - Remedy</option>
<option value="wireline_remedy.php">Wireline - Remedy</option>
</select>
<input type="submit" value="Go" id="submit"/></td>
</tr>

<p align="center"><a href="view_transactions.php">View Transactions</a> | <a href="report_generator.php">Report Generator</a></p>
<tr align="center">
<p align="center">External Link: <a href="raptool.php">RAP Tool</a></p></td>

我尝试在所有子页面中输入下面的代码,以保护它们,因为我无法访问它们并且我被路由到登录页面,但事情是每当我已经登录并且我点击了tickettracker.php访问子页面,我仍然被重定向到登录页面

<?PHP
session_start();
session_destroy();
if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
header ("Location: infralogin.php");
}
?>
4

2 回答 2

4
 if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
     header ("Location: infralogin.php");
 }

取而代之的是,使用以下推理,它应该可以工作:-)

 if (!isset($_SESSION['login']) || $_SESSION['login'] == '') {
   header ("Location: infralogin.php");
}

感谢代码先生。去除

session_destroy();

也。因为它正在破坏当前会话,所以当前会话数据将丢失。

于 2013-06-17T09:29:40.330 回答
2

条件应该是:

if(!isset($_SESSION['login']) || $_SESSION['login'] == '')

这就是说:如果未设置登录名或登录名为空白/丢失,则重定向。

您还有身份验证绕过问题,因为您没有exit()在重定向之后。你应该使用:

session_start();
//session_destroy(); // <-- removed
if (!isset($_SESSION['login']) || $_SESSION['login'] == '') {
    header ("Location: infralogin.php");
    exit();
}

如果您在重定向后不这样做exit(),用户可以选择忽略重定向,从而绕过您的登录系统并接收受保护的页面内容。

正如@Jim 指出的那样,您正在调用 session_destroy,为什么?即使在脚本结束之前它不会被销毁,当用户尝试前进到另一个受保护的页面(他们将被注销)时,它仍然会在您的系统中产生错误。

于 2013-06-17T09:42:46.603 回答