【问题标题】:User System Methods用户系统方法
【发布时间】:2011-04-11 19:12:06
【问题描述】:

我不知道以前是否有人问过这个问题,但我会解决它。

如果您要在 PHP 中创建一个允许用户注册和登录的系统 - 包括用户级别。您将如何完全创建这个系统。提醒自己关于会话,当小心会话时,你会做的最佳方法到底是什么——我的意思是在包括密码(当然是散列)、用户级别等时进行会话劫持。我发现自己在编写用户登录系统时,使用会话显示模块时这是一种糟糕的方法,如下所示:

if(isset($_SESSION['user']) && isset($_SESSION['user_level']))
{
    if($_SESSION['user_level'] == 3)
    {
        // show admin tools
    }
    elseif($_SESSION['user_level'] == 2)
    {
        // show moderator tools
    }
}

我什至用过这样的东西:

if(isset($_SESSION['user']) && !empty($_SESSION['user']))
{
    $sql = "SELECT user_id, username, user_level
            FROM members
            WHERE username = '" . $_SESSION['user'] . "'";

    $result = mysql_query($sql) or die(mysql_error());

    if(mysql_num_rows($result) == 1)
    {
        while($row = mysql_fetch_array($result))
        {
            $uid = $row['user_id'];
            $u_name = $row['username'];
            $u_level = $row['user_level'];
        }
    }
}

所以当我使用这样的东西时:

if($u_level == 3)
{
    // show admin tools
}

不是更好的例子吗?

【问题讨论】:

  • 您可以序列化用户对象并将其与提供用户 ID 一起散列。然后,您可以使用用户 ID 从数据库中检索它,并对其执行相同的序列化、哈希组合以检查匹配。此外,对于您的用户级别,请考虑使用更大的数字间隔。这允许在您已经拥有的用户之间插入不同的用户类型,例如管理员和版主类型之间的“超级版主”。
  • 序列化和散列用户对象?听起来是个坏主意……为什么要序列化东西的开销?无论如何,您都需要访问数据库来验证哈希...您能解释一下为什么序列化是个好主意吗?
  • 您可以考虑修改问题的标题,因为它涉及的注册和登录比用户权限/访问/会话控制要少。

标签: php login system


【解决方案1】:

这基本上很糟糕。这是我的工作:

我在$_COOKIE[] 数组中设置了一个随机 会话ID (sessionid)。我使用 cookie 是因为我将 ajax 与 php 一起使用,这(我觉得)让我的事情变得更容易一些。随意使用$_SESSION

然后我的数据库中有一个表告诉我:

  1. 此会话存在吗?
  2. 本次会议何时开始?
  3. 此会话上次与服务器通信是什么时候?
  4. 此会话属于哪个用户?
  5. 此会话绑定到哪个 IP 地址?

users 表告诉我用户的user level

请记住:您从 $_COOKIE 获得的任何东西都不是 100% 值得信赖的。因此,切勿将敏感信息放入其中。不应放入这些变量的示例:

  1. userid -- 您用于用户的内部 id(除非它是用于公众的,例如 SO userid)
  2. 用户特权/权限
  3. 其他会话信息,例如上次活动时间或登录时间

希望这会有所帮助,
jrh

【讨论】:

  • 一个好的提示是永远不要在会话中存储可变用户数据,只需使用UID,如果用户更改了一些配置文件数据并且您从会话中读取,用户将不会看到,直到他们重新登录,与权限相同,以防在用户会话期间授予权限,只需确保在每次加载时从数据库中提取它们.. 甚至在每次数据库更新后更新会话。
【解决方案2】:

简介

我个人不会尝试实施登录系统(安全性可能会出现很多问题)。许多聪明的人已经把这些知识放在一起来指定一个安全的登录(开源)系统。 如果您仍然想知道如何安全地实施这样的系统,我建议您查看OpenIDOAuth 规范和您的语言的实施。

  1. 身份验证(登录):OpenID
  2. 授权(授权权限):OAuth

引用YAHOO

虽然雅虎!使用 OpenID 作为 验证用户的机制, 雅虎!还使用 OAuth 进行授权 潜在敏感的许可 用户数据。

认证

引用OpenID

忘记密码?疲劳的 填写注册表? OpenID 是一种安全、快速、简单的 登录网站的方式。

我会亲自使用OpenID-consumer library,而不是从头开始创建一个(我尝试这样做,并且有很多输入/输出)。

就像 Stackoverflow 一样,您可以使用 OpenID 登录。这样您就不必自己将密码存储在数据库中,我认为这可以节省很多。

信息来源:

授权

您可以使用OAuth 进行授权(权限)

来自OAuth网站的引用

允许安全 API 的开放协议 简单而标准的授权 来自桌面和网络的方法 应用程序。

【讨论】:

  • 虽然这是一种创建用户登录的方法,但它不是对 OP 问题的回答。 OP 的问题更多地涉及会话管理和用户权限管理,而不是注册和登录。
  • 他的标题是“创建用户登录系统的方法”。然后他应该修改他的头衔。因为openid是一个用户登录系统。但我猜你有点对。我仍然认为这是安全专家的事情。很多用户给你不安全的建议。在我看来,这些 OpenID 库更安全。
  • OpenID 非常好。但是您仍然必须处理用户权限。
  • @Ryan 加上使用 Oauth 进行授权。我认为如果不付出很多努力,您自己就无法将其写得更好。
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
相关资源
最近更新 更多