对于IE来说(默认安全级别下),iframe、img、link等标签都是只发送session cookie(又叫 第一方cookie),拦截本地cookie发送(又叫第三方cookie)。当这些标签跨域引用一个页面,实际上是发起了一次GET请求。

如果这个跨域的请求,HTTP返回头中带有Set-Cookie , 那么这个cookie对浏览器来说,实际上是无效的。

看如下测试

假设有 www.a.com    与 www.b.com 两个域

在 www.b.com 上有一个页面,其中包含一个指向 www.a.com 的iframe

http://www.b.com/test.html 的内容为:
----------------------------------------------------------------------

<iframe width=300 height=300 src="http://www.a.com/test.php" ></iframe>

----------------------------------------------------------------------

http://www.a.com/test.php 是一个对 a.com 域设置 cookie的页面,其内容为:
----------------------------------------------------------------------

<?php

header("Set-Cookie: test=axis; domain=.a.com; path=/");

?>

<script>
    alert(document.cookie);
</script>

----------------------------------------------------------------------

此时我们请求 http://www.b.com/test.html , 他包含一个iframe,会去跨域请求 www.a.com/test.php ,该php页面会尝试 set-cookie

第一次请求, test.php 会 set-cookie,所以浏览器会收到一个cookie。

如果 set-cookie 成功,再次请求该页面,浏览器应该会 sent 刚才 recieve 到的cookie。可是由于前面说的跨域限制,在IE里的iframe标签是 set-cookie不成功的,所以无法sent刚才收到的cookie。 这里无论是 session cookie 还是本地cookie都是一样。

可以看到,第二次发包,还是没能sent出去cookie

但是这种情况在加入了P3P header 后会改变。

P3P header允许跨域访问隐私数据,从而可以跨域set-cookie成功

我们修改 www.a.com/test.php 为

<?php

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

header("Set-Cookie: test=axis; expires=Sun, 23-Dec-2018 08:13:02 GMT; domain=.a.com; path=/");

?>

<script>
alert(document.cookie);
</script>

再次访问两次上面的测试过程

可以看到第二个包已经发送出了收到的cookie

而我们写的javascript也能够弹出cookie了。

值得注意的是,P3P header只需要设置一次,这样跟在这个P3P header后面的所有 set-cookie,都可以跨域访问了。也就是说: 被P3P header设置过一次后,之后的请求不再需要P3P header,也能够在iframe里跨域发送这些cookie。

但是如果用 set-cookie 去改变设置好的cookie,则不再具有这种跨域访问特性。

P3P header 还有一个特点就是同一个包里只能设置一次,后面的P3P Header不会覆盖前面的P3P header,浏览器只认第一个。

P3P 是 The Platform for Privacy Preferences 的简称

更多具体的内容可以参阅W3C的标准 http://www.w3.org/TR/P3P/
在这里,我们看到的很乱的 P3P header里的东西,都不知道是什么乱七八糟的策略内容,实际上这是一些简写

比如 上面用到的

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

CP 是 Compact Policy 的简写

CURa 中 CUR 是 <current/> 的简写, a 是 always 的简写

当然P3P header也可以直接 引用一个 xml 策略文件

比如这么写

HTTP/1.1 200 OK
P3P: policyref="http://catalog.example.com/P3P/PolicyReferences.xml"
Content-Type: text/html
Content-Length: 7413
Server: CC-Galaxy/1.3.18

使用P3P的方法还有很多,这里不一一列举了。

最后,利用P3P Header 的这种特性,在实际攻击中,还是可以利用一下的。

比如利用CRLF插入一个P3P header后,改变一个本地cookie的值,该cookie在之后的过程中可以被iframe引用到,也许会发生一些很奇妙的事情。

具体会变成什么样我也不知道,毕竟web应用安全和环境的关系是越来越紧密了。

转自:

  关于PHP的header("P3P: CP=CURa……")

from:http://www.cnblogs.com/ccdc/archive/2012/05/08/2489535.html

【转】关于PHP的header("P3P: CP=CURa……")的更多相关文章

  1. 写入与读取第三方的 cookie - P3P: CP="CAO PSA OUR"

    应用的场景是这样: 在 a.com 页面显示一个 来自b.com的一张图片 a.com/test.html 的内容: <img src=b.com/a.jpg> 但需求是,当用户访问 b. ...

  2. 关于跨域名的信息共享P3P实例

    首先我这里用到了redis 和 p3p技术.当然任意的nosql都可以满足 模拟的一个登陆访问的客户端. <?php session_start(); $get = $_GET; ') { $t ...

  3. PHP利用P3P实现跨域

    本文转自:点这里 有别于JS跨域.IFRAME跨域等的常用处理办法,还可以利用P3P来实现跨域. P3P是什么 P3P(Platform for Privacy Preferences)是W3C公布的 ...

  4. PHP 通过设置P3P头来实现跨域访问COOKIE

    CentOS的系统(Linux 内核) 编辑HOST vi /etc/hosts 加入127.0.0.1 www.a.com127.0.0.1 www.b.com 首先:创建 a_setcookie. ...

  5. php使用p3p实现cookies跨域设置 实现单点登录,全站登录

    P3P Header is present: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC ...

  6. 通过P3P头实现跨域设置cookie

    PHP的setcookie函数可以设置域,但是只能在当前域内,如果出现多域可由如下办法处理:实现原理:www.b.com/set_cookie.php   在b域名下设置a域名的cookie < ...

  7. 使用p3p跨域设置Cookie

    有些时候不能将url上的参数传来传去,比如与调用某开放平台上的接口,这时候可能需要借助Cookie来进行处理了,但这里可能又涉及到跨域的问题. 如果浏览器开启了对Cookie的支持,按照Cookie ...

  8. 通过设置P3P头来实现跨域访问COOKIE

    通过设置P3P头来实现跨域访问COOKIE 实际工作中,类似这样的要求很多,比如说,我们有两个域名,我们想实现在一个域名登录后,能自动完成另一个域名的登录,也就是PASSPORT的功能. 我只写一个大 ...

  9. P3P解决cookie跨域

    P3P是什么 P3P(Platform for Privacy Preferences)是W3C公布的一项隐私保护推荐标准,以为用户提供隐私保护.   P3P标准的构想是:Web 站点的隐私策略应该告 ...

随机推荐

  1. Google protobuf

    个人理解: 定义.proto文件就是指明消息里包含的成员和类型,protoc会compile成相应的java文件包含interface和implementation class,然后在构建messag ...

  2. Maven Build profiles

    They modify the POM at build time, and are meant to be used in complementary sets to give equivalent ...

  3. 【Oracle XE系列之二】PLSQL Developer 远程连接Oracle XE数据库

    1.去http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html下载Instant Cli ...

  4. IE6-8支持css3属性

    方法一.让IE6-8支持css3属性 <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shi ...

  5. 转:SSL协议详解

    http://kb.cnblogs.com/page/162080/ 背景介绍    最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SS ...

  6. xcrun: error: active developer path ("/Volumes/Xcode/Xcode6-Beta.app/Contents/Developer") does not exist, use xcode-select to change

    When using MacOS with xcode6.4, i always meet these error: xcrun: error: active developer path (&quo ...

  7. python xlrd和xlwtxlutils包的使用

    安装xlrd读取模块 首先去官网或者pypi下载安装包,然后解压到任意目录 在dos下进入该目录,执行python setup.py install安装 验证成功进入python,执行import 包 ...

  8. USB描述符概述

    在USB总线接口协议中,规定了一些标准的USB描述符,如表所示. 对于USB设备来说,有些USB描述符是必需的,例如: 设备描述符 配置描述符 字符串描述符 接口描述符 端点描述符 其余一些描述符并非 ...

  9. Protobuf C/C++实战笔记(1)

    前言: Protobuf作为数据交换格式, 被很多人喜欢. 数据压缩比高, 向后兼容性强, 性能优异, 而且对平台中性, 支持多语言(C/C++, JAVA, Python). 优点太多, 实在不胜枚 ...

  10. 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果

    去年盛夏之时,曾写过“小tip: 使用CSS将图片转换成黑白”一文,本文的模式以及内容其实走得是类似路线.CSS3 → SVG → IE filter → canvas. 前段时间,iOS7不是瓜未熟 ...