php mysql判断登录状态_PHP判断用户登录状态,效率并且安全的方案是什么?

将用户信息保存至COOKIES中。

用户信息包括:UID,USERNAME,EMAIL,PASSWORD。

其中 EMAIL,PASSWORD进行可逆加密。

每次登录只须将COOKIES进行一次可逆加密和你数据库对比一次若相等则登录,否则进行正常的登录操作。

===============

PS

======================

关于cookies中是否可以存放用户信息,一直都是业界存在争议的一点。

目前我的解决方法是:

cookies中存放有关于邮箱、QQ号码、用户密码、用户名等信息均需要进行可逆加密。

如有用户信息:array("uid"=>1,"username"=>"b","password"=>"1234567","email"=>"abc@abc.com");

那么,我将uid,username,password,email等信息分别存放与cookies中,并且将username,password,email通过key(key只能自己知道和设置)进行可逆加密。当每一次需要操作的时候,我只需要$_COOKIE['password']然后将其解密还原为原始的1234567即可,然后将其进行查询匹配。若查询相同则认为该COOKIES有效,若不匹配则删除cookies。

那么,解密之后查询认证有两种方法:

1.直接连接数据库进行SQL查询,这是一种消耗性能的低效方法。select username,uid,password from xxxx where uid='xxxx',username='xxxxx' LIMIT 1;

这种方法没操作一次需要进行一次SQL查询,将大大增加性能开销。

2.将用户第一次登录查询出来的信息加密保存在cookies的同时,copy保存一份至memcached内存中,并增加标识 uid_status(可自取) 为 1 (登录状态),每一个用户拥有一个唯一的uid_status,并且设置为长期有效。

判断是否登录的过程则更加高效和快速。

将cookies中的信息解密之后,查看uid_status的状态,若为1,直接认定该用户处于登录状态,不删除cookies信息。若为0,非登录状态,则将cookies和memcached中的用户信息进行匹配。匹配包括:password,uid,username。若其中一项不正确则删除cookies,更新uid_status状态。

以上就是我判断用户是否登录过程。

========

P.S

===========

DISCUZ!系列是采用cookies加密后直接查询数据库进行cookies有效判断的。

uc_home核心代码是:<?php

//判断当前用户登录状态

function checkauth() {

global $_SGLOBAL, $_SC, $_SCONFIG, $_SCOOKIE, $_SN;

if($_SGLOBAL['mobile'] && $_GET['m_auth']) $_SCOOKIE['auth'] = $_GET['m_auth'];

if($_SCOOKIE['auth']) {

@list($password, $uid) = explode("\t", authcode($_SCOOKIE['auth'], 'DECODE'));

$_SGLOBAL['supe_uid'] = intval($uid);

if($password && $_SGLOBAL['supe_uid']) {

$query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('session')." WHERE uid='$_SGLOBAL[supe_uid]'");

if($member = $_SGLOBAL['db']->fetch_array($query)) {

if($member['password'] == $password) {

$_SGLOBAL['supe_username'] = addslashes($member['username']);

$_SGLOBAL['session'] = $member;

} else {

$_SGLOBAL['supe_uid'] = 0;

}

} else {

$query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('member')." WHERE uid='$_SGLOBAL[supe_uid]'");

if($member = $_SGLOBAL['db']->fetch_array($query)) {

if($member['password'] == $password) {

$_SGLOBAL['supe_username'] = addslashes($member['username']);

$session = array('uid' => $_SGLOBAL['supe_uid'], 'username' => $_SGLOBAL['supe_username'], 'password' => $password);

include_once(S_ROOT.'./source/function_space.php');

insertsession($session);//登录

} else {

$_SGLOBAL['supe_uid'] = 0;

}

} else {

$_SGLOBAL['supe_uid'] = 0;

}

}

}

}

if(empty($_SGLOBAL['supe_uid'])) {

clearcookie();

} else {

$_SGLOBAL['username'] = $member['username'];

if($_SGLOBAL['connect']) {

cloud_token();

}

}

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值