Php 实施";“记住我”;特征

Php 实施";“记住我”;特征,php,session,Php,Session,基本上,我有一个带有基本会话功能的登录系统,它在浏览器关闭时超时。我一直收到关于这方面的投诉,因此我希望能够让一些人点击“记住”勾选,让他们的会话持续30天。例如,在设置$\u会话['user\u id']的同时设置cookie。像这样: $token = hash('md5',$_SESSION['user_id'] . time() . 'salt'); setcookie('token', $token, time() + (3600 * 24 * 30)); setcookie('use

基本上,我有一个带有基本会话功能的登录系统,它在浏览器关闭时超时。我一直收到关于这方面的投诉,因此我希望能够让一些人点击“记住”勾选,让他们的会话持续30天。

例如,在设置
$\u会话['user\u id']
的同时设置cookie。像这样:

$token = hash('md5',$_SESSION['user_id'] . time() . 'salt');
setcookie('token', $token, time() + (3600 * 24 * 30));
setcookie('user_id', $_SESSION['user_id'], time() + (3600 * 24 * 30)); // Cookie expires in 30 days
在用户id行的DB中保存
$token

然后为保存了cookie的用户设置
$\u会话['user\u id']
,这样他们就不必以正常方式登录:

if (!isset($_SESSION['user_id']) {

    if (isset($_COOKIE['user_id']) && isset($_COOKIE['token']) {

       $saved_token = SELECT token FROM users table WHERE userID = $_COOKIE['user_id'];
         if ($_COOKIE['token'] == $saved_token) { 
         $_SESSION['user_id'] = $_COOKIE['user_id'];
       } else log out
       }
}  else log out
}
}

也许这在安全方面效果更好?

正如所说的,这可以通过cookie实现。有很多方法,但良好的方法对于安全是必要的。我还记得,在Orkut,一个早已消亡的社交网站上,你可以让用户运行一些脚本,窃取他的cookies和viola,即使用户已经注销,这个帐户也是你的

因此,这里有一个最佳方法

  • 在用户上创建一个cookie,用户id加上一些盐,调用 它是用户令牌

  • 在数据库中存储令牌及其所属的用户及其 有效期

  • 现在,当用户使用cookie进行访问时,只需检查数据库中是否存在哈希,然后让访问者登录即可

  • 当用户注销时,只需从数据库中删除该令牌


()

将cookie设置为la@j08691的链接(虽然不是这样,因为在大多数情况下cookie是由PHP生成的,而不是由站点设置的)。但是,如果用户关闭浏览器并将浏览器设置为删除所有Cookie,则在这种情况下,您无法执行太多操作。可能重复用户注销时请记住删除Cookie,如果服务器理解,信任并将其膨胀到会话中。因此,我要做的只是在您的站点上模拟用户,提交一个具有有效用户id的cookie?这并不重要;我仍然可以很容易地模拟你的一个用户。嗯,我有4套cookie需要匹配…你需要先登录才能获得它们。你的问题是什么?嗯。可能吧(尽管实际的会话ID计算与问题无关,与复杂性和稀有性无关)。这或多或少是一个会话标识符,所以我想知道,既然我们已经在PHP中内置了一个并行会话标识符,为什么还要创建一个并行会话标识符。因为会话不是持久性cookie?所以请使用会话ID并将其持久化到DB表中。@JaredFarrish:这只是另一种方法,在PHP中有很多方法可以生成唯一的id,这是我们唯一需要的。不要忘记PHP的
uniq_id()
?您可以使用自定义会话标识符启动会话,其中
uniqid()
是创建会话的一种方法。然而,我的观点是,为什么要双重责任和“两个”?因此,要么保留PHP生成的初始会话标识符,要么创建一个,但使用它来膨胀会话并引用会话。在某些情况下,在某些共享环境中独立验证会话需要一秒钟的时间。此外,添加到饼干中也是一个好主意。