PHP用户登录失败处理

PHP用户登录失败处理,php,session,redirect,login,Php,Session,Redirect,Login,在应用程序的每个页面上,我都会检查用户是否登录。我最近意识到我的脚本结构不好,并做了一些修改。我想知道这个新方法是否为未登录的用户实现了正确的操作顺序 <?php ob_start(); session_start(); if ($_SESSION['loggedin'] !== true) { $_SESSION['messages'][] = '<li>User Not Logged In</li>'; session_write_close(

在应用程序的每个页面上,我都会检查用户是否登录。我最近意识到我的脚本结构不好,并做了一些修改。我想知道这个新方法是否为未登录的用户实现了正确的操作顺序

<?php
ob_start();
session_start();

if ($_SESSION['loggedin'] !== true) {
    $_SESSION['messages'][] = '<li>User Not Logged In</li>';
    session_write_close();
    ob_end_clean();
    header('Location: login.php');
    exit;
}
else {
    // execute page
}
?>

在此脚本之前,
ob_start()
调用位于登录检查部分的下方,因此会导致重定向问题,因为
session_start()
会生成自己的头


我还想知道脚本是否为登录检查提供了足够的安全性。

这部分代码是完整和安全的,但为了提高安全性,您需要提到几件事:在会话中放入“loggedin”等有价值的数据后,使用session\u regenate\u ID重新生成会话ID

我认为最好将IF部分放在函数上,而省略else部分,这样可以帮助代码更简单。您还可以删除以下行:

session_write_close();
ob_end_clean();

您不需要
ob_start()位于顶部,除非脚本在重定向之前向浏览器输出内容。您是否在页面中包含此脚本,并且在调用此脚本之前,包含脚本是否将输出发送到浏览器?@jeroen
session\u start()
默认情况下将输出到浏览器,因此我需要
ob\u start()
以确保执行
header()
调用。除了会话之外,在一开始就使用此脚本。否,如果标头已发送,则无法启动会话。这并不意味着
session\u start
正在发送标题。函数有意义<登录脚本中包含代码>会话\u重新生成\u id
。添加了
ob\u end\u clean()
,以防止向未经授权的用户输出任何数据。为什么要删除另一个?在执行任何操作之前,您必须检查身份验证。如果先检查一下,你就没有什么可隐瞒的了。