[网摘]跨域session相关问题资料收集 - 日志 - sandy1890 - webg...

来源:百度文库 编辑:神马文学网 时间:2024/04/28 20:50:56

[网摘]跨域session相关问题资料收集

已有 683 次阅读  2009-07-19 09:54   标签:  网摘  session  资料  收集  以下的方法都还没有验证过,参考资料收集中。 ****************************************************************原帖地址:http://hechengrong.javaeye.com/blog/149918 问题描述:
   在一个应用(domain: A)的某个page中, 通过IFrame的方式嵌入另一个应用(domain: B)的某个页面. 当两个应用的domain
不一样时, 在被嵌入的页面中不允许使用cookie(即使用cookie实现的session会失效).

问题分析:
   在XP SP2和IE6之后,从安全性角度考虑,默认状态下不允许在iframe里使用跨站点cookie。


解决方案:
   1. 修改Client的设置
    使Client可以接受来自任何网站的Cookie(具体设置在IE选项的隐私页中)(测试通过).
   或者将两个domain都设置为受信息站点(测试通过).

   2. 应用的domain修改
    简单方案: 两个应用使用同一个domain(没有测试).
   复杂方案: 可以在iframe加载的页面里通过setdomain来强制更改(没有测试).

   3. P3P
   第一种: 在要嵌入的内容中(iframe指向的站点)输出P3P的主机头声明,步骤如下:
> 打开IIS管理器 inetmgr
> 选择被嵌入iframe源站点或者目录,右键点击打开属性框
> 切换到HTTP头
> 添加
> 自定义HTTP头名: P3P
> 自定义HTTP头值: CP="CAO PSA OUR"
> 关闭属性框退出,即刻生效

   第二种: 在被嵌入页面page_onload里添加一语句:Response.AddHeader("P3P","CP=CAO PSA OUR")(测试通过); ****************************************原帖地址:http://strangeromo.javaeye.com/blog/271610

1.页面里的COOKIE不能是浏览器进程的COOKIE(包括验证票和不设置超时时间的COOKIE),否则跨域会取不到.这点做跨域COOKIE的人比较少提到.不过实际上留意下几家大学做的方案,有细微的提到他们的验证模块里的COOKIE是有设置超时时间的.

2.当利用IFRAME时,记得要在相应的动态页的页头添加一下P3P的信息,否则IE会自觉的把IFRAME框里的COOKIE给阻止掉,产生问题.本身不保存自然就取不到了.这个其实是FRAMESET和COOKIE的问题,用FRAME或者IFRAME都会遇到.

3.测试时输出TRACE,会减少很多测试的工作量.

只需要设置 P3P HTTP Header,在隐含 iframe 里面跨域设置 cookie 就可以成功。他们所用的内容是:

P3P: CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'

ASP直接在头部加了头部申明,测试有效。
<%Response.AddHeader "P3P", "CP=CAO PSA OUR"%>

php的话,应该是如下写法:
header('P3P: CP=CAO PSA OUR');

ASP.NET的话
通过在代码上加Response.AddHeader("P3P", "CP=CAO PSA OUR")或者在Window服务中将ASP.NET State Service 启动。

JSP:
response.setHeader("P3P","CP=CAO PSA OUR")

**************************************************************

原帖及讨论:http://bbs.bc-cn.net/dispbbs.asp?boardID=10&ID=168248

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国  http://www.bc-cn.net
*/ 作者: 不惑        QQ:7284911
*/ 时间: 2007-9-6  编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


前几天因为一企业网站,内有一客户的服务系统,那个网站因为是租用的空间,不足以存放客户系统,所以另外搞了个服务器,为了使域名的统一性(另一个服务器的域名与原域名差别过大),所以把这个客户系统用框架包含在了原来的网站内,但碰到了因为跨域操作而使客户系统用户登陆后发生session丢失的问题,困挠了一整天,也在此发贴征求解决方法,见:http://bbs.bc-cn.net/dispbbs.asp?boardID=10&ID=167628&page=3。后经本人多方查找资料,经过本人分析和试验,终于把这个问题给解决了,今天见有人问要程序,所以写这个贴子,以供大家共享。
首先说明原理:
系统是认一个一个程序范围的,一般来说,一个IE默认为一个程序范围.
框架因为有了跨域的内容,所以它首先默认的是框架程序本身的程序范围,这样使得框架内的程序范围得不到确认.
为了让这个IE默认为框架内的程序范围,所以我使用了多次跳转.
首先,跳出本框架,进入一个无框架的需要session值的网站页面(就叫它B服务器的页面),并在这个页面中生成一个session以便系统自动生成一个sessionID,然后又跳回到有框架的页面.因为系统已经为这个IE生成了一个sessionID,所以只要不关掉这个IE,系统一直以为这个IE是本程序范围的.这样,再次生成的session值就得以在这个ID中生存下来.
也就达到了骗过系统的目的.
再补充一点,二次跳转使用了不同的方式,原因是我需要把框架外的信息丢弃,而要保存框架内的信息.
而不同的跳转方式会丢弃或保存跳转前的信息的。
程序实现方式:
文件1:
框架文件:index.htm(运行在服务器A上)



奇豪门业


  
  
  <br>  <body></p><p>  <p>此网页使用了框架,但您的浏览器不支持框架。</p></p><p>  </body><br>  


文件2:index.asp (运行在服务器B上,作用跳转和生成sessionID)

<%
if session("xm2")="" then
  session("xm2")="eee"
'上面这一句的目的只是为了使用session,让系统为这个IE生成一个sessionID,并且判断一下是不是已经跳转过,免得引起死循环。
%>

<%
,上面这一句是回到框架,注意:只能用上面这个跳转的方法,别用下面的跳转方法。
else
Response.Redirect "index2.asp"
'上面一句才是真正地跳转运行服务器B上的程序!注意:也只能用这方法跳!
end if%>

经过以上的跳转,本IE已经有了服务器B上的sessionID,也就是说,框架虽然是在服务器A上的主框架运行,但它可以确保服务器B上的session不丢失,达到跨域运行的目的。