我有两个网站,让我们说他们是example.com和anotherexample.net.上anotherexample.net/page.html,我有一个IFRAME SRC="http://example.com/someform.asp".IFRAME显示用户填写并提交的表单http://example.com/process.asp.当我someform.asp在自己的浏览器窗口中打开表单(" ")时,一切正常.但是,当我someform.asp在IE 6或IE 7中作为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政策是根本原因,下面有完整的解释.
我不久前问了这个问题,发现IE阻止了iframe中的跨域cookie,除非你设置了p3p策略.到目前为止,p3p修复程序在ie中运行得非常好.但是,现在我们在safari中遇到了同样的错误.
我找到了一篇针对safari 的不同p3p政策的文章.我添加了此代码来设置p3p策略,但我仍然收到请求验证令牌错误.
public static void SetP3PCompactPolicy()
{
HttpContext current = HttpContext.Current;
if (current.Request.UserAgent.ToLower().IndexOf("safari") >= 0)
HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\"");
else
HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是什么意思,但它不适用于Safari(5).
此外,当我收到服务器错误时,所有信息都会在报告中发送给我,包括所有http标头.p3p标头永远不会出现在这些错误中.我不确定这是否是设计或是否是问题的指标.
我在iframe中有一个联系表单,它使用验证码,因此需要会话变量.除IE9外,它在每个浏览器中都能正常工作.为了使它在IE8中工作,我在php文档的开头添加了以下行:
header('P3P:CP="CAO IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
Run Code Online (Sandbox Code Playgroud)
但是,这似乎在IE9中不起作用.有任何想法吗?