我有两个网站,假设他们是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中,此问题不会出现。
出于测试目的,我在http://newmoon.wz.cz/test/page.php上创建了类似的设置。
example.com
使用基于cookie的会话(我无能为力),所以没有cookie, process.asp
将不会执行。 如何强制IE保存这些cookie?
嗅探HTTP流量的结果:在GET /someform.asp响应中,有一个有效的每会话Set-Cookie头(例如Set-Cookie: ASPKSJIUIUGF=JKHJUHVGFYTTYFY
),但在POST /process.asp请求中,没有Cookie头一点都不
Edit3:一些AJAX +服务器端脚本显然能够回避这个问题,但这看起来非常像一个bug,而且还会打开一组全新的安全漏洞 。 我不希望我的应用程序使用bug +安全漏洞的组合只是因为它很容易。
编辑: P3P政策是根本原因 ,下面有完整的解释。
#1楼
我在这里没有提到的一个解决方案是使用会话存储而不是cookie。 当然,这可能不符合每个人的要求,但在某些情况下,这是一个简单的解决方案。
#2楼
有类似的问题,也去调查今天早上如何生成P3P策略,这里是关于如何生成自己的策略并在网站上使用的帖子:) http://everydayopenslikeaflower.blogspot.com/2009/08/如何对创建-P3P政策和-implement.html
#3楼
您还可以将p3p.xml和policy.xml文件组合在一起:
/home/ubuntu/sites/shared/w3c/p3p.xml
<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验证器对所有内容进行测试
#4楼
我知道在这个问题上做出贡献有点晚了,但是我失去了很多时间,也许这个答案对某些人有帮助。
我试图在我的网站上调用第三方cookie,当然,即使在安全级别较低的情况下,它也无法在Internet Explorer 10上运行...不要问我原因。 在iframe中,我用ajax调用了read_cookie.php(echo $ _COOKIE)。
我不知道为什么我无法设置P3P策略来解决问题......
在我的搜索过程中,我看到了一些关于在JSON中使用cookie的工作。 我甚至没有尝试,因为我认为如果cookie不会通过iframe,它将不再通过数组...
猜猜看,它做到了! 因此,如果你对你的cookie进行json_encode,然后在你的ajax请求之后解码,你就会得到它!
也许有一些我错过的东西,如果我做了,我所有的道歉,但我从未见过如此愚蠢的东西。 为安全起见阻止第三方cookie,为什么不,但如果编码则让它通过? 安全现在在哪里?
我希望这篇文章会对某人有所帮助,如果我错过了一些东西而且我很蠢,请教育我!
#5楼
任何在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标头。 不需要做任何额外的事情。
您将获得更多信息:
https://github.com/troygoode/node-p3p
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3164602