我有两个网站,比如说example.com和anotherexample.net。 在anotherexample.net/page.html上,我有一个IFRAME SRC=“http://example.com/someform.asp”。IFRAME显示一个表单供用户填写并提交到http://example.com/process.asp。当我在它自己的浏览器窗口中打开表单(“someform.asp”)时,一切正常。 然而,当我在ie6或ie7中加载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,而且它还打开了一组全新的安全漏洞。我不希望我的应用程序使用漏洞+安全漏洞的组合只是因为它很容易。

编辑:P3P政策是根本原因,详细解释如下。


当前回答

一种可能的做法是将域添加到工具-> internet选项-> privacy -> sites: somedomain.com -> allow -> OK。

其他回答

我可以通过简单地在IFrame (PHP解决方案)中添加这个小标题来消除邪恶的眼睛:

header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');

记住按ctrl+F5重新加载你的网站,否则资源管理器可能仍然会显示邪恶之眼,尽管它工作正常。这可能是为什么我有这么多问题让它工作的主要原因。

根本不需要策略文件。

编辑: 我发现了一篇很好的博客文章,解释了IFrames中cookie的问题。它在c#代码中也有一个快速修复: 框架,ASPX页面和拒绝的cookie

这个问题被埋在其他答案的评论中,但我几乎没有注意到,所以它似乎应该有自己的答案。

回顾一下:为了让IE接受第三方cookie,你需要为你的文件提供一个名为p3p的http头文件,格式如下:

CP="my compact p3p policy"

但是,在这一点上,p3p作为一个标准几乎已经死了,你可以很容易地让IE工作,而不需要投入时间和法律资源来创建一个真正的p3p策略。这是因为如果你的p3p策略头是无效的,IE实际上会把它当作一个好策略,并接受第三方cookie。你可以使用这样的p3p头文件

CP="This site does not have a p3p policy."

您可以选择包含一个页面链接,以解释为什么您没有p3p策略,就像谷歌和Facebook所做的那样(它们指向这里:https://support.google.com/accounts/answer/151657和这里:https://www.facebook.com/help/327993273962160/)。

最后,需要注意的是,第三方网站提供的所有文件都需要p3p头文件,而不仅仅是设置cookie的头文件,所以你可能不能在PHP、asp.net等代码中这样做。你最好在web服务器级别设置(即在IIS或Apache中)。

我也有这个问题,我想我会张贴我在我的MVC2项目中使用的代码。当你在页面生命周期中添加头时要小心,否则你会得到一个HttpException“服务器不能在HTTP头发送后追加头”。我在onactionexecution方法上使用了自定义ActionFilterAttribute(在动作执行之前调用)。

/// <summary>
/// Privacy Preferences Project (P3P) serve a compact policy (a "p3p" HTTP header) for all requests
/// P3P provides a standard way for Web sites to communicate about their practices around the collection, 
/// use, and distribution of personal information. It's a machine-readable privacy policy that can be 
/// automatically fetched and viewed by users, and it can be tailored to fit your company's specific policies.
/// </summary>
/// <remarks>
/// More info http://www.oreillynet.com/lpt/a/1554
/// </remarks>
public class P3PAttribute : ActionFilterAttribute
{
    /// <summary>
    /// On Action Executing add a compact policy "p3p" HTTP header
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext.Current.Response.AddHeader("p3p","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

        base.OnActionExecuting(filterContext);
    }
}

使用示例:

[P3P]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

这是一个很好的话题,但我发现一个重要的细节(这是必不可少的,至少在我的情况下),没有张贴在这里或其他任何地方(我道歉,如果我刚刚错过了它)是P3P行必须在每个文件的头从第三方服务器发送,甚至文件没有设置或使用cookie,如Javascript文件或图像。否则cookie将被阻止。我有更多关于这个的帖子在这里:http://posheika.net/?p=110

更好的解决方案是在iframe中对页面进行Ajax调用,以获取/设置cookie…