Php 从不同的域src iframe设置cookie

Php 从不同的域src iframe设置cookie,php,security,iframe,cookies,cross-domain,Php,Security,Iframe,Cookies,Cross Domain,以下是相关页面: 主页(@customazon.com)加载包含辅助域(@gamekeg.com)的iframe。我想允许用户使用提供的密码登录到管理控制面板。问题是,由于它是第二个域,浏览器将其视为“第三方Cookie”,大多数浏览器会直接拒绝它们。我需要找到一种方法,允许在这个iframe中设置cookies。要求用户调整cookie设置不是一个选项 我尝试过的事情: 在标题中设置P3P短版本(CP=字符串的许多不同版本): 页眉('P3P:CP=“IDC DSP COR ADM DEVi

以下是相关页面:

主页(@customazon.com)加载包含辅助域(@gamekeg.com)的iframe。我想允许用户使用提供的密码登录到管理控制面板。问题是,由于它是第二个域,浏览器将其视为“第三方Cookie”,大多数浏览器会直接拒绝它们。我需要找到一种方法,允许在这个iframe中设置cookies。要求用户调整cookie设置不是一个选项

我尝试过的事情:

  • 在标题中设置P3P短版本(CP=字符串的许多不同版本): 页眉('P3P:CP=“IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT”)

  • 使用policy.P3P和P3P.xml文件创建P3P长版本(可能是错误的,但我已尽了最大努力)

  • 一些奇怪的javascript加载一个隐藏的iframe并发布到其中(Safari变通方法?)

  • 一点也没有起作用。如果能提供任何帮助来找到一种方法来实现这一点,那就太好了。

    (我可能在这个答案中改变了域,但理论应该是一样的。)

    您最好的选择是从gamekeg.com登录页面访问customazon.com(您需要发送一些特殊的标题以允许跨域请求-请阅读该链接的更多信息)。在正常情况下,这是不可能的,除非你同时控制两个站点(你似乎控制了)

    在gamekeg.com登录页面上,用户成功登录后,您可以这样拨打电话:

    // I don't expect you to use jQuery, but I don't recall the entire
    // AJAX process off of the top of my head. You may have to set
    // xhr.withCredentials = true or something.
    $.ajax(
        "http://customazon.com/ajax_login.php",
        {
            "username": <?php echo $username; ?>,
            "password_hash": <?php echo $password_hash; ?>
        }
    );
    
    然后,在框架容器上,您可以每隔一段时间进行一次检查,查看用户是否已登录(
    readCookie
    取自):

    函数readCookie(名称){
    变量nameEQ=name+“=”;
    var ca=document.cookie.split(“;”);
    对于(变量i=0;i

    但是,如果您可以使用Flash,则该过程可能会加快,因为Flash请求不关心跨域策略。但是,我没有Flash方面的技能来提供一个示例,而且可能还有很多示例。

    我已经应用了您建议的内容,除了checkAjaxLogin之外,其他都是因为我不太确定它的作用或者为什么需要它。ajax似乎发布正确。ajax\u登录似乎正在发挥作用。crossdomain.xml就在那里。但是,我仍然没有看到设置任何COOKIE。如果您现在尝试登录,您将在屏幕顶部看到一个var_dump($_COOKIE)(来自gamekeg.com)。登录后,您将看到一个警报(),显示在customazon上运行的ajax的响应。它显示数据已被接收,setcookie已被调用,并且还打印出$_COOKIE(来自customazon.com)。两个cookie var_转储都显示空数组。我现在错过了什么?我没有看到任何画面。他们应该在哪里?
    // Send appropriate cross-domain headers here.
    // In addition, you must configure your crossdomain.xml in your root.
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
    header("Access-Control-Allow-Credentials: true");
    header("Access-Control-Allow-Origin: http://source.com");
    header("Access-Control-Allow-Headers: Content-Type, *");
    if (isset($_POST["username"]) && isset($_POST["password_hash"])) {
        setcookie("username", $_POST["username"], time() + 24 * 60 * 60);
        setcookie("password", $_POST["password_hash"], time() + 24 * 60 * 60);
    }
    
    function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
                var c = ca[i];
                while (c.charAt(0)==' ') c = c.substring(1,c.length);
                if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return null;
    }
    
    function checkAjaxLogin() {
        if (readCookie("username") !== null && readCookie("password")) {
            // You're logged in now; refreshing the page should
            // do the rest, assuming the cookies are named correctly.
            window.location.refresh();
        }
    }