2008-12-31 85 views
18

我正在开发一个基于PHP的登录系统。 每个用户都有一个ID(一个数字)和一个密码,它被存储为一个盐味散列。使用Cookies和盐渍哈希的PHP登录系统

我能够弄清楚登录是否成功,但现在我需要在某处存储该信息(以便用户不会永久注销)。

在过去,我玩过$ _SESSION变量。但是,当用户离开浏览器时,这些似乎被删除,这是不希望的。 此外,我不能“假设”用户不会试图欺骗系统,所以它必须是安全的。

所以,这里是我的问题:

  1. 我应该使用$_SESSION$_COOKIE?每种方法的主要优点是什么?
  2. 如何实现'记住我'复选框?
  3. 哪些信息应该存储在session/cookie变量中?

请注意,在这个特定问题中没有考虑到数据库安全问题。

关于3号,我的意思到底是:

  • 我应存储ID和在cookie /会话的用户的散列密码,或
  • 我应存储ID和非如果我存储了“SessionID”,“ID”或者“ID”,那么我应该存储一个“SessionID”和密码(散列或非散列?)或者
  • 。和密码(再一次,哈希或非哈希)?

我想保持我的网站安全,但有效和用户友好的尽可能。 如果采用基于SessionID的方法,那么我还要感谢关于如何将其存储在数据库中的一些解释。

预先感谢您

编辑:叶兰的和Brian的回答结合似乎是我所需要的。不幸的是,我只能将其中的一个标记为已接受。我会尽力去实施,看看哪一个更有用。

+0

您应该尽可能重新使用现有的身份验证框架,因为它是*复杂的*。例如,看看https://github.com/delight-im/PHP-Auth – caw 2016-07-13 00:12:52

回答

9

我想重申Eran的观点从来没有存储用户密码甚至会话或cookie数据中密码的散列。

一般来说,我已经在使用Cookies的web应用程序中实现记住我的功能。有关构建“安全”持续登录系统的信息的好地方是blog post on the fishbowlanother Stack Overflow answer已经涵盖了深入的答案。

如果您需要确保登录是安全的,您必须使用https。这是因为如果Cookie或会话未加密,它们可能会被盗用。

另一个好的做法是遵循2级登录系统。您可以在亚马逊这样的网站上看到这一点,您可以在没有登录的情况下将东西添加到您的购物车中,但如果您想以某种方式结账或修改您的帐户,则必须重新输入密码。

+1

这篇后续文章将其提升到了一个新的层次:http://jaspan.com/improved_persistent_login_cookie_best_practice – jmucchiello 2008-12-31 21:28:18

8

对于敏感信息(即认证结果)只使用会话。会话存储在服务器端,不太可能受到威胁。

关于会话生存期,默认值是浏览器会话的生命周期 - 但您可以控制它。有几个设置影响到:

session.gc_maxlifetime - 有效地控制会话的生存期。

session.gc_probability和session.gc_divisor一起决定会话垃圾回收的发生频率。

上次会话。cookie_lifetime控制会话cookie(包含会话ID的cookie,因此不必通过URL进行传输)的生存期。它应该匹配session.gc_maxlifetime的值。

此外,从不在会话或cookie中存储密码(即使以散列格式)。只是认证的结果。

0

将标识存储在$ _SESSION中,但不存储散列或非​​散列密码。一旦用户登录并且ID保存在$ _SESSION中,则不再需要密码。