如何安全实现“记住我”的功能

如题所述

第1个回答  2016-12-10
  PHP永久登录、记住我功能实现方法和安全做法 这篇文章主要介绍了PHP永久登录、记住我功能实现方法和安全做法,本文着重讲解用数据库实现更安全的永久登录、记住我功能,需要的朋友可以参考下   永久登录指的是在浏览器会话间进行持续验证的机制。换句话说,今天已登录的用户明天依然是处于登录状态,即使在多次访问之间的用户会话过期的情况下也是这样。永久登录的存在降低了你的验证机制的安全性,但它增加了可用性。不是在用户每次访问时麻烦用户进行身份验证,而是提供了记住登录的选择。   据我观察,最常见的有缺陷的永久登录方案是将用户名和密码保存在一个cookie中。这样做的诱惑是可以理解的——不需要提示用户输入用户名和密码,你只要简单地从cookie中读取它们即可。验证过程的其它部分与正常登录完全相同,因此该方案是一个简单的方案。   不过如果你确实是把用户名和密码存在cookie中的话,请立刻关闭该功能,同时阅读本节的余下内容以找到实现更安全的方案的一些思路。你将来还需要要求所有使用该cookie的用户修改密码,因为他们的验证信息已经暴露了。   永久登录需要一个永久登录cookie,通常叫做验证cookie,这是由于cookie是被用来在多个会话间提供稳定数据的唯一标准机制。如果该cookie提供永久访问,它就会造成对你的应用的安全的严重风险,所以你需要确定你保存在cookie中的数据只能在有限的时间段内用于身份验证。   第一步是设计一个方法来减轻被捕获的永久登录cookie造成的风险。尽管cookie被捕获是你需要避免的,但有一个深度防范流程是最好的,特别是因为这种机制即使是在一切运行正常的情况下,也会降低验证表单的安全性。这样,该cookie就不能基于任何提供永久登录的信息来产生,如用户密码。   为避免使用用户的密码,可以建立一个只供一次验证有效的标识:   代码如下:      $token = md5(uniqid(rand(), TRUE));   ?>   你可以把它保存在用户的会话中以把它与特定的用户相关联,但这并不能帮助你在多个会话间保持登录,这是一个大前提。因此,你必须使用一个不同的方法把这个标识与特定的用户关联起来。   由于用户名与密码相比要不敏感一些,你可以把它存在cookie中,这可以帮助验证程序确认提供的是哪个用户的标识。可是,一个更好的方法是使用一个不易猜测与发现的第二身份标识。考虑在保存用户名和密码的数据表中加入三个字段:第二身份标识(identifier),永久登录标识(token),以及一个永久登录超时时间(timeout)。    代码如下:   mysql> DESCRIBE users;   +------------+------------------+------+-----+---------+-------+    Field Type Null Key Default Extra   +------------+------------------+------+-----+---------+-------+    username varchar(25) PRI    password varchar(32) YES NULL    identifier varchar(32) YES MUL NULL    token varchar(32) YES NULL    timeout int(10) unsigned YES NULL   +------------+------------------+------+-----+---------+-------+   通过产生并保存一个第二身份标识与永久登录标识,你就可以建立一个不包含任何用户验证信息的cookie。   代码如下:      $salt = 'SHIFLETT';   $identifier = md5($salt . md5($username . $salt));   $token = md5(uniqid(rand(), TRUE));   $timeout = time() + 60 * 60 * 24 * 7;   setcookie('auth', "$identifier:$token", $timeout);   ?>   当一个用户使用了一个永久登录cookie的情况下,你可以通过是否符合几个标准来检查:    代码如下:      /* mysql_connect() */   /* mysql_select_db() */   $clean = array();   $mysql = array();   $now = time();   $salt = 'SHIFLETT';   list($identifier, $token) = explode(':', $_COOKIE['auth']);   if (ctype_alnum($identifier) && ctype_alnum($token))   {   $clean['identifier'] = $identifier;   $clean['token'] = $token;   }   else   {   /* ... */   }   $mysql['identifier'] = mysql_real_escape_string($clean['identifier']);   $sql = "SELECT username, token, timeout   FROM users   WHERE identifier = '{$mysql['identifier']}'";   if ($result = mysql_query($sql))   {   if (mysql_num_rows($result))   {   $record = mysql_fetch_assoc($result);   if ($clean['token'] != $record['token'])   {   /* Failed Login (wrong token) */   }   elseif ($now > $record['timeout'])   {   /* Failed Login (timeout) */   }   elseif ($clean['identifier'] !=   md5($salt . md5($record['username'] . $salt)))   {   /* Failed Login (invalid identifier) */   }   else   {   /* Successful Login */   }   }   else   {   /* Failed Login (invalid identifier) */   }   }   else   {   /* Error */   }   ?>   你应该坚持从三个方面来限制永久登录cookie的使用。   1.Cookie需在一周内(或更少)过期   2.Cookie最好只能用于一次验证(在一次成功验证后即删除或重新生成)   3.在服务器端限定cookie在一周(或更少)时间内过期   如果你想要用户无限制的被记住,那只要是该用户的访问你的应用的频度比过期时间更大的话,简单地在每次验证后重新生成标识并设定一个新的cookie即可。   另一个有用的原则是在用户执行敏感操作前需要用户提供密码。你只能让永久登录用户访问你的应用中不是特别敏感的功能。在执行一些敏感操作前让用户手工进行验证是不可替代的步骤。   最后,你需要确认登出系统的用户是确实登出了,这包括删除永久登录cookie:   复制代码 代码如下:      setcookie('auth', 'DELETED!', time());   ?>   上例中,cookie被无用的值填充并设为立即过期。这样,即使是由于一个用户的时钟不准而导致cookie保持有效的话,也能保证他有效地退出。

如何安全实现“记住我”的功能
第一步是设计一个方法来减轻被捕获的永久登录cookie造成的风险。尽管cookie被捕获是你需要避免的,但有一个深度防范流程是最好的,特别是因为这种机制即使是在一切运行正常的情况下,也会降低验证表单的安全性。这样,该cookie就不能基于任何提供永久登录的信息来产生,如用户密码。 为避免使用用户的密码...

如何在浏览器上设置记住我的设置?
+ 选择“设置”,然后滚动到页面底部,点击“高级”。+ 在“隐私和安全”部分,点击“内容设置”。+ 找到“Cookies”选项,确保它是开启的。如果需要,还可以调整其他相关设置。Mozilla Firefox:+ 打开Firefox,点击右上角的三个横线菜单图标。+ 选择“选项”,然后在左侧菜单中选择“隐私与安全”。+ ...

如何允许一个网页记住我的个人信息?
一、打开控制面板 二、找到“网络和Internet”,双击打开 三、Internet选项——隐私——安全级别设置为:接受所有Cookies。四、点开替代自动cookie,接受所有,点击确定。

如何实现“记住我的登录状态”的功能
将用户信息存入cookie中,对cookie设置过期时间。

如何实现“记住我的登录状态”的功能
你可以使用ie浏览器打开页面,在弹出的保存密码提示框中选择“是”即可。

如何让电脑记住我的用户名
1、现在你点本窗口的菜单栏里的“工具”2、点击里面的“INTERNET选项”3、在出来的窗口上点击“内容”4、在这里的的“个人信息”里点“自动完成”5、把三个选项全打上对勾,“确定”退出即可。

关于【记住我的凭据】,老是记不住!!
上面的说法都是骗人的!!真正的原因是IE默认禁止了表单的自动完成功能,要解决这个问题需要下面的步骤:1、打开IE 的Internet选项,点击“安全”;2、点击进入“自定义级别”;3、拉到最下面,将“用户身份验证”下的“自动使用当前用户名和密码登录“选择上即可。之后,确定后,退出IE,重启电脑 即解决...

怎么让app记住密码?
首先,要让App记住密码,通常的做法是使用“记住我”或“保持登录状态”的功能,结合安全的数据存储机制来实现。当用户首次登录App时,可以选择启用“记住我”的选项。这个选项背后通常涉及到两个关键步骤:一是将用户的登录凭据保存在设备的本地存储中,如手机的内存或专用...

如何让浏览器记住我的密码
三、360安全浏览器:由于360安全浏览器是基于IE内核的,因此其设置保存密码的方法与IE类似。对于其它浏览器设置保存密码的方法和原理同上,大家可以自已进行设置。网页自动记住用户名和密码的方法就详细给大家介绍到这里。让网页记住用户名和密码具有重要的作用,可以帮助我们快速实现登陆操作。如还不知道如何...

为什么浏览器有时能够记住我的用户名和密码?
在浏览网页时,有时会发现浏览器能够自动记住自己的用户名和密码。这主要是因为某些版本的浏览器具有自动记忆功能。初次登录网站如网上银行时,浏览器可能会询问是否要记住这些登录信息,以便日后使用。然而,强烈建议避免使用这一功能,以确保账户安全。如果浏览器已开启自动记忆功能,可以通过以下步骤移除这一...

相似回答