PHP登录页面和首页放在一个页面中,是否可取


PHP Login page and home page in single page, is it advisable?

我有一个简单的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,则可能存在漏洞。

这是因为它在以下场景中很容易受到影响:

  1. Alice登录,然后查看您登录的主页的任何新闻。
  2. Alice登录会话超时。
  3. Alice去吃午饭。
  4. Carol加载浏览器的开发人员工具,然后点击刷新。
  5. 浏览器重新提交来自登录表单的POST数据。
  6. 用户名和密码在浏览器工具中可见,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()函数。