我有两个网站,假设他们是example.com
和anotherexample.net
。 在anotherexample.net/page.html
,我有一个IFRAME SRC="http://example.com/someform.asp"
。 IFRAME显示一个表单供用户填写并提交到http://example.com/process.asp
。 当我在本身的浏览器窗口中打开表单(“ someform.asp
”)时,一切正常。 可是, 当我在IE 6或IE 7 someform.asp
加载为IFRAME时,example.com的cookie不会保存。 在Firefox中,此问题不会出现。 php
出于测试目的,我在http://newmoon.wz.cz/test/page.php上建立了相似的设置。 html
example.com
使用基于cookie的会话(我无能为力),因此没有cookie, process.asp
将不会执行。 如何强制IE保存这些cookie? node
嗅探HTTP流量的结果:在GET /someform.asp响应中,有一个有效的每会话Set-Cookie头(例如Set-Cookie: ASPKSJIUIUGF=JKHJUHVGFYTTYFY
),但在POST /process.asp请求中,没有Cookie头一点都不 git
Edit3:一些AJAX +服务器端脚本显然可以回避这个问题,但这看起来很是像一个bug,并且还会打开一组全新的安全漏洞 。 我不但愿个人应用程序使用bug +安全漏洞的组合只是由于它很容易。 github
编辑: P3P政策是根本缘由 ,下面有完整的解释。 ajax
我在这里没有提到的一个解决方案是使用会话存储而不是cookie。 固然,这可能不符合每一个人的要求,但在某些状况下,这是一个简单的解决方案。 express
有相似的问题,也去调查今天早上如何生成P3P策略,这里是关于如何生成本身的策略并在网站上使用的帖子:) http://everydayopenslikeaflower.blogspot.com/2009/08/如何对建立-P3P政策和-implement.html npm
您还能够将p3p.xml和policy.xml文件组合在一块儿: json
/home/ubuntu/sites/shared/w3c/p3p.xml ubuntu
<META xmlns="http://www.w3.org/2002/01/P3Pv1"> <POLICY-REFERENCES> <POLICY-REF about="#policy1"> <INCLUDE>/</INCLUDE> <COOKIE-INCLUDE/> </POLICY-REF> </POLICY-REFERENCES> <POLICIES> <POLICY discuri="" name="policy1"> <ENTITY> <DATA-GROUP> <DATA ref="#business.name"></DATA> <DATA ref="#business.contact-info.online.email"></DATA> </DATA-GROUP> </ENTITY> <ACCESS> <nonident/> </ACCESS> <!-- if the site has a dispute resolution procedure that it follows, a DISPUTES-GROUP should be included here --> <STATEMENT> <PURPOSE> <current/> <admin/> <develop/> </PURPOSE> <RECIPIENT> <ours/> </RECIPIENT> <RETENTION> <indefinitely/> </RETENTION> <DATA-GROUP> <DATA ref="#dynamic.clickstream"/> <DATA ref="#dynamic.http"/> </DATA-GROUP> </STATEMENT> </POLICY> </POLICIES> </META>
我发现添加标头的最简单方法是经过Apache代理并使用mod_headers,以下所示:
<VirtualHost *:80> ServerName mydomain.com DocumentRoot /home/ubuntu/sites/shared/w3c/ ProxyRequests off ProxyPass /w3c/ ! ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyPreserveHost on Header add p3p 'P3P:policyref="/w3c/p3p.xml", CP="NID DSP ALL COR"' </VirtualHost>
所以咱们将除了/w3c/p3p.xml以外的全部请求代理到咱们的应用服务器。
您可使用W3C验证器对全部内容进行测试
我知道在这个问题上作出贡献有点晚了,可是我失去了不少时间,也许这个答案对某些人有帮助。
我试图在个人网站上调用第三方cookie,固然,即便在安全级别较低的状况下,它也没法在Internet Explorer 10上运行...不要问我缘由。 在iframe中,我用ajax调用了read_cookie.php(echo $ _COOKIE)。
我不知道为何我没法设置P3P策略来解决问题......
在个人搜索过程当中,我看到了一些关于在JSON中使用cookie的工做。 我甚至没有尝试,由于我认为若是cookie不会经过iframe,它将再也不经过数组...
猜猜看,它作到了! 所以,若是你对你的cookie进行json_encode,而后在你的ajax请求以后解码,你就会获得它!
也许有一些我错过的东西,若是我作了,我全部的道歉,但我从未见过如此愚蠢的东西。 为安全起见阻止第三方cookie,为何不,但若是编码则让它经过? 安全如今在哪里?
我但愿这篇文章会对某人有所帮助,若是我错过了一些东西并且我很蠢,请教育我!
任何在node.js中遇到此问题的人。
而后添加此p3p模块,并在中间件上启用此模块。
npm install p3p
我正在使用快递,因此我在app.js中添加它
首先要求app.js中的模块
var express = require('express'); var app = express(); var p3p = require('p3p');
而后用它做为中间件
app.use(p3p(p3p.recommended));
它将在res对象中添加p3p标头。 不须要作任何额外的事情。
您将得到更多信息: