【用户验证】这样的思路验证用户是否登录的有没有漏洞、问题
本帖最后由 default7 于 2014-05-25 13:31:32 编辑 考虑的是服务器最大限度的减少SQL查询。
SESSION如果浏览器关闭就失效,所以改用COOKIE,写了如下方式来检测用户是否登录。
代码如下:<br>/**<br> * 初始化,用户COOKIE数据验证 by default7#zbphp.com<br> */<br>public function authCheck()<br>{<br> if (cookie('uid')) {<br> $uid = cookie('uid');<br> $umd5 = cookie('umd5');<br> $udata = cookie('udata');<br> if (isUid($uid) && isMd5($umd5) && $udata && ($strDecode = authcode($udata, 'DECODE'))<br> && md5($strDecode) == $umd5 && ($data = json_decode($strDecode)) && $data['uid'] == $uid) {<br><br> //每隔60s必须查询SQL检测一次<br> if ($this->time - $data['lastactive'] > self::INTERVAL) {<br> if (($rsUser = M('Member')->where("mid='$uid'")->getField('mid,uname,pwd,vip,viptime1,viptime2,lastactive,isfbd'))<br> && strtolower($rsUser['uname']) == strtolower($data['uname'])<br> && strtolower($rsUser['email']) == strtolower($data['email'])<br> && md5($rsUser['pwd'].$data['salt']) == $data['upwd']<br> ) {<br><br> if($rsUser['isfbd'] == 't'){<br> $this->error('您的账号已被封禁,请联系管理员!');<br> $this->resetUser();<br> return;<br> }<br><br> //更新最后在线时间<br> M('Member')->setField('lastactive',$this->time);<br><br> //重新生成加密密匙<br> $data['salt'] = uniqid();<br> $data['upwd'] = md5($rsUser['pwd'].$data['salt']);<br><br> }else{<br><br> $this->error('账号信息(邮箱或密码)发生变化,请重新登录!','',U('Member/Index/login?f='.__URL__));<br> $this->resetUser();<br> return;<br><br> }<br> }<br><br> $data['lastactive'] = $this->time;<br><br> $this->UserData = $data;<br><br> $strEncode = json_encode($data);<br><br> //配置COOKIE默认10天过期<br> cookie('uid',$data['uid']);<br> cookie('umd5',md5($strEncode));<br> cookie('udata',authcode($strEncode,'ENCODE'));<br><br> return;<br> }<br><br> $this->resetUser();<br> }<br>}<br><br>/**<br> * 注销SESSION 所有<br> *<br> * @return bool<br> */<br>public function resetUser()<div class="clear">
</div>
Salin selepas log masuk