论坛首页 编程语言技术论坛

关于rails大容量网站部署的性能讨论

浏览 174980 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-05-15  
AreYouOK? 写道
robbin 写道
多说一句cookie和session的群集解决方案。我现在是这样做的:

用户登陆的时候给他一个cookie,存放userId,使用32位uuid(Hibernate生成),不使用int,是为了避免被hack。此外同时给这个用户分配一个Session,存放user对象。

然后我再写一个webwork Interceptor,拦截所有的动态访问请求,如果他有cookie,但是没有session,就根据cookie里面的userId查数据库,给他session里面放入user。

这样就很完美了,例如用户在clone1上面登陆,然后用户请求被分发到clone2,这个时候clone2上面有cookie无session,但是我的拦截器会用cookie查数据库给他session。这样每个节点只需要访问一次数据库设置session而已。而应用程序里面照常使用session,从session里面拿user对象,不需要改一行代码。只要该节点有session,就直接使用session,如果该节点无session,就从cookie里面去userId访问数据库设置一次session。兼顾了性能和群集部署的无状态,哈哈,完美吧。

好像安全有问题
如果我没有理解错的话,放在cookie里面的那个userId和数据库里面存的userId是相同的吧,那我只要记下这个cookie的名字和userId,以后每次都能伪造出这个cookie绕过登录了。
url里面可能有其他用户的userId(比如查看用户资料的url,应该是类似这样的吧viewUser?userId=xxx),那么我得到其他用户的userId,也能伪造出其他用户的cookie登录了
即使cookie是加密过的userId,至少在一个已经登录的浏览器里面得到cookie的值,就能伪造出这个cookie以这个浏览器的当前登录用户进入
主要问题就在于,同一个用户记录登录信息的cookie,不管什么时候登录,它始终是同一个值。而tomcat管理的jsessionId是随机生成的,即使得到这个cookie的值,在session超时以后就不再有效


所以当你不在自己的私人机器上面使用的时候,登陆系统请不要选择“记住cookie”
0 请登录后投票
   发表时间:2006-05-15  
robbin 写道
AreYouOK? 写道
robbin 写道
多说一句cookie和session的群集解决方案。我现在是这样做的:

用户登陆的时候给他一个cookie,存放userId,使用32位uuid(Hibernate生成),不使用int,是为了避免被hack。此外同时给这个用户分配一个Session,存放user对象。

然后我再写一个webwork Interceptor,拦截所有的动态访问请求,如果他有cookie,但是没有session,就根据cookie里面的userId查数据库,给他session里面放入user。

这样就很完美了,例如用户在clone1上面登陆,然后用户请求被分发到clone2,这个时候clone2上面有cookie无session,但是我的拦截器会用cookie查数据库给他session。这样每个节点只需要访问一次数据库设置session而已。而应用程序里面照常使用session,从session里面拿user对象,不需要改一行代码。只要该节点有session,就直接使用session,如果该节点无session,就从cookie里面去userId访问数据库设置一次session。兼顾了性能和群集部署的无状态,哈哈,完美吧。

好像安全有问题
如果我没有理解错的话,放在cookie里面的那个userId和数据库里面存的userId是相同的吧,那我只要记下这个cookie的名字和userId,以后每次都能伪造出这个cookie绕过登录了。
url里面可能有其他用户的userId(比如查看用户资料的url,应该是类似这样的吧viewUser?userId=xxx),那么我得到其他用户的userId,也能伪造出其他用户的cookie登录了
即使cookie是加密过的userId,至少在一个已经登录的浏览器里面得到cookie的值,就能伪造出这个cookie以这个浏览器的当前登录用户进入
主要问题就在于,同一个用户记录登录信息的cookie,不管什么时候登录,它始终是同一个值。而tomcat管理的jsessionId是随机生成的,即使得到这个cookie的值,在session超时以后就不再有效


所以当你不在自己的私人机器上面使用的时候,登陆系统请不要选择“记住cookie”

嗯,如果这是解决方案的话,那我太伤心了
假如系统是一个web mail,那我可以趁朋友不再电脑前面的时候偷到这个永久有效的cookie(或者通过其它的手段如sniffer等),以后就可以一直偷看信件了。这个朋友知道信件被偷看后,居然束手无策,连修改密码也没有用,只能把这个id费掉了。假如这个系统就是JE论坛,又会如何?

要是不用这种单点登录的认证方式,只能自己实现随机的通行令牌了,象CAS那样,需要做一个专门的认证server来维护session。
0 请登录后投票
   发表时间:2006-05-15  
clark 写道
zgd 写道
理论上用户会不停clone1 clone2的跳,那就是clone1和clone2不停创建session了


这个问题可以用LVS解决。

事情复杂化了吧
0 请登录后投票
   发表时间:2006-05-15  
不知道robbin理解我说会不停创建session的问题没有

用户第一次访问clone1
创建了一个session
session id纪录在cookie了

第二次访问变成了clone2(用户是不知道变了)
在clone2创建了一个session
session id纪录在cookie,覆盖了原来的session id

第三次访问变成clone1
虽然clone1是已经创建了session
但是这个session id不见了,于是又创建一个新的session

不知道是怎么解决这个问题的
0 请登录后投票
   发表时间:2006-05-15  
引用
第三次访问变成clone1
虽然clone1是已经创建了session
但是这个session id不见了,于是又创建一个新的session


这个session id不会不见的。除非你已经关闭浏览器了,既然关闭浏览器,那么当然session就没有了。
0 请登录后投票
   发表时间:2006-05-15  
robbin 写道
引用
第三次访问变成clone1
虽然clone1是已经创建了session
但是这个session id不见了,于是又创建一个新的session


这个session id不会不见的。除非你已经关闭浏览器了,既然关闭浏览器,那么当然session就没有了。


对 session 理解有误,  看这篇
http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。
0 请登录后投票
   发表时间:2006-05-15  
robbin 写道
引用
第三次访问变成clone1
虽然clone1是已经创建了session
但是这个session id不见了,于是又创建一个新的session


这个session id不会不见的。除非你已经关闭浏览器了,既然关闭浏览器,那么当然session就没有了。

session id是不会不见的,但是拿clone2的session id去clone 1里面是取不到session的,会通过你设置的保存userid的cookie再去创建一个session
0 请登录后投票
   发表时间:2006-05-15  
AreYouOK? 写道
robbin 写道
AreYouOK? 写道
robbin 写道
多说一句cookie和session的群集解决方案。我现在是这样做的:

用户登陆的时候给他一个cookie,存放userId,使用32位uuid(Hibernate生成),不使用int,是为了避免被hack。此外同时给这个用户分配一个Session,存放user对象。

然后我再写一个webwork Interceptor,拦截所有的动态访问请求,如果他有cookie,但是没有session,就根据cookie里面的userId查数据库,给他session里面放入user。

这样就很完美了,例如用户在clone1上面登陆,然后用户请求被分发到clone2,这个时候clone2上面有cookie无session,但是我的拦截器会用cookie查数据库给他session。这样每个节点只需要访问一次数据库设置session而已。而应用程序里面照常使用session,从session里面拿user对象,不需要改一行代码。只要该节点有session,就直接使用session,如果该节点无session,就从cookie里面去userId访问数据库设置一次session。兼顾了性能和群集部署的无状态,哈哈,完美吧。

好像安全有问题
如果我没有理解错的话,放在cookie里面的那个userId和数据库里面存的userId是相同的吧,那我只要记下这个cookie的名字和userId,以后每次都能伪造出这个cookie绕过登录了。
url里面可能有其他用户的userId(比如查看用户资料的url,应该是类似这样的吧viewUser?userId=xxx),那么我得到其他用户的userId,也能伪造出其他用户的cookie登录了
即使cookie是加密过的userId,至少在一个已经登录的浏览器里面得到cookie的值,就能伪造出这个cookie以这个浏览器的当前登录用户进入
主要问题就在于,同一个用户记录登录信息的cookie,不管什么时候登录,它始终是同一个值。而tomcat管理的jsessionId是随机生成的,即使得到这个cookie的值,在session超时以后就不再有效


所以当你不在自己的私人机器上面使用的时候,登陆系统请不要选择“记住cookie”

嗯,如果这是解决方案的话,那我太伤心了
假如系统是一个web mail,那我可以趁朋友不再电脑前面的时候偷到这个永久有效的cookie(或者通过其它的手段如sniffer等),以后就可以一直偷看信件了。这个朋友知道信件被偷看后,居然束手无策,连修改密码也没有用,只能把这个id费掉了。假如这个系统就是JE论坛,又会如何?

要是不用这种单点登录的认证方式,只能自己实现随机的通行令牌了,象CAS那样,需要做一个专门的认证server来维护session。

google就可以通过copy cookie来绕过等录,可以拿ie和firefox试验一下
0 请登录后投票
   发表时间:2006-05-15  
Feiing 写道
robbin 写道
引用
第三次访问变成clone1
虽然clone1是已经创建了session
但是这个session id不见了,于是又创建一个新的session


这个session id不会不见的。除非你已经关闭浏览器了,既然关闭浏览器,那么当然session就没有了。


对 session 理解有误,  看这篇
http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。


被你抓住了一个语病,谢谢。不过关于这一点我是了解的很清楚滴,去年做一个大项目的调优,还用JProbe钻研过WebSphere的Session实现机制和Tomcat的Session实现机制。HttpSession在服务器端的实现实际上就是一个Map,key是生成的一串UUID字符串,value是你放入session的值。

关闭浏览器以后再打开,浏览器不可能再送同样的session ID了,因此,session的机制也是不保险的。

假设你上网的时候我记住你的session ID,然后我用这个sessionID访问网站,一样可以冒充你。和setAge(-1)的cookie是没有任何区别的。
0 请登录后投票
   发表时间:2006-05-15  
zgd 写道
clark 写道
zgd 写道
理论上用户会不停clone1 clone2的跳,那就是clone1和clone2不停创建session了


这个问题可以用LVS解决。

事情复杂化了吧


但是,用LVS性能和功能要优于用 lighttpd, apache, tomcat, weblogic 等做负载均衡分发。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics