我有兩個網站,假設他們是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標頭。 不須要作任何額外的事情。
您將得到更多信息: