web-dev-qa-db-fra.com

bloquer les cookies tiers - solution de contournement (applications Facebook, etc.)

Block cookies est défini sur From third parties and advertisers par défaut pour Safari sur un Mac.

Il empêche le SharedObject de fonctionner si le fichier swf incorporé provient d'un autre domaine.

Ce problème n'est pas nouveau: Le cookie tiers Safari si l'astuce de tramage ne fonctionne plus?

Quelqu'un a-t-il trouvé une solution (autre que transmettre l'ID de session via les paramètres GET/POST dans chaque demande)?

REMARQUE: je n'ai aucun accès au site, qui incorpore le swf. Il n'y a donc aucun moyen de modifier ce code HTML, de mettre du code JavaScript, etc.

18
san.chez
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

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

// UPDATE 23 juillet 2013

Cette façon de résoudre ce problème a longtemps fonctionné jusqu’à Safari 6.

Veuillez consulter les commentaires @Fabio Antunes et @ncubica ci-dessous.

// UPDATE 23 juillet 2013 de Fabio Antunes

Voici mon code

Sur la page de destination, nous aurons une brève description de l'application et un bouton disant quelque chose comme "entrer". J'utilise jQuery pour simplifier ce processus, créant un écouteur pour l'événement click, je vais juste mettre le code javascript, car je suppose que vous avez déjà le reste du code html pour la page de destination:

$(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);
});

Cela vous ouvrira une petite fenêtre, avec 500 par 250 px, centrée sur votre écran.

Le code que j'ai pour la petite fenêtre est le suivant:

<?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
12
san.chez

Safari bloque toujours les cookies des domaines qu’il n’a pas visités dans la fenêtre supérieure .

Pour contourner ce problème, nous comptons ($ _ COOKIES) dans PHP et dirigeons le navigateur vers une page de notre domaine dont le travail consiste simplement à renvoyer le navigateur à son lieu d'origine. C'est un truc sale qui signifie que certains utilisateurs seront inutilement déplacés, puis rentrés, mais le web regorge de trucs sales.

Si vous ne pouvez pas définir top.location.href sur une page du domaine qui doit définir des cookies, ou si vous ne pouvez pas modifier une page de ce domaine, je peux dire en toute confiance que vous devrez utiliser des sessions basées sur des URL.

Cependant, une autre option (qui nécessite toujours de pouvoir créer une page sur le domaine) consiste à demander à l'utilisateur de cliquer sur votre fichier SWF. Vous pouvez ensuite déclencher window.open et faire en sorte que l'URL pointe vers la page que vous avez créée. Tout ce dont il a besoin est d’être chargé, puis l’utilisateur (ou même JS sur la page contextuelle elle-même) peut fermer la fenêtre contextuelle. Vous pouvez ensuite définir des cookies.


Je développe des applications Facebook, qui vivent dans des iframes, qui souffrent de ce problème. Chaque application doit être livrée avec ce correctif.

10
rcambrj

Je peux dire d’expérience très récente que ce n’est pas un problème avec Safari sur un Mac, et je ne l’ai jamais vu comme un problème.

Vous avez mentionné que le paramètre bloque les cookies de tierces parties: le stockage SharedObject ne provient jamais d'une tierce partie, mais du site que vous visitez (la 1ère partie?). Donc, je ne pense pas que cela sera jamais un problème.

À l'aide du panneau de configuration de Flash Player, l'utilisateur peut désactiver la variable SharedObject (ou limiter la quantité d'espace de stockage). Donc, en général, votre application devrait gérer le cas où la variable SharedObject n'est pas disponible.

Cependant, je pense que la plupart des utilisateurs ne sont pas conscients de la SharedObject et qu’ils peuvent le désactiver.

1
Sunil D.

Vous devrez peut-être utiliser un fichier de stratégie inter-domaines pour que le fichier swf fonctionne correctement.

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

1
Hades

J'ai résolu le problème de cette façon, mais il est préférable d'utiliser le stockage local HTML5 et de rendre les services Web reposants, car la conservation des variables de session dans server2 rend votre application peu évolutive. Voici le code que j'ai utilisé pour résoudre le problème des cookies tiers. En gros, les invités de server1 vont d'abord sur server2 afin de prendre "la pièce: D" et soudain il revient sur server1. De cette façon, les variables de session de server2 sont disponibles dans toute navigation. www.votreserveur.com/index.html page

<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.votreserveur2.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);
?>

P.S. window.open sont vus comme une sorte de popup alors vous pourriez avoir un problème avec les bloqueurs de publicités ou les paramètres du navigateur.

1
Marcello Kad

Juste pour ajouter un moyen plus propre sans setTimeout et ou jquery pour la page safari.xxx. Fonctionne bien avec le dernier iOS (8.1.2), je sais que pour 8.1.0 il y avait un bogue où la fenêtre/l'onglet ne se fermait pas.

Voici le code:

<%
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>

Le popup n'est pas un problème dans mon cas puisqu'il est initié par un clic de l'utilisateur.

0
Kim D.