iframe、跨域 cookie、p3p 策略和 safari 错误:未提供所需的防伪令牌或无效

Posted

技术标签:

【中文标题】iframe、跨域 cookie、p3p 策略和 safari 错误:未提供所需的防伪令牌或无效【英文标题】:Iframe, cross-domain cookies, p3p policy, and safari with error: A required anti-forgery token was not supplied or was invalid 【发布时间】:2011-09-01 19:34:47 【问题描述】:

我不久前问过这个question,发现IE 会阻止iframe 中的跨域cookie,除非您设置p3p policy。到目前为止,p3p 修复在 ie 中运行良好。但是,现在我们在 safari 中遇到了同样的错误。

我发现一篇带有不同 p3p policy 的文章用于 safari。我添加了此代码来设置 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\"");

我不确定这意味着什么,但它不适用于 Safari (5)。

此外,当我收到服务器错误时,所有信息都会在报告中发送给我,包括所有 http 标头。 p3p 标头永远不会出现在这些错误中。我不确定这是设计使然,还是表明问题正在发生。

【问题讨论】:

【参考方案1】:

问题在于 Safari 不允许在 iframe 中设置 cookie,除非用户与该 iframe 交互。对于某些人来说,这意味着点击链接。我找到了一个更好的解决方案,那就是进行重定向。

首先,我把这个表格放在我的页面上。实际上,我将它放在 iframe 中提供的每个视图所使用的母版页中。

<% if(SecurityHelper.BrowserIsSafari)  %>
    <% using (html.BeginForm("SafariRedirect", "Framed", FormMethod.Post, new  id="safari-fix-form" ))  %>
       <%: Html.Hidden("safariRedirectUrl")%>
    <%  %>
<%  %>

因为我只希望它在用户使用 safari 时工作,所以我在静态帮助器类中创建了这个属性来检查用户代理

public static bool BrowserIsSafari

    get  return HttpContext.Current.Request.UserAgent.ToLower().IndexOf("safari") >= 0; 

然后,在我的控制器中,我有以下操作

[HttpPost]
public ActionResult SafariRedirect(string safariRedirectUrl)

    Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "cookie ok"));

    return Redirect(safariRedirectUrl);

在我的母版页的页眉中,我在同一 if 语句中声明了我的脚本,该语句确定是否呈现表单。在我的脚本文件中,我有这个 jquery

$(function () 

    if ($.browser.safari == true && document.cookie.indexOf("safari_cookie_fix") == -1) 
        var url = location.href;

        $('#safariRedirectUrl').val(url);
        $('#safari-fix-form').submit();
    

);

iframe 首次加载页面时,如果是 safari 且未设置 cookie,则会发布表单,设置 cookie,并将用户重定向回相同的 url。

【讨论】:

我有非常相似的问题 (***.com/questions/6125741/…),所以如果这对我有帮助,请随时添加您的评论,我会给您赏金。 hm 我用 cookie 和我的 safari 递归添加了表单和操作。 document.cookie.indexOf("safari_cookie_fix") 始终为空。但在开发人员工具下,我看到“cookie ok” 我相当肯定上述方法在 Safari 4.5 中对我有用。不过我最终还是转储了 cookie,因为 IE 中的安全设置也可以阻止第三方 cookie。 我在 safari 5.1.4 下。由于某些原因,我的 cookie 是空的...对于 IE,我添加了 p3p 标头并且它可以工作 很遗憾,这个漏洞似乎已经被堵住了。更多讨论请参见***.com/questions/9930671/…。

以上是关于iframe、跨域 cookie、p3p 策略和 safari 错误:未提供所需的防伪令牌或无效的主要内容,如果未能解决你的问题,请参考以下文章

用P3P header解决iframe跨域访问cookie

用P3P header解决iframe跨域访问cookie

PHP利用P3P实现跨域

PHP利用P3P实现跨域

iFrames + 谷歌分析 + Cookies + P3P

IE、P3P、IFrame 和阻止的 cookie(在页面主机页面请求个人信息之前有效)