OSC的自动登录是如何实现?

Marser_cn 发布于 2013/07/08 15:39
阅读 509
收藏 9

请问各位大神,咱OSC的自动登录的实现原理是什么?

本人知道是用COOKIE来记录啥子串,并设置一个过期时间。但是咱OSC是怎么解决COOKIE劫持这个问题的?

既然是开源社区,@红薯和各位可否开源出来呢?

小弟现在要开发这个功能,急需弄明白原理,谢谢@红薯和各位啦

加载中
0
skyim
skyim
skyim
回复 @JayKong : 竟然在我的回复上面搞暧昧,原来你们,把我的答案评为最佳就Ok,呵呵
Marser_cn
Marser_cn
回复 @Minily : 边干活边等,哈哈。。。
Minily
Minily
@JayKong 你不干活了?
Marser_cn
Marser_cn
回复 @Minily : 380389818,在线坐等哦
Minily
Minily
@JayKong 公司禁掉了,下班回家7、8点了,吃个饭、洗洗睡了。很少上、你留QQ,我加你吧。
下一页
0
官方入员
官方入员
这个只是cookie的使用和你系统的认证模块认证规则而已。osc的自动登陆主要是oscid,一个加密的字符串。至于什么内容,普通的话存放用户的id就行了。服务器读取解密就可以确定那个用户在访问了。如果是为了安全,你可以在里面记录用户的系统特征,浏览器特征。服务器认证的时候匹配不上就xx掉,防止xss还得要你程序过滤用户输入数据。
官方入员
官方入员
回复 @JayKong : 如果被盗用,你只能在认证机制上做防范措施。比如在cookie上记录好真实用户的操作系统信息,浏览器的uer-agent,用这些数据再对比下现在用户,如果能匹配确认为真实用户,如果不能就消除cookie需要用户重新登陆。如果有必要,可以记录用户的ip信息,根据原ip和现在ip判断是否同地区,不同地区则需要重新登陆。记住,记录用户的信息的cookie必须是加密过的。
Marser_cn
Marser_cn
比如某人盗用了别人的COOKIE呢?
0
红星xx
红星xx

登陆 时 将 用户id ,密码 hash ,ip ,UA 加密后形成字符串 放在 oscid 这个 cookie 中  ,

网页每次访问都要 附带这个 cookie  , 解密cookie 获得用户id

0
不坏
不坏

引用来自“红星xx”的答案

登陆 时 将 用户id ,密码 hash ,ip ,UA 加密后形成字符串 放在 oscid 这个 cookie 中  ,

网页每次访问都要 附带这个 cookie  , 解密cookie 获得用户id

就是这样的逻辑  ,登录 成功后 可以 把信息写入 一个 session表里 , 每次访问 可以去session表对比检测是否存在 下面的代码是我自己用的 

// 判断当前用户登录状态
function Checkauth() {
	//存在cookie/未过期
	if ($_COOKIE [$GLOBALS ['cookie_pre'] . 'auth']) {
		@list ( $password, $uid ) = explode ( "\t", com_authcode ( $_COOKIE [$GLOBALS ['cookie_pre'] . 'auth'], 'DECODE' ) );
		$user_id = intval ( $uid );
		// 解析cookie存在 对比session表
		if ($password && $user_id) {
			
			//首先查询session表数据
			$sql = 'SELECT user_id, user_name, email, password' . ' FROM ' . $GLOBALS ['Sys']->table ( 'session' ) . " WHERE user_id = '$user_id'";
			if ($row = $GLOBALS ['db']->getRow ( $sql )) {
				if ($row ['password'] == $password) {
					// 赋值
					$_SESSION ['user_id'] = $row ['user_id'];
					$_SESSION ['user_name'] = $row ['user_name'];
					$_SESSION ['email'] = $row ['email'];
				}else{
					$_SESSION ['user_id'] = 0;
				}
			}
			//session没有数据表示没有登录 ,或者登录超时,  再查找会员表
			else {
				$sql = 'SELECT user_id, user_name, password, email' . ' FROM ' . $GLOBALS ['Sys']->table ( 'members' ) . " WHERE user_id = '$user_id'";
				if ($row = $GLOBALS ['db']->getRow ( $sql )) {
					if ($row ['password'] == $password) {
						// 赋值
						$_SESSION ['user_id'] = $row ['user_id'];
						$_SESSION ['user_name'] = $row ['user_name'];
						$_SESSION ['email'] = $row ['email'];
						$session = array (
								'user_id' => $row ['user_id'],
								'user_name' => $row ['user_name'],
								'email' => $row ['email'],
								'password' => $row ['password']
						);
						update_user_info ( $session ); // 这里更新 session表里的信息 删除过期的 , 更新 现在的 这个uid 的session有效时间
						check_user_group();
					}
					else{ //存在记录 但是密码不相等
						$_SESSION ['user_id'] = 0;
					}
				}
				else { //会员表也没有记录
					$_SESSION ['user_id'] = 0;
				}
			}
		}
	}
	if(empty($_SESSION ['user_id'])) {
		clearcookies ();
	}
}

xmut
xmut
比如某人盗用了别人的COOKIE呢?
0
不坏
不坏
每次登录 这里的cookie 可以弄成一个随机
Marser_cn
Marser_cn
愿闻其详
返回顶部
顶部