Setting a P3P header in Rails

点击上方“蓝色字”可关注我们!

 

 

1

什么是Cookie

 

    Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。


    Cookie 实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器 会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户 状态。服务器还可以根据需要修改Cookie的内容。

2

Cookie的不可跨域名性

 

    很 多网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会 也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?答案是否定的。Cookie具有不可跨域名性。根 据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作 Google的Cookie,而不能操作Baidu的Cookie。

    Cookie 在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安 全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的 Cookie。需要注意的是,虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者 同样不能互相操作彼此的Cookie。

 

3

Cookie的域名

 

    Cookie是不可跨域名的。域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie。

正 常情况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能 交互使用Cookie,因为二者的域名并不严格相同。如果想所有helloweenvsfei.com名下的二级域名都可以使用该Cookie,需要设置 Cookie的domain参数,例如:

Cookie cookie = new Cookie("time","20080808"); // 新建Cookie
cookie.setDomain(".helloweenvsfei.com");  // 设置域名
cookie.setPath("/");    // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE);  // 设置有效期
response.addCookie(cookie);   // 输出到客户端

4

P3P?

 

    P3P 全称 Platform for Privacy Preferences,隐私设定平台规范。这个规范极其复杂,若要讲清楚,天都黑了一半。简言之,就是网站向浏览器声明自己的隐私政策,比如网站是否搜 集访问者的个人信息,设置 cookie 的用途等等。浏览器会依据设置,决定在第三方请求的条件下是否接受网站的 cookie。完整地部署 P3P 包括设立隐私政策文件(policy.html)、原则档(policy.xml)、参考档(p3p.xml)

    P3P header允许跨域访问隐私数据,从而可以跨域set-cookie成功, Firefox、chrome等不用P3P也可以跨域,但是IE必须用加P3P的头信息才可以跨域, 好在还是有比较简单的方法的,就是发送 P3P 相关的 HTTP header:

SP.NET:

HttpContext.Current.Response

    .AddHeader("p3p", 

    "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""

);

PHP:

header(

    'P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'

);

JSP:

response.setHeader(

    "P3P",

    "CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'"

);

 

在rails中设定headers有两种方式, 第一种:

   class ApplicationController < ActionController::Base  
     before_filter :set_p3p  
     private  
     def set_p3p  
         headers['P3P'] = 

            'CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV"'  
      end  
   end  

 

第二种, 安装gem包:rack-p3p
如果你的网站是一个iframe框架,那么IE不允许我们设置cookies, 除非你已经设置了,而且p3p头部信息必须在设置cookies之前设置。
在gemfile中添加 gem 'rack-p3p', 并以插件的形式添加到 config/application.rb中

config.middleware.insert_before ActionDispatch::Session::CookieStore, Rack::P3p

 

这个gem包非常小,只有20多行代码,详细如下:

module Rack
 class P3p
   POLICY = 'CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"'

   def initialize(app)
     puts "initialize Rack::P3p.."
     @app = app
   end

   def call(env)
     response = @app.call(env)
     insert_p3p(response)
   end

   private
     def insert_p3p(response)
       if response.first == 304
         response[1].delete('Set-Cookie')
       else
         response[1].update('P3P' => POLICY)
       end
       response
     end
 end
end

更多精彩内容:


 

 https://robanderson123.wordpress.com/2011/02/25/p3p-header-hell/

http://threetreeslight.com/post/50977496283/rails-p3p-privacy-policy

你可能感兴趣的:(p3p)