`
berrywu
  • 浏览: 125550 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

用P3P header解决iframe跨域访问cookie[各种语言]

 
阅读更多

各种语言在头文件中,加入P3P协议代码,解决iframe跨域访问:

理论很简单,模式和大多请求返回状态的SSO差不多.但是有几个地方需要注意的。

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") 


-----------------------------   以下是一个应用的跨域访问流程案例   ---------------------------------------

目前在整合几个应用时,遇到了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",就是指定一个策略文件。

具体请看这里 .

--------------------------     OK OVER      --------------------------------

下面是摘抄的一段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代码

<?php  

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

?>  

这样就能接受第三方的Cookie啦。

 

lighttpd的服务器

 

XML/HTML代码

server.modules     = ("mod_setenv")  

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代码

< VirtualHost >   

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

</ 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代码

public   class  TransNameFilter  extends  HttpServlet  implements  Filter {  

private   static  org.apache.commons.logging.Log logWriter =  

   LogFactory.getLog(TransNameFilter.class .getName()); 

public  TransNameFilter() {  

   super ();  
}  

/* (非 Javadoc)  

   * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)  

   */   

public   void  init(FilterConfig arg0)  throws  ServletException {

}  

  

/* (非 Javadoc)  

* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)  

*/   

public   void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  

   throws  IOException, ServletException {  

   HttpServletRequest hreq = (HttpServletRequest) request;  

   String transName = hreq.getParameter("transName" );  

   if  (Util.isNullOrEmpty(transName)) {  

    logWriter.fatal(" there is no transName for this request" );  

   } else  {  

  

    logWriter.info(" transName is "  + transName);  

   }  

   HttpServletResponse res = (HttpServletResponse) response;  

        //iframe引起的内部cookie丢失   

   res.setHeader("P3P" , "CP=CAO PSA OUR" );  

   if  (chain !=  null )  

    chain.doFilter(request, response);  
}

/* (非 Javadoc)  

   * @see javax.servlet.Filter#destroy()  

   */   

public   void  destroy() {  

}

}  

此文整理来自:http://www.cnblogs.com/Guroer/archive/2011/02/15/1955426.html

其它几个跨域访问文章:

http://blog.csdn.net/lanmao100/archive/2008/04/25/2328491.aspx   用P3P header解决iframe跨域访问cookie/session

http://viralpatel.net/blogs/2008/12/how-to-set-third-party-cookies-with-iframe.html   How to set third-party cookies with iframe

http://hi.baidu.com/aullik5/blog/item/cde7f31efc3953f2e0fe0b46.html   P3P Header Tips

分享到:
评论

相关推荐

    iframe 跨域访问session

    iframe 跨域访问session问题解决方法

    P3P Header解决Cookie跨域的问题

    P3P Header解决Cookie跨域的问题,需要的朋友可以参考一下

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

    何为跨域跨域session/cookie? 也就是第三方session/cookie。第一方session/cookie指的是访客当前访问的网站给访客的浏览器设置的seesion /cookie, 会被存储在访客的计算机上。第三方session/cookie指的是当前访问的...

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

    解决跨域页面访问问题的办法是,在子系统的登录代码中加入 P3P 的认证,即允许第三方读取 cookie,这样 cookie 值才能被浏览器正确的读取并保存。P3P(Platform for Privacy Preferences)是一种隐私保护协议,允许...

    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 和 跨域 (cross-domain) cookie 访问(读取和设置)

    比如要访问b站在a站设置一个cookies,则可以这样做: 1.在b.com下建立一个文件cookies....&#37; Response.AddHeader “P3P”, “CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

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

    今天搞的一个登录页面,被...最后的解决方法是在那个登录页面里加上以下代码: 复制代码 代码如下: &lt;span xss=removed&gt;header(‘P3P: CP=”ALL ADM DEV PSAi COM OUR OTRo STP IND ONL”‘); session_start();&lt;/span

    P3P的几篇论文参考

    P3P问题的多解现象的概率研究_英文 基于P3P的网络隐私保护等

    P3P算法整理1

    P3P算法整理1

    P3P4实验室基本要求

    P3P4实验室基本要求.介绍了P3P4实验室的相关设计及基本要求。

    P3P 简介

    隐私偏好设定平台(Platform for Privacy Preference,P3P)方案通过为隐私策 略提供一个标准的可机读格式

    PnP_P3P_UPnP.rar

    PnP算法原理及代码,包括DLT、P3P、PST、RPnP

    最新单片机仿真 将P1口状态送入P0、P2、P3

    最新单片机仿真 将P1口状态送入P0、P2、P3最新单片机仿真 将P1口状态送入P0、P2、P3最新单片机仿真 将P1口状态送入P0、P2、P3最新单片机仿真 将P1口状态送入P0、P2、P3最新单片机仿真 将P1口状态送入P0、P2、P3最新...

    论文研究-信息共享中的P3P隐私保护技术及其实现方法研究 .pdf

    信息共享中的P3P隐私保护技术及其实现方法研究,王智慧,,Internet和Web技术的发展为人们的生活带来了极大的便利,但同时也增加了个人隐私信息泄漏的风险。W3C提出的P3P(Platform for Privacy Preference

    272-将P1口状态送入P0、P2、P3(51单片机C语言实例Proteus仿真和代码)

    272-将P1口状态送入P0、P2、P3(51单片机C语言实例Proteus仿真和代码)272-将P1口状态送入P0、P2、P3(51单片机C语言实例Proteus仿真和代码)272-将P1口状态送入P0、P2、P3(51单片机C语言实例Proteus仿真和代码)272-将P1...

Global site tag (gtag.js) - Google Analytics