【问题标题】:PHP best practice when redirecting unauthenticated users重定向未经身份验证的用户时的 PHP 最佳实践
【发布时间】:2015-04-10 22:18:12
【问题描述】:

好的,我已经看到了几种不同的重定向用户的方法,例如,当用户未登录或不允许查看页面并决定重定向时。

我将设置场景...假设,当用户提供了正确的用户名和密码时,会话变量$_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 看到内容。

【问题讨论】:

  • 好吧,我会检查会话值是否与某种用户 ID 相同,但我认为两者之间没有太大区别。
  • Surley 示例 2 使 //show content 代码更易于查看和阅读,因为它没有包含在 IF 中。除此之外,它们基本相同。
  • 警告! @Goudgeld1 我没这么说:) 出口非常重要,但它也不是完美的编码风格。 header() 函数仅对浏览器有用(!),解析您的应用程序的非浏览器工具将能够覆盖浏览器重定向,因此对您的应用程序做坏事(=尝试卷曲页面,它会继续没有接受 header() 重定向)。
  • @Sliq O... 误读了。我认为这并不重要,但在阅读了header manual 之后,你是对的:P。即使过了这么多年,总有东西要学!
  • 感谢所有的 cmets...当有人说不要使用 exit() 大声笑时,我的胃确实有点转,但幸运的是 @Goudgeld1 清除了那个大声笑...我使用记事本++作为我的“IDE”(如果你可以这样称呼它)所以代码着色在那里不是问题......所以我想我会继续使用第一个例子,只是出于恶意,这样我就不必重新-将所有内容编码为标准化:/ ...即使我现在更喜欢第二个示例... :( ...也许有一天我会做到的,哈哈

标签: php session redirect


【解决方案1】:

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

这两个例子都可以,最大的不同是第一个例子看起来确实更安全。但两者都做同样的事情。 在第一个示例中,您只需要考虑一件事:

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

您必须回显所有内容。某些 IDE 不支持 PHP 回显函数内的 HTML 着色。

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

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

header(); 之后,页面被关闭,因此使用第二个示例没有“真正的”危险。 如果您想了解更多详细信息,请阅读header manual(如果您还没有的话)。

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

附言对不起我的英语不好

【讨论】:

  • 很酷,感谢您对它的投入,是的,我真的应该再次阅读标题手册 Lol ...我之前只是略过它...正如我在上面的 cmets 中所说,我现在确实更喜欢第二个例子,但我想我会等到我重新编码所有东西......我现在太深了哈哈......再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2011-01-19
  • 2014-01-23
  • 2013-01-17
  • 2014-06-23
相关资源
最近更新 更多