Heim >Backend-Entwicklung >PHP-Tutorial >请教如何提高登录验证的效能

请教如何提高登录验证的效能

WBOY
WBOYOriginal
2016-06-23 13:53:011021Durchsuche

最近做的一个系统

登录是用$_COOKIE做的

会自动生成一个识别符($identifier)和验证符($token),保存到

$_COOKIE["auth"] = $identifier . ":" . $token ;有做加密,在此先不提加密的事


同时把
识别符($identifier)和验证符($token) 分别保存到SQL的2个栏位

做了个function,并且在confing文件中引入运作

这样就每一页都会验证

function 大约是意思是

list($identifier, $token) = explode(':', $_COOKIE['auth']);
取回$_COOKIE之前设定的
识别符($identifier)和验证符($token) 

然后对比数据库  这两个值是否一模一样

如果是正确,那就照常运作,如果不相等,就清空
setcookie('auth', 'DELETED!', time()-1);


以上这样做,就可以做到自动登录的效果了

效果和验证是可以正常使用,但问题是,大家的网站....难度验证功能都是每一页都要查询一次数据库的吗?

有没有什么别的方法?

基本上想到...是否做个别的timeout字段,定时清空,如果空了,才进行验证,又重新付值一次?


脑筋有点塞了,求个思路。


回复讨论(解决方案)

暂时想到

成功登录后同时设定一个COOKIE

setcookie('next_check',"hahahaha",time()+900);

这样15分钟就会消失

在检查是否登录的function最外层,加上一个

if (!!empty($_COOKIE["next_check"])) {
}

这样有安全问题吗?

当然不是每页都查询啊,登陆成功后写个session,保存用户id,用户名等等资料数组
每次读取session就好

但这样引发一个问题,我在后台封账号,不能及时踢下去,因为他机器上的session仍然有效
这个需要共享内存来解决吧

我现在都是用cookie做登录,当然要用自己的加密key加密后存放
要在你的服务器设置一个解密的key,获取cookie后反解,这样你就不怕别人获取cookie来解密了

当然不是每页都查询啊,登陆成功后写个session,保存用户id,用户名等等资料数组
每次读取session就好

但这样引发一个问题,我在后台封账号,不能及时踢下去,因为他机器上的session仍然有效
这个需要共享内存来解决吧


先谢谢
1. 问题是怕流量大时有负载问题
2. 我写得这么麻烦不想用SESSION,因为要做自动登录, 应该只能用COOKIE吧?

我现在都是用cookie做登录,当然要用自己的加密key加密后存放
要在你的服务器设置一个解密的key,获取cookie后反解,这样你就不怕别人获取cookie来解密了


那请问是每页都验证还是怎么样?

1、验证只发生在需要以用户数据修改系统数据数据的页面
2、增强的验证必须来自不同的数据源。将 识别符和验证符 用同一种方式传递,是没有意义的,自欺欺人的。
3、如有“踢人”的需求,那么就需要时刻检查了。可使用自定义的 session 处理程序来完成

直接获取cookie,用服务器的key解出来就可以了,不用验证,因为若是被修改,你用服务器的key是解不出来的

比如你就存放个uid和过期时间,要是能解出来,你就直接查询那个uid的信息,并存放到全局变量里面,解出来没有uid,说明就是被篡改了,要重新登录

先谢谢
1. 问题是怕流量大时有负载问题
2. 我写得这么麻烦不想用SESSION,因为要做自动登录, 应该只能用COOKIE吧?



1.负载问题我没有实际经验,但session的文件是hash,加了正确索引的用户表是树,我想前者会快一些,而且每个页面都要查询,似乎有些太占数据库连接了
2.cookie和session配合着来,session负责当前登陆,存个cookie负责下次自动登陆呗

考虑踢人的话,可以将用户登陆信息写入memcache 中key为用户id,可以带用户登陆状态和时间,设置key的过期时间,验证用户时,拿用户session和制定的memcache key中的数据比对,两者都存在是ok。当需要踢用户时直接清除key下得memcache缓存

谢谢各位宝贵的指教!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn