2011-03-14 91 views
2

什么是安全认证用户的最佳方式?安全认证用户的最佳方式是什么? (session,cookies,php,mysql)

到目前为止,我在想:

  • 生成每个成功的登录和储存$logged = md5($hashed_password.$SALT)到数据库中随机$SALT;在注销时删除。
  • $logged存储到cookie中(如果用户选中“记住我”)。设置$_SESSION['user'] = $logged;
  • 访问:检查是否设置了$_SESSION['user'];如果没有,检查cookie,如果数据不匹配,重定向到login页面。

有什么风险?

+0

http://stackoverflow.com/questions/549/the-definitive-guide-to-website-authentication#477579 – sdadffdfd 2011-03-14 07:15:32

+0

仍然存在这样的问题:如果用户删除了他们的cookies,该怎么办? – Krii 2016-02-10 13:14:22

回答

2

我可以看到你现有的框架(我不喜欢)唯一的问题是有可能发生碰撞$logged

两个有效的用户登录导致相同的散列在数学上是不可能的。所以我会确保开始在Cookie中存储用户id或其他一些独特的信息。

您可能还希望保留数据库中的$logged时间的时间戳,以便您可以运行超过x天/周的清理查询。

+1

碰撞不是问题,因为我可以在保存数据库之前检查数据库,并生成另一个盐,直到我打开一个空白点。感谢您指出了这一点。 – sdadffdfd 2011-03-14 05:37:30

0

第一步有点矫枉过正,因为这是$_SESSION['foo']在会话的整个生命周期中基本上都是客户端。我只是为每个用户存储一个盐渍和散列的密码,然后用日期或其他伪随机因素腌制。

如果用户清除cookie或会话过期,则设置cookie可能无用。这将使用户登录(根据您的数据库),但实际上他们不是。

我会坚持只是$_SESSION['foo']和cookie,并使数据库退出登录过程。

+0

您将如何验证用户并“将数据库退出登录过程”?你有点...必须以某种方式检查他的密码..,检查用户是否在第二次访问时在计算机上登录,并在他通过身份验证后获取用户的信息... – sdadffdfd 2011-03-14 06:54:25

+0

你提到你想存储散列暂时在你的数据库中腌制密码并删除它们。你仍然需要密码(salted和哈希值,我假设?如果不是,我只是在数据库中使用'md5(username + password + global_salt)''),但不要将数据库用于临时事物喜欢这个。这就是'$ _SESSION ['foo']'的用途。 – Blender 2011-03-14 16:37:09

0

在第一点你提到它创建随机盐字符串时,用户登录并清除它,当用户注销。

  1. 主要问题是你必须检查SALT串在页面的每个重定向存在与否。所以它会在数据库服务器中创建大量流量

  2. 是的,这对于已经登录或没有登录的用户非常有用。

  3. 但在断电的情况下在客户端计算机上登录时,盐串很长一段时间后留在数据库之后。

第二点指向cookie中的用户身份验证,它不安全。客户端可以很容易地在浏览器中显示身份验证Cookie

第三点在会话中存储身份验证意味着在服务器端创建会话变量并将其存储在服务器端的文件中。这是非常安全的,然后将它存储在cookie中。

身份验证的最佳方式是您提到的组合点号1和3。

  1. 您可以检查用户已经登录其他电脑或不是?
  2. 如果会话不存在,您可以轻松清除SALT字符串。
  3. 您可以轻松地在PC电源故障的情况下管理登录
1

首先不需要做

Store $logged into a cookie (If user checked "remember me") 

启动会话应该是你应该做的地方session_start()在索引顶部的第一件事.php(执行的文件)。这样,默认情况下,在用户浏览器上创建cookie名称“phpsessid”,而不管天气用户是否登录。这个cookie的值是唯一的,您可以在登录后识别用户。因此,您不需要为此创建任何其他cookie。

+0

so ..如果用户检查“记住我”,登录并重新启动浏览器会发生什么?我认为他会注销 – sdadffdfd 2011-03-14 06:18:08

+0

是的,你是正确的浏览器删除cookie phpsessid(通过哪个php标识用户),你可以手动测试删除“phpsessid”,你将在刷新时登录。 – 2011-03-14 06:21:12

+0

正是:) ....我假设,如果用户检查“记住我”,他想要登录一次,并保持数小时,数天,数周......直到他决定退出。我没有看到任何其他方法,但在用户的机器上存储了唯一的令牌。 – sdadffdfd 2011-03-14 06:24:29

0

我可以看到一个问题 - 您的解决方案听起来很烦人的人在同一时间在多个浏览器中加载您的网站。

相关问题