如何正确保护PHP页面

时间:2013-06-17 09:27:04

标签: php

我有一个受登录保护的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");
}
?>

2 个答案:

答案 0 :(得分:4)

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

而不是这个,使用以下推理,它应该工作: - )

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

感谢MrCode。

删除
session_destroy();

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

答案 1 :(得分: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,为什么?即使它在脚本结束之前不会被销毁,但当用户尝试前进到另一个受保护的页面时,它仍然会在系统中产生错误(它们将被注销)。