我是php的新手,很难建立正确的会话管理。控制以防止未经授权访问我的网站的特定部分。我举一个例子。。。
myimaginarysite.com/application/index.php有一个表单来对用户进行身份验证,在成功进行身份验证后,它会将您重定向到"portal.php"portal.php"将作为include的一部分检查有效会话,然后在此基础上通过header("location….")将u发送回身份验证或者只是加载HTML内容。现在,如果未经授权的用户直接点击"portal.php"。。因为他们没有有效的会话。。它们将被重定向回索引,但是,如果你代理流量,你会看到"portal.php"的整个HTML内容在重定向回登录页面之前实际上会被发送到客户端(尽管没有显示在浏览器上)。所以我的问题是……我是不是遗漏了什么,有没有办法确保HTML内容被抑制,并且不会发送到客户端??
下面是我为"portal.php"编写的代码片段
<?php
include "includes/checksession.php";
?>
<html>
<body>
<a href="../status.php">Who Am I ??</a>
<br></br>
<a href="../logout.php">Log Off</a>
.....bunch of authenticated content.....
</body>
</html>
使用die()
或exit()
发送重定向标头后,需要停止脚本执行。标头重定向仅设置http标头,否则页面内容是相同的,除非您另有指示。
像Juhana建议的那样,停止脚本执行可能是目前最简单的解决方案,但当然还有其他可能性。您可以将输出设为条件:
<?php
if (checkSession())
{
// redirect to login page
}
else
{
// output HTML.
}
如果你的网站变得更大,它可能(希望)也会更结构化。如果是这样,那么包含其他页面片段可能会更容易。所以你的代码一开始可能是这样的:
if (!checkSession())
{
include 'loginpage.php';
}
else
{
include 'portalpage.php';
}
最终可能:
if (!checkSession())
{
ApplicationContext.setController(new LoginPageController());
}
无论在何种情况下,exit
都能很好地工作,可能很有用,尤其是对于这样的情况,但它无疑会终止您的脚本,因此它可能会妨碍您可能想要包括的其他进程,如调试输出或日志记录、评测等。