我有一个简单的web应用程序,我所做的是登录页面和主页都在一个页面。以下是场景:
#PHP login script goes here inc. Database config and Authentication
if(!login()) {
<html>
<head>
<title>Homepage</title>
<css goes here>
<js goes here>
<body>
[ Login form goes here ]
</body>
</html>
} else {
#PHP main page script goes here inc. Database config and Authentication
<html>
<head>
<title>Homepage</title>
<css goes here>
<js goes here>
<body>
[ Main page if it is login ]
</body>
</html>
}
我的问题是,这样切而不是重定向到不同的/成功页面是可取的吗?它会影响速度、安全性或脆弱性吗?
如果您的表单也发送到index.php
,则可能存在漏洞。
这是因为它在以下场景中很容易受到影响:
- Alice登录,然后查看您登录的主页的任何新闻。
- Alice登录会话超时。
- Alice去吃午饭。 Carol加载浏览器的开发人员工具,然后点击刷新。
- 浏览器重新提交来自登录表单的POST数据。
- 用户名和密码在浏览器工具中可见,Carol会记下这些工具,以便以后恶意使用。
这是一个示例场景,这就是OWASP建议在登录后总是重定向的原因,因为这可以防止POST数据被缓存在浏览器中。
在上面的例子中,Carol可以简单地在Alice认为已经超时的会话更新后执行攻击,或者即使Alice明确地注销了,Carol也可以点击回到登录的主页并刷新,并且在这种情况下POST数据也会刷新。
但是,如果您重定向用户,即使到同一页面,由于没有HTTP 200响应,登录凭据将不会被缓存
这没有安全风险。(基本)
然而,这是非常不可取的,因为这是不好的做法。如果你正在独自开发一个小项目/应用,那么如果它的外观不会打扰你,那么你可以使用这种方法。
查看您提供的示例代码,我看到您已经使用login()函数来确定是否有人已登录。我会改变这个函数(或创建一个新的),这样如果用户没有登录,它将发送一个头重定向到login.php页面,并终止脚本。
这样,你就不必在应用程序的每个页面上都使用IF ELSE了。
function CheckLogin(){
// do your login checks here, if user is not logged in, redirect to login.php
header('location: http://mysite.nl/login.php');
die(); // terminate the entire script.
}
一个页面看起来像:
<?php
//PHP login script goes here inc. Database config and Authentication
CheckLogin(); // ^^^^^^ The CheckLogin() function was included from there ^
// Contents of the page, wether it be home, a photoalbum or anything you can imagine!
?>
在登录页面上,您可能希望删除CheckLogin()函数。