重定向未经身份验证的用户时的PHP最佳实践


PHP best practice when redirecting unauthenticated users

好的,所以我看到了几种不同的方法来重定向用户,例如,当他们没有登录,或者不允许查看页面,并决定重定向时。

我来布置场景。。。比方说,当用户提供了正确的用户名和密码时,就会创建会话变量$_SESSION['loggedin']。现在,当这个用户转到logged_in_users_only.php时,他可以很高兴地看到页面。但是,还没有登录的Danger Jim出现了,他转到logged_in_users_only.php,然后被重定向回主页(可能有警告)

所以。以下是我看到的两种主要方法,我想知道它们中的任何一种是否具有安全隐患,或者是否可以以某种方式允许Danger Jim看到logged_in_users_only.php页面的

示例1

if(session_status()==PHP_SESSION_NONE) {
    session_start();
}
if(isset($_SESSION['loggedin'])) {
    //show content
} else {
    header('Location: home.php');
    exit;
}

示例2

if(session_status()==PHP_SESSION_NONE) {
    session_start();
}
if(!isset($_SESSION['loggedin'])) {
    header('Location: home.php');
    exit;
}
//show content

就我个人而言,我一直采用第一种方法。我认为这是因为代码似乎很好地"被困"在括号里(也许我只是喜欢这样看,哈哈)。

但我很想知道示例2是否可以永远让Danger Jim看到内容。

我认为这是一个很好的问题,所以我会尽力给出一个好的答案!

这两个例子都会起作用,最大的区别是在第一个例子中看起来确实更安全。但两者都做同样的事情。在第一个例子中,你只需要考虑一件事:

if(session_status()==PHP_SESSION_NONE) {
    session_start();
}
if(isset($_SESSION['loggedin'])) {
    echo "logged in!";
} else {
    header('Location: home.php');
    Exit;
}

你必须回应你所有的内容。有些IDE不支持PHP echo函数内部的HTML着色。

我个人使用第二个例子,因为我的IDE不支持PHP字符串中的代码着色。

if(session_status()==PHP_SESSION_NONE) {
    session_start();
}
if(!isset($_SESSION['loggedin'])) {
    header('Location: home.php');
    Exit;
}

header();之后,页面将关闭,因此使用第二个示例不会有"真正的"危险。如果你想要更多的细节,如果你还没有阅读标题手册,你应该阅读。

祝你的代码好运,我希望我们stackoverflow能帮助你成为一名更好的程序员。他们帮了我很多:)

p.s.抱歉我的英语不好