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

别来无恙 提交于 2020-02-27 08:26:25

我有两个网站,假设他们是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中,此问题不会出现。

出于测试目的,我在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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!