Cookie已阻止/未保存在Internet Explorer的IFRAME中

我有两个网站,假设他们是example.comanotherexample.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


#1楼

我在这里没有提到的一个解决方案是使用会话存储而不是cookie。 固然,这可能不符合每一个人的要求,但在某些状况下,这是一个简单的解决方案。 express


#2楼

有相似的问题,也去调查今天早上如何生成P3P策略,这里是关于如何生成本身的策略并在网站上使用的帖子:) http://everydayopenslikeaflower.blogspot.com/2009/08/如何对建立-P3P政策和-implement.html npm


#3楼

您还能够将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验证器对全部内容进行测试


#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

相关文章
相关标签/搜索