Zhang Jiuan’ Notes

跨域问题-用户登录管理

    如果你是做网站开发的话,那么你就有可能碰到跨域登录问题。比如你的网站有两个域名,你打算做这样一件事,在其中任何一个域名下登录后,在另一个域名下就同时是登录状态,这采取什么样的方式来实现才是最合理的呢?
    在讨论解决方案前,我们首先要搞清楚的是什么叫登录,什么意味着登录,登录的本质是什么几个问题。登录一般是怎么实现的呢?当然这有很多方式,下面介绍几个最常见的实现方式。
    1 最简单的方式:在客户端写一个COOKIE,这个COOKIE必须是内存COOKIE,它的值都是用户登录名。这样在服务器处理请求的时候,看COOKIE信息是否存在用户名,如果存在,就认为是登录。这种实现方式是不安全的,因为任何用户都可以模改写提交的COOKIE。另外就是服务器对登录状态没有做任何记录。
    2 用户名COOKIE+MEMCACHED实现方式:这种是在第一种实现方式上加上了服务器登录记录。即请求的COOKIE信息有用户名信息并不代表用户登录,并且以用户名作为KEY在MEMCACHED中找到对应的键值对,那么才认为该用户登录。这种方式比第一种方式安全了一些,因为它不再只以COOKIE的用户名作为登录状态,外加了服务器记录。
    3 随机COOKIE+MEMCACHED实现方式:前两种实现方式在客户端的用户名就记录了用户的信息,比如一个用户登录了,另外一个用户模拟该用户(即在COOKIE里面设置另外一个人的用户名)请求服务,那么则可以冒充该用户。因此第三种实现方式浮出水面,那就是一个用户登录了,那么服务器给用户流览器生成一个随机串,通过随机串的长度,保证该随机串的唯一性,然后将该随机串以user_login_id(可以随意命名)为KEY存在用户流览器的COOKIE里面;另外再以随机串为KEY在MEMCACHED缓存内存存一些用户信息。此时基本可以利用一个临时用户流览器标识一个登录用户了,这样已基本安全了,也基本达到了商业化的水平了。
    上面第三个登录方式可靠性算是挺可靠了,但是仍旧存在一定的风险。那就是用户登录时,如果COOKIE信息被外泄的话,那么另一个用户就可以冒充此用户做一些操作了。究其本质是因为用户的COOKIE值和MEMCACHED存在一个一对一的关系,尽管这些门槛对普通用户高了些。要解决这个问题也不是没有办法的,比如MEMCACHED以用户IP+随机串的方式,就更加安全了。
    上面讨论了很多登录的实现,似乎还没有绕到本篇文章的主体呢:)实际上,明白了上面的登录,离解决跨域问题就已经不远了。
    通过上面的讨论,使我们明白了实质上用户登录就是客户端流览器写一个COOKIE值的关键问题上,但另外一个问题也随之浮出水面:A.com域下面的COOKIE信息在B.com域下面是看不到的,因此在写COOKIE信息时,就必须在A.com域和B.com域两个下面同时设置相同的COOKIE信息跨域问题就迎刃而解了。
    因此在一个域下面登录的时候,以GET参数方式将COOKIE信息带到另外一个域下面,那么此问题就得到了彻底解决了。
    实际此问题远没有结束,还有很长的路要走,还有太多问题没有讨论。比如:本篇上面讨论的是相同服务器,如果是不同服务器又该怎么样处理;这里是A和B相同登录处理,如果要求在不同域下有不同的权限又将如何实现;如何实现登录信息的统一管理呢?
    这些问题就留给读者吧。
 
thx
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!

图形对工程师的作用

    经历了学校N年生活经历,似乎对文字特别敏感。因此想表述一个问题的时候,总是想着用语言,用文字把问题描述清楚。实际可能许多问题有另外一种途径,比如图像、图形、声音等。
    特别是对于一个计算机方面的工程师来讲,图形的作用更为重要比如系统架构图、程序流程图、模块关系图等等,对于这些东西可能用文字描述需要大大的几篇,可一个简单的图形摆在面前,一切尽现眼前。因此是否可以有效的利用图形是一个工程师是否合格的一个重要标准。
    作为一个程序员,程序流程图十分重要。可能一个不是很麻烦的逻辑,某些程序员总是绕来绕去,看着似乎程序逻辑十分高超。实际则不然,可能一张简单图就可以使程序逻辑在眼前十分清晰,程序实现也简单,可能就是一个筒子楼+个别分枝就够了,这样的逻辑最不容易出错。
    记得一位高手说过:技术的高低不在于程序写的多麻烦,分枝有多少;而在于你的逻辑是否表达的足够清晰,请一个新人接手马上就可上手。一些关键的原则是需要遵守的,只有保证了这些原则,用户再想法攻击你的服务,总绕不出你的手心;反之效果就不一样了,你发现一个漏洞,打一个补丁,最终你的系统仍旧是存在可能初攻击者击跨的可能性。
    系统设计应当清晰,哪些支持哪些不支持应当显页易见。程序也更应该简单、可信赖!
    而描述系统架构,这里利用图是再好不过了。
If you enjoyed this post, make sure you subscribe to my RSS feed!

,

返回顶部