我知道这个问题可能会被问过很多次,但是大多数建议您存储ip + username + password并对整个内容进行哈希处理并进行比较,相反,我为我的网站提出了另一种解决方案,我想这样做:
我正在使用会话存储用户名,用户ID,时区偏移量等,现在假设我们说一个用户登录并且他检查了我的记忆,我将设置会话,然后生成一个可变的唯一ID,该ID会随机存储12-13位数字ID设置此项,我将使用其唯一的ID和用户名在他的浏览器上创建一个cookie,并将其存储在我的数据库中,当他回来时,我将检查是否设置了id和用户名cookie(如果是),而不是从数据库中选择用户名,记得我其中username = cookie用户名,然后再次设置会话并将其扔到主页上,否则重定向到登录页面。
如果他注销,我将删除所有cookie,并在他选择记住并登录后更新唯一值。
这样做有什么问题吗?或更好的方法呢?我不希望将密码保存在cookie中,即使处于散列状态也是如此。或者这样做是完美的吗?
因此,据我所知,当用户登录(并希望保持永久登录)时,请执行以下操作:
创建一个随机令牌。
将随机令牌保存在该用户的用户数据库记录中(或保存在包含用户名和令牌的单独表中)。
在用户浏览器上设置包含用户名和令牌的cookie。
当用户返回并且没有活动的会话,但是确实具有上面设置的cookie时,您可以在数据库中查找其用户名。如果数据库包含该用户的"记住我"令牌,并且该令牌与cookie中的令牌匹配,则为该用户创建一个新会话。
当用户注销时,可以从其浏览器中删除cookie,也可以从数据库中删除令牌。
如果是这样,那是一个非常安全的设计,只要令牌足够长并且由安全的随机数生成器(例如Unix上的/dev/urandom)生成即可。您说令牌的长度为" 12-13位数字",相当于40位多一点。这有点偏低,我建议至少加倍。另外,您不会说如何生成令牌;仅使用PHP的rand或mt_rand是不安全的,因为它们的输出可能是可预测的。
我还建议进行两项改进:首先,在将令牌存储到数据库之前对令牌进行哈希处理(任何加密哈希函数都可以,例如具有长随机令牌的SHA-1,您不需要任何特殊的密码哈希函数,例如PBKDF2),以便设法复制数据库的攻击者不会获得所有令牌。其次,在数据库中包括令牌的到期日期,以使单个被破坏的令牌不会永远保持有效。
回答我一直在寻找的东西,很完美,这是简单的解释,顺便说一句,我正在使用mt_rand和rand来生成10位随机用户ID,因此我可以使用mt_rand,然后使用sha1哈希该值并将其存储在数据库中,并且也在cookie上...谢谢;)
散列mt_rand的输出不会使它的可预测性变差:如果可以预测散列的输入,就可以预测输出。 (这可能会使攻击者仅通过观察输出来推断状态变得更加困难,但这在很大程度上取决于散列的完成方式。)您应该使用例如openssl_random_pseudo_bytes代替。
谢谢,但是不会那么保护它,除非直到我使我的网站流行为止,直到jsut crypting mt_rand暂时可以工作为止;)再次感谢您,这是一个简单的解释,我因提到哈希令牌而获得+1,因此,现在在对令牌进行哈希处理之后,字符串的长度将为40位数字(默认为SHA1)
对我来说,这听起来很像"除非船上有更多乘客,否则我不会堵塞船上的泄漏物"。从一开始就正确地进行此操作并不困难,而与通过mt_rand进行合并所必须要做的工作相比。但是,嘿,不管漂浮在你船上的(或不漂浮)... :)
哈哈,这很酷,我正在建造一艘Biggy船,很快就会有票...;)所以我的方式或多或少是正确的,只是我需要to脚...
您无需在Cookie中存储用户名和/或密码。您只需要存储一个唯一的标识符(随机生成)即可将其与数据库中的哈希会话标识符进行比较。
是的,这就是我的意思,说一个唯一的ID /哈希值40位数的字符串不适当地存储在我的数据库中,作为一个Rememberme_id字段,当他回来时不适比较吗?顺便说一句,如果说如果两个用户共享一个共同的哈希ID,那又是什么呢?最好将用户名保存在其他Cookie中,以便我可以比较用户名=用户名和记住我ID =哈希ID而不是通过失败
无论如何,您都需要在每个请求上寻找有效的会话ID。选项"记住我"应该仅向会话添加标志以定义更长的到期时间;
抱歉,没有到达这里标记什么?假设如果我使用session_id获得会话ID,那么接下来呢?您可以通过编辑答案来解释我吗?
不要为此使用PHP内置会话。您需要使用自己的会话系统(cookie +数据库),以便可以完全控制到期时间。
简而言之,我将创建一个sessionid cookie,并将该id存储在我的数据库中,当他回来时,我将检查该cookie是否存在,然后将它与数据库进行比较(如果是的话),然后再次设置会话变量,并将其重定向到他的主页或其他登录页面对?