Php 用户系统方法

Php 用户系统方法,php,login,system,Php,Login,System,我不知道以前是否有人问过这个问题,但我会继续问下去 如果您要用PHP创建一个允许用户注册和登录的系统,包括用户级别。您将如何完整地创建此系统。提醒自己关于会话,当小心处理会话时,最好的方法是什么?我指的是会话劫持,包括密码(当然是散列)、用户级别等等。我发现自己在编写用户登录系统代码时,使用会话来显示模块是一种糟糕的方法,如下所示: if(isset($_SESSION['user']) && isset($_SESSION['user_level'])) { if($_

我不知道以前是否有人问过这个问题,但我会继续问下去

如果您要用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
}
我甚至用了这样的东西:

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
}
所以当我使用这样的东西时:

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
}

这是一个更好的例子,不是吗?

这基本上是不好的。我是这样做的:

我在
$\u COOKIE[]
数组中设置了一个随机会话id(
sessionid
)。我之所以使用cookie,是因为我将ajax与php结合使用,这(我觉得)让我的工作变得更轻松。请随意使用
$\u会话

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

  • 这个会话存在吗
  • 这节课什么时候开始的
  • 此会话上次与服务器对话是什么时候
  • 此会话属于哪个用户
  • 此会话绑定到哪个IP地址
  • 用户表告诉我用户的
    用户级别

    记住:你从$_COOKIE得到的任何东西都不是100%可信的。所以千万不要把敏感的信息放在里面。不应在这些变量中添加的内容示例:

  • userid——您为用户使用的内部id(除非它是面向公众的,比如SO userid)
  • 用户权限/权限
  • 其他会话信息,如上次活动时间或登录时间
  • 希望这有帮助,
    jrh

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

  • 身份验证(登录):
  • 授权(授权权限):
  • 引自

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

    认证 引自

    记不起你的密码了吗?疲倦的 填写登记表的时间? OpenID是一种安全、快速、简单的 登录网站的方式

    我个人会使用一个,而不是从头开始创建一个(我尝试过这样做,有很多IN/out)

    就像Stackoverflow一样,您可以使用OpenID登录。这样你就不必自己将密码存储在数据库中,在我看来这是一个很大的节约

    资料来源:

    授权 您可以用于授权(权限)

    现场报价

    允许安全API的开放协议 以简单、标准的方式进行授权 方法从桌面和web 应用程序


    您可以序列化用户对象,并在提供用户id的同时对其进行散列。然后,您可以使用用户id从数据库中检索该对象,并对其执行相同的序列化、散列组合以检查是否匹配。另外,对于用户级别,考虑使用更大的数字间隙。这允许在您已有的用户类型之间插入不同的用户类型,例如在管理员和版主类型之间插入“超级版主”。是否序列化并散列用户对象?听起来是个坏主意。。。为什么要增加序列化的开销?无论如何,您都需要点击数据库来验证哈希。。。你能解释为什么序列化是一个好主意吗?你可以考虑修改你的问题的标题,因为它处理注册和登录比用户权限/访问/会话控制少。一个好的提示是永远不要在会话中存储变量用户数据,只需使用<代码> UID < /代码>,如果用户更改了某些配置文件数据以及您从会话中读取的数据,则用户在重新登录之前不会看到这些数据,与权限相同,如果在用户会话期间授予了权限,请确保每次加载时都从DB中提取这些数据。。虽然这是一种创建用户登录的方法,但并不是对OP问题的回答。OP的问题更多地涉及会话管理和用户权限管理,而不是注册和登录。他的标题是“创建用户登录系统的方法”。然后他应该修改他的头衔。因为openid是一个用户登录系统。但我想你说得有点对。我仍然认为这是安全专家的事情。很多用户给你不安全的建议。在我看来,这些OpenID库更安全。OpenID非常好。但是您仍然需要处理用户权限。@Ryan plus使用Oauth进行授权。我认为如果你不努力,你自己写不出更好的作品。