阻止第三方的cookies - 解决方法(Facebook应用程序等)(block third p

2019-07-30 14:07发布

Safari浏览器在Mac上有Block cookies设置为From third parties and advertisers在默认情况下。

它停止共享对象从工作,如果嵌入的SWF是从不同的域。

这个问题并不新鲜: Safari浏览器的第三方cookie的IFRAME欺骗不再工作?

有没有人找到了解决(其他然后使会话ID通过GET / POST PARAMS在每个请求)?

注:我的网站,这是嵌入SWF进不去了,所以没有办法改变HTML或把任何JavaScript等

Answer 1:

function setCookie(){
   if ( navigator.userAgent.indexOf('Safari') != -1 &&
        navigator.userAgent.indexOf('Chrome') == -1 ){
      window.open('safari.php','','width=200,height=100' );
   }
}

// then we set the cookie in safari.php

来源: http://www.reizbombardement.de/archives/safari-5-1-4-enforces-cookie-policy

// UPDATE 2013年7月23日

固定用这个问题的这种蹩脚的方式工作,直到Safari浏览器6。

请参阅@Fabio安栋梁及以下@ncubica意见。

//由法比奥·安图内斯UPDATE 2013年7月23日

这里是我的代码

在登陆页面,我们将有关于应用程序和一个按钮,说像“输入”的简要说明。 我使用jQuery来简化这个过程,创建click事件侦听器,我只是把javascript代码,因为我假设你已经有了目标网页的HTML代码的其余部分:

$(document).on("click", "#bt-landing", function(){
var left = (screen.width/2)-(500/2);
            var top = (screen.height/2)-(250/2);
            window.open('URL_FOR_THE_PHP_THAT_WILL_CREATE_THE_SESSION', '_blank', 'width=500,height=250,toolbar=0,location=0,menubar=0, top='+top+', left='+left);
});

这您将通过250像素,集中在屏幕上打开一个小窗口,与500。

我有一个小窗口中的代码是这样的:

<?php setcookie("safari_cookie", "1");?>
    <html>
        <head>
            <meta charset="utf-8">
            <title>THE NAME OF YOUR APP OR SOMETHING THAT THE USER WE'LL READ AND ASSUME THAT THIS SMALL WINDOW IS RELIABLE</title>
        </head>
        <body>
        <script type="text/javascript">
        $(document).ready(function(){
           setTimeout(function(){window.close()},1000);
        })
        </script>
        </body>
    </html


Answer 2:

Safari does still block cookies from domains which it has not visited in the top window.

To workaround this, we count($_COOKIES) in PHP and direct the browser to a page on our domain whose job it is to simply send the browser back to where it came from. It's a dirty trick which means some users will unnecessarily get moved away and then back, but then, the web is full of dirty tricks.

If you cannot set top.location.href to a page on the domain which needs to set cookies, or you cannot alter a page on said domain, then I can confidently say you'll need to use URL-based sessions.

However, an alternative option (which still requires being able to create a page on the domain) is to request that the user clicks on your SWF, you can then trigger window.open and have the URL point to the page you created. All it needs to do is load successfully, then the user (or even JS on the popup page itself) can close the popup. You may then set cookies.


I develop Facebook apps, which live inside iframes, which suffer this problem. Every single app has to be shipped with this fix.



Answer 3:

我可以从非常最近的经验说,这是不使用Safari在Mac上出了问题,我也没有经历过这是一个问题。

你提到的设置是从第三方拦截Cookie:(?第一方)共享对象的存储是永远不会从第三方,这是从你所访问的网站。 因此,我不认为这将不会是一个问题。

使用Flash Player设置面板,用户可以禁用SharedObject (或限制的存储空间的量)。 因此,在一般情况下,你的应用程序应该在处理的情况下SharedObject不可用。

不过,我想大多数用户都没有意识到的SharedObject ,他们可以将其禁用。



Answer 4:

您可能需要使用跨域策略文件为SWF才能正常工作。

http://kb2.adobe.com/cps/142/tn_14213.html



Answer 5:

我已经解决了这种方式,但最好使用HTML5的localStorage,使web服务宁静,因为持有会话变量在Server2上使您的应用程序没有得到很好的可扩展性。 下面的代码我用解决第三方cookie的问题。 基本上server1的客人先走到Server2,以便采取“硬币:d”,突然他回来到server1。 这样服务器2的会话变量是所有导航avaliable。 www.yourserver.com/index.html页

<script src="js/jquery.cookie.js" type="text/javascript"></script>
<script src="js/mobile-detect.js" type="text/javascript"></script>
<script>
var md = new MobileDetect(window.navigator.userAgent);
if (md.userAgent()=='Safari') {
    var firstsafariuser = $.cookie('safari-user');
    if (firstsafariuser != 'true') {
        $.cookie('safari-user', true);
        location.href='http://www.yourserver2.com/coin.php?frompage='
        +location.href.replace(location.hash,"")+'&hashtags='+location.hash.substr(1);
    }
}
</script>

www.yourserver2.com/coin.php

<?php
session_start(); 
if (isset($_GET["frompage"])&&$_GET["frompage"]!=null){
    $url=$_GET["frompage"];
} else {
    $url='http://www.yourserver.com';
}
if (isset($_GET["hashtags"])&&$_GET["hashtags"]!=null){
    $hash='#'.$_GET["hashtags"];
} else {
    $hash='';
}
header('Location:'.$url.$hash);
?>

PS window.open都见过这样一种弹出式的,所以你可能会与广告阻滞剂或浏览器设置问题。



Answer 6:

我想补充一个更清洁的方式,而不setTimeout和jQuery的或为safari.xxx页面。 做工精细了最新的iOS(8.1.2),我知道8.1.0有一个错误在窗口/标签不会关闭。

下面是代码:

<%
request.getSession(true); //or anyway to set the cookie depending on your language (jsp here)
%>

<script type="text/javascript">
    window.addEventListener("load", window.close);
</script>

因为它是由来自用户的点击发起的弹出是不是在我的案件的问题。



文章来源: block third party cookies - workaround (facebook apps etc)