`
sd8089730
  • 浏览: 258564 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

用P3P header解决iframe跨域访问cookie(转) Iframe session失效

 
阅读更多

Asp.net cookie跨域解决方法,一下午烦死了,终于找到解决方法了

地址:http://blog.csdn.net/wonder4/archive/2008/02/27/2125804.aspx

谢谢这位大牛,收下了

 

 目前在整合几个应用时,遇到了iframe无法获取cookie(session)的问题,经过google,终于把这个问题解决了,现在记录一下。
   我的需求是这样的。
   有一个应用是用.net开发的,主要是控制用户登录,用户访问权限的,部署在上海机房。现在就叫A应用吧
   还有一个应用是用java开发,主要是具体业务的操作。部署在北京机房,这里叫B应用吧
   由于已经有一个用户管理和权限的应用程序,所以java 开发的这个B应用就没有开发用户权限的功能,想直接使用.net的A程序。

  用户访问的流程是这样的:
    1.用户先在A处登录,A设自己的cookie,在A的菜单里有去B应用的链接
    2.当用户点去B应用的链接时,A在链接上自动加上这个用户的token,传给B系统
   3.当B系统接收到请求后,把这个用户的token信息设成自己系统的cookie,(B系统里有表单post操作,如果不设cookie,session,那么每个请求不管GET还是POST都要明确带着该用户的token信息,对于系统的改造量比较大,另外以后换权限验证方法改动也比较大。)
  4.用户在B系统里的每次操作都没有明码带用户的token,所以每次都要去cookie得到token信息,然后发送一个http请求去A,让A系统验证这个用户是否有权限访问。
    5.如果A系统的接口返回可以访问的状态报告,那么B继续执行;如果A系统指示没有权限访问,那么B系统提示访问受控警告信息。

  一切开发都完成,到整合上线时,发现这个流程走不通,百思不得其解,想了半天也不知道 怎么 回事,google了半天,才发现原来是ie在捣鬼,IE不允许跨域访问cookie(好象firefox没问题,ie自6.0以后改用w3c组织的P3P协议了),再看看我的应用,在第二步设的cookie,在第三步以后所有B应用的访问请求,ie都把B应用的cookie blocked掉了(因为用户的访问是从A应用发起,从A应用访问B应用的东东,算跨域访问,IE认为有安全问题)。。。。(IE状态栏有一个红眼睛的button,点开可以看到哪些cookie给blocked掉了)

     知道原因就好办了,再google知道可以用P3P header可以解决问题!
     下面是java的解决办法之一,也是我的解决办法,不过个方法不太好:
     直接往响应里加一个P3P的header
     response().addHeader("P3P", "CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\"");

其中CP=“XXX XXXX”这些是有具体含义的:
     CP就是compact policies的意思,
    另外
header的值也可以是policyref="http://myhost/P3P/PolicyReferences.xml",就是指定一个策略文件。

具体请看这里.


下面是摘抄的一段Compact Policies的具体取值范围和设值含义。

 Compact Policies

Compact policies are essentially summaries of P3P policies. They can be used by user agents to quickly get approximate information about P3P policies, therefore improving performance.

For an in-depth explanation of compact policies, we refer to the P3P1.0[4] specification. Here, we limit to stating the syntax:

compact-policy-field  = `CP="` compact-policy `"`

compact-policy = compact-token *(" " compact-token)

compact-token = compact-access |
compact-disputes |
compact-remedies |
compact-non-identifiable |
compact-purpose |
compact-recipient |
compact-retention |
compact-categories |
compact-test

compact-access = "NOI" | "ALL" | "CAO" | "IDC" | "OTI" | "NON"

compact-disputes = "DSP"

compact-remedies = "COR" | "MON" | "LAW"

compact-non-identifiable = "NID"

compact-purpose = "CUR" | "ADM" [creq] | "DEV" [creq] | "TAI" [creq] |
"PSA" [creq] | "PSD" [creq] | "IVA" [creq] | "IVD" [creq] |
"CON" [creq] | "HIS" [creq] | "TEL" [creq] | "OTP" [creq]

creq = "a" | "i" | "o"

compact-recipient = "OUR" | "DEL" [creq] | "SAM" [creq] | "UNR" [creq] |
"PUB" [creq] | "OTR" [creq]

compact-retention = "NOR" | "STP" | "LEG" | "BUS" | "IND"

compact-category = "PHY" | "ONL" | "UNI" | "PUR" | "FIN" | "COM" |
"NAV" | "INT" | "DEM" | "CNT" | "STA" | "POL" |
"HEA" | "PRE" | "LOC" | "GOV" | "OTC"

compact-test = "TST"

另外这里还有一个P3P的验证工具:http://www.w3.org/P3P/validator.html,可以验证一下自己设置的P3P是否正确。

这里还有一个老外写的不错的blog,也可以参考一下。http://www.sitepoint.com/article/p3p-cookies-ie6/2
----其他--------------------------------------------------------------------------------------------------

IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)协议默认阻止第三方无隐私安全声明的cookie,Firefox目前还不支持P3P安全特性,firefox中自然也不存 在此问题了。

在frameset里面,也就是里面的frame是来自第三方站点(不同IP或不同域名),那么默认情况下IE会自动禁用这些站点的cookie, 也就是在请求某url时在HTTP header里不发送它们的cookie,包括session的cookie。注意,这些站点在response里面设置的cookie还是会被发送到浏 览器的。

在用户浏览a.php时 A.com写入的为第一方Cookie,其嵌入的iframe指向 b.php.这时B.com写入的就为第三方Cookie了,所以它是被IE当在了大门外。 所以,每次当用户提交的cookie提交时,就挂掉了.因为传不到真实的服务器.

解决方案.

PHP程序,可以直接在B网站中写入

PHP代码
  1. <?php  
  2. header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');  
  3. ?>  
这样就能接受第三方的Cookie啦。

 

lighttpd的服务器

XML/HTML代码
  1. server.modules    = ("mod_setenv")  
  2. setenv.add-response-header = ( "P3P" => "CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'")  
apache的服务器

 

XML/HTML代码
  1. <VirtualHost>  
  2. Header set P3P 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'  
  3. </VirtualHost>  
IIS的服务器

增加一个网站http头来解决问题;
管理工具——〉选择一个网站——〉属性——〉 http头,增加一个http头
然后输入头名:P3P
输入头内容:CP=CAO PSA OUR

jsp页面:

XML/HTML代码
  1. <%  
  2. response.setHeader("P3P","CP=CAO PSA OUR");  
  3. %>  
java代码最简单的办法,增加一个filte:
Java代码
  1. public class TransNameFilter extends HttpServlet implements Filter {  
  2. private static org.apache.commons.logging.Log logWriter =  
  3.    LogFactory.getLog(TransNameFilter.class.getName());  
  4.   
  5. /** 
  6. * 
  7. */  
  8. public TransNameFilter() {  
  9.    super();  
  10.   
  11. }  
  12. /* (非 Javadoc) 
  13.    * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 
  14.    */  
  15. public void init(FilterConfig arg0) throws ServletException {  
  16.   
  17. }  
  18.   
  19. /* (非 Javadoc) 
  20. * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 
  21. */  
  22. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
  23.    throws IOException, ServletException {  
  24.   
  25.    HttpServletRequest hreq = (HttpServletRequest) request;  
  26.    String transName = hreq.getParameter("transName");  
  27.    if (Util.isNullOrEmpty(transName)) {  
  28.     logWriter.fatal(" there is no transName for this request");  
  29.    } else {  
  30.   
  31.     logWriter.info(" transName is " + transName);  
  32.    }  
  33.     
  34.    HttpServletResponse res = (HttpServletResponse) response;  
  35.         //iframe引起的内部cookie丢失  
  36.    res.setHeader("P3P","CP=CAO PSA OUR");  
  37.    if (chain != null)  
  38.     chain.doFilter(request, response);  
  39.   
  40. }  
  41.   
  42. /* (非 Javadoc) 
  43.    * @see javax.servlet.Filter#destroy() 
  44.    */  
  45. public void destroy() {  
  46.   
  47. }  
  48.   
  49. }  

分享到:
评论

相关推荐

    iframe 跨域访问session

    `iframe` 跨域访问`session`正是为了解决这一问题。 首先,让我们了解一下`session`和`cookie`的关系。`session`通常用于存储用户登录状态等临时信息,而`cookie`则作为`session` ID的载体在客户端和服务器之间传递...

    P3P Header解决Cookie跨域的问题

    P3P  P3P是一種被稱為個人隱私安全平臺項目(the ... 當頁面存在iframe時,想要獲取iframe框架裏面的cookie,就要在iframe相應的動態頁面裏面添加P3P Header信息,否則在IE下獲取不到。因為IE有安全策略,限制頁面不

    iframe跨域与session失效问题的解决办法

    总结起来,解决iframe跨域和session失效的问题,关键在于处理第三方cookie的访问控制和IE浏览器的P3P协议要求。合理的P3P声明是关键所在,它能允许浏览器在符合用户隐私政策的前提下,正确地处理来自第三方源的...

    关于Iframe如何跨域访问Cookie和Session的解决方法

    总结来说,解决Iframe跨域访问Cookie和Session的关键在于理解和利用浏览器的特性,如P3P协议,以及巧妙地调整代码结构。同时,对于Session的管理,要意识到它与Cookie之间的关联性。在多系统集成的场景下,这些技巧...

    【ASP.NET编程知识】iframe跨域与session失效问题的解决办法.docx

    在 ASP.NET 开发中,跨域和 Session 失效问题是一个常见的问题,但通过添加“P3P”协议和使用 HttpContext.Current.Session,我们可以解决这个问题,从而确保应用程序的正常运行。 相关知识点: * 跨域和 Session ...

    IFrame中Session丢失的解决办法

    对于IE浏览器,需要在服务器端添加P3P头,例如`Response.AddHeader("P3P", "CP=CAOPSAOUR")`,这有助于浏览器识别网站的隐私政策,从而允许Cookie的存储和读取。这里的`CP="CAOPSAOUR"`表示站点遵循的隐私原则,...

    PHP关于IE下的iframe跨域导致session丢失问题解决方法

    通过设置P3P头,可以通知浏览器允许iframe内的页面使用和共享Session,从而修复登录和其他依赖Session的功能。在开发过程中,对于兼容性问题,尤其是浏览器的差异性,需要进行充分的测试和调试,确保在多种环境下都...

    iframe跨域嵌套自适应高度

    ### iframe跨域嵌套自适应高度 在网页开发过程中,`...正确地配置CORS、合理地利用postMessage API以及理解P3P头的作用,可以帮助开发者有效解决`iframe`跨域嵌套中遇到的问题,实现更加灵活和安全的Web应用开发。

    跨域页面访问问题解决.doc

    跨域页面访问问题解决 跨域页面访问问题是指在多个系统集成的情况下,主系统以 iframe 或 frameset 的方式将...解决这些问题需要使用合适的技术和策略,例如 P3P 认证、script 脚本访问跨域 URL、服务器代理模式等。

    处理session跨域几种方案

    - **P3P协议**:对于不同顶级域名,浏览器默认不允许跨域设置Cookie。但通过添加P3P头(Privacy Policy Platform),如`header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE...

    P3P 和 跨域 (cross-domain) cookie 访问(读取和设置)

    例如,在IE浏览器中,若要在跨域情况下设置cookie,可以通过在服务器端的响应头中添加P3P策略声明,这样浏览器就能根据P3P声明的隐私政策来决定是否允许跨域cookie访问。 根据提供的文档内容,实现跨域cookie设置的...

    关于session丢失问题

    8. **跨域问题**:如果Web应用涉及到跨域访问,Session不会在不同的域名之间共享。解决方法包括使用JSON Web Tokens(JWT)或者将所有资源部署在同一域名下。 9. **用户手动清理Cookie**:用户主动清理浏览器Cookie...

    Yii2下session跨域名共存的解决方案

    这一步的关键在于使用cookie来传递sessionId。因为默认情况下,浏览器的cookie是基于域名设置的,不同域名无法共享。在Yii2中,可以通过设置`user`组件的`identityCookie`属性来指定cookie的domain。例如,将`...

    IE的cookie机制导致的session问题及解决办法.doc

    标题与描述概述的知识点主要集中在Internet Explorer(IE)的Cookie机制如何引发Session丢失的问题,并探讨了解决方案。本文将深入解析这一现象的原因、影响以及如何有效应对。 ### 一、IE Cookie机制与Session关联...

    asp.net(C#)跨域及跨域写Cookie问题

    解决方法是: 代码如下: //www.B.com里的被调用的页面需要写P3P头,从而解除IE对写Cookie的阻止 context.Response.AddHeader(“P3P”, “CP=CAO PSA OUR”); //www.A.com里通过ajax调用www.B.com里的内容时,是跨域...

    PHP如何利用P3P实现跨域

    有别于JS跨域、IFRAME跨域等的常用处理办法,还可以利用P3P来实现跨域。P3P是什么P3P(Platform for Privacy Preferences)是W3C公布的一项隐私保护推荐标准,以为用户提供隐私保护。 P3P标准的构想是:Web 站点的...

    P3P的几篇论文参考

    **P3P(Platform for Privacy Preferences)** 是一种标准,旨在增强互联网用户的隐私控制,让用户在访问网站时能更好地管理自己的个人信息。P3P通过提供一种机器可读的语言,使得浏览器能够自动理解网站的隐私政策...

Global site tag (gtag.js) - Google Analytics