PHP永久登录,请记住我的功能实现和安全实践
根据我的观察,最常见的有缺陷的永久登录方案是在Cookie中保存的用户名和密码。诱惑,这样做是可以理解的-你不需要提示用户输入用户名和密码,你只要读他们从饼干。验证过程的其他部分完全一样的正常登录,所以该方案是一个简单的解决方案。
但是,如果您确实存在于用户名和密码的cookie中,请立即关闭该功能,并阅读本节的其余部分,以找到实现更安全计划的一些想法。您还需要询问将来使用cookie的所有用户修改其密码,因为它们的身份验证信息已被公开。
永久登录需要永久登录cookie,通常称为COOKIE,因为饼干是唯一的标准机制,用来提供多个会话之间的稳定的数据。如果cookie提供永久访问,这将引起严重的风险,你的应用程序的安全,所以你需要确保你的数据保存在cookie只能用于在有限的时间内认证。
第一步是设计一个方法来减轻由捕获的永久登录cookie造成的风险。尽管饼干被捕获,你需要避免,但深层防御过程是最好的,尤其是因为这一机制将即使一切操作正常减少验证的安全。这样的Cookie不能基于任何提供永久登录信息生成的,如用户密码。
为了避免使用用户密码,您可以创建只对一个验证有效的标识:
复制代码代码如下所示:
< PHP
$令牌= MD5(uniqid(RAND(),真的));
>
您可以将其保存在用户会话中,使其与特定用户相关联,但这并不能帮助您在多个会话之间维护登录。这是一个主要前提,因此,您必须使用不同的方法将这个标识与特定的用户相关联。
因为用户名和密码是不敏感的,你可以把它放在饼干,这有助于验证用户ID的验证提供了更好的方式,但是,是使用第二身份ID不容易猜找到。考虑增加三字段数据表存储用户名和密码:第二身份标志(标识),永久登录标识(令牌),和一个永久登录超时时间(超时)。
复制代码代码如下所示:
描述用户;
+ + + + ------------ ------------------ ------ ----- --------- ------- + + +
场型空| | | |关键|默认|额外|
+ + + + ------------ ------------------ ------ ----- --------- ------- + + +
| |用户名varchar(25)| | PRI | | |
| |密码varchar(32)是| | |空| |
| |标识符varchar(32)是多空| | | | |
| |令牌varchar(32)是| | |空| |
| |超时int(10)符号是空的| | | | |
+ + + + ------------ ------------------ ------ ----- --------- ------- + + +
通过生成和保存第二个身份ID和一个永久登录ID,您可以创建一个不包含任何用户身份验证信息的cookie。
复制代码代码如下所示:
< PHP
盐= 'shiflett美元;
标识符= MD5(盐)。MD5($用户名)。(盐);
$令牌= MD5(uniqid(RAND(),真的));
$超时=()+ 60 * 60 * 24 * 7;
setcookie('auth ',$标识符:$标记
>
当用户使用永久登录cookie时,可以检查它是否符合几个标准。
复制代码代码如下所示:
< PHP
*(mysql_connect)* /
*(mysql_select_db)* /
$ =数组();
$ =数组();
现在=时间();
盐= 'shiflett美元;
列表($标识符,$标记)=爆炸(':',_cookie美元{ 'auth});
如果(ctype_alnum($标识符)ctype_alnum($标记))
{
{ } =清洁'identifier美元美元的标识符;
{ } =清洁'token美元美元令牌;
}
其他的
{
**…
}
{ } =美元'identifier MySQL的mysql_real_escape_string($清洁{ 'identifier});
$选择用户名、令牌、超时
从用户
这里的标识符={ } } { 'identifier MySQL美元';
如果($结果= mysql_query($ SQL))
{
如果(mysql_num_rows($结果))
{
记录= mysql_fetch_assoc美元($结果);
如果美元'token'} {(清洁!= $记录{ 'token})
{
*登录失败(错误令牌)。
}
($现在>记录{ 'timeout美元'})
{
登录失败(超时)
}
($清洁{ 'identifier}!=
MD5(盐)。MD5($记录{ 'username}。(盐))
{
*登录失败(无效标识符)。
}
其他的
{
成功登录
}
}
其他的
{
*登录失败(无效标识符)。
}
}
其他的
{
错误
}
>
您应该坚持三种方法来限制永久登录cookie的使用。
1、cookie需要在一周内过期(或更少)。
2、曲奇最好只用于一次验证(在成功的验证被删除或更新之后)
三.一周(或更少)服务器端cookie的到期时间。
如果您希望用户不受限制地记住,只要用户对应用程序的访问大于到期日期,只需在每次验证之后重新生成标识并设置一个新cookie即可。
另一个有用的原则是,在用户执行敏感操作之前,用户必须提供密码。您只能允许永久登录用户访问不敏感的应用程序。在执行某些敏感操作之前,让用户手动验证是不可替代的步骤。
最后,你需要确认注销系统的用户实际上是登机,包括永久登录cookie的删除:
复制代码代码如下所示:
< PHP
setcookie('auth ','deleted!时间());
>
在这个示例中,cookie对于填充和立即过期的值是无用的,这样一来,即使用户的时钟不允许cookie保持有效,也可以保证其有效退出。