PHP永久登录,请记住我的功能实现和安全实践

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保持有效,也可以保证其有效退出。

tag:功能实现登录请记住电脑软件php

相关内容