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

相關文章
相關標籤/搜索