L'astuce iframe des cookies tiers de Safari ne fonctionne plus?


137

C'est donc la énième revanche de la question «comment faire fonctionner les cookies tiers dans Safari», mais je la pose à nouveau car je pense que les règles du jeu ont changé, peut-être après février 2012. L'une des astuces standard pour obtenir la 3e les cookies de fête dans Safari étaient les suivants: utilisez du javascript pour POST dans un iframe caché. Il (utilisé pour) tromper Safari en lui faisant croire que l'utilisateur avait interagi avec le contenu tiers et ainsi autoriser l'installation de cookies.

Je pense que cette faille a été comblée à la suite du léger scandale où il a été révélé que Google utilisait cette astuce avec ses publicités. À tout le moins, en utilisant cette astuce, j'ai été complètement incapable de définir des cookies dans Safari. J'ai déniché des publications aléatoires sur Internet affirmant qu'Apple travaillait à combler cette faille, mais je n'ai trouvé aucun mot officiel.

En guise de solution de secours, j'ai même essayé de redessiner le cadre principal tiers afin que vous deviez cliquer sur un bouton avant que le contenu ne se charge, mais même ce niveau d'interaction directe n'était pas suffisant pour faire fondre le cœur froid et froid de Safari.

Alors, est-ce que quelqu'un sait avec certitude si Safari a effectivement fermé cette faille? Si tel est le cas, existe-t-il d'autres solutions de contournement (autres que l'inclusion manuelle d'un ID de session dans chaque demande)?


21
Utiliser une iframe tierce qui a besoin de cookies n'est certainement pas par définition une attaque de sécurité! Nous gérons une boutique en ligne qui est utilisée dans une iframe sur une multitude de domaines différents, et avons toutes sortes de problèmes avec Safari ces derniers temps, donc je suis également très intéressé par la réponse à cette question (légitime).
mscha

14
Presque tous ceux qui créent des applications Facebook ont ​​ce problème avec Safari. Les applications Facebook fonctionnent dans une iframe et, par définition, proviennent toutes de tiers. C'est pourquoi la prise en charge de Safari sur les applications Facebook est un peu inégale: vous ne pouvez pas utiliser de cookies.
gs hurley

Je ne peux pas reproduire ce problème sur safari 5.1.7. Il accepte le cookie de mon application facebook iframe avec le paramètre par défaut "pas de cookies tiers". Cependant Chrome 19.0.1084.46 avec le même paramètre bloque le cookie.
Evgeny Shadchnev

4
Chrome 19+ avec l'option (heureusement) non par défaut «Bloquer les cookies tiers et les données de site» cochée est / encore plus sévère / que le paramètre par défaut «Bloquer les cookies de tiers et d'annonceurs» de Safari. Dans Chrome, même si vous visitez le domaine tiers et que des cookies sont définis, ils ne seront pas transmis à l'iframe. L'utilisateur doit en fait ajouter une "exception" pour votre domaine dans ses paramètres de sécurité Chrome.
Aaron Gibralter

Que voulez-vous dire par février 2012? Y a-t-il un changement technique dans Safari ou un changement de loi?
liquide

Réponses:


51

Je voulais juste laisser une solution de travail simple ici qui ne nécessite pas d'interaction de l'utilisateur .

Comme je l'ai déclaré dans un article que j'ai publié :

En gros, tout ce que vous avez à faire est de charger votre page sur top.location, de créer la session et de la rediriger vers Facebook.

Ajoutez ce code en haut de votre index.phpet définissez-le $page_urlsur l'onglet final / URL de l'application et vous verrez que votre application fonctionnera sans aucun problème.

<?php
    // START SAFARI SESSION FIX
    session_start();
    $page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
    if (isset($_GET["start_session"]))
        die(header("Location:" . $page_url));

    if (!isset($_GET["sid"]))
        die(header("Location:?sid=" . session_id()));
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid):
?>
   <script>
        top.window.location="?start_session=true";
    </script>
<?php
    endif;
    // END SAFARI SESSION FIX
?>

Remarque: cela a été fait pour Facebook, mais cela fonctionnerait dans toutes les autres situations similaires.


Edit 20-Dec-2012 - Maintenir la demande signée:

Le code ci-dessus ne gère pas les données de publication des demandes, et vous perdriez la signature_request, si votre application repose sur une demande signée, n'hésitez pas à essayer le code suivant:

Remarque: Ceci est toujours en cours de test correctement et peut être moins stable que la première version. Utilisez à vos risques et périls / Les commentaires sont appréciés.

(Merci à CBroe de m'avoir orienté dans la bonne direction permettant ici d'améliorer la solution)

// Start Session Fix
session_start();
$page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
if (isset($_GET["start_session"]))
    die(header("Location:" . $page_url));
$sid = session_id();
if (!isset($_GET["sid"]))
{
    if(isset($_POST["signed_request"]))
       $_SESSION["signed_request"] = $_POST["signed_request"];
    die(header("Location:?sid=" . $sid));
}
if (empty($sid) || $_GET["sid"] != $sid)
    die('<script>top.window.location="?start_session=true";</script>');
// End Session Fix

Merci, fonctionne comme un charme et est si facile à mettre en œuvre dans les applications existantes :-)
SamiSalami

Donc, celui-ci fonctionne essentiellement avec quelques redirections, non?
Aaron Gibralter

1
@hugoderhungrige vous êtes les bienvenus, je viens d'ajouter une nouvelle version, n'hésitez pas à la vérifier si vous avez besoin de maintenir la demande signée sur vos applications.
Diogo Raminhos

1
@CBroe Merci beaucoup d'avoir souligné cela! Vous aviez raison, cela fonctionne, car à la deuxième demande, l'utilisateur a déjà commencé une session! Je suppose que "le pire aveugle est celui qui ne veut pas voir".
Diogo Raminhos

1
@Whiteagle Pouvez-vous fournir un cas de test illustrant 1 et 2?
Gajus

35

Vous avez dit que vous étiez prêt à ce que vos utilisateurs cliquent sur un bouton avant le chargement du contenu. Ma solution était d'avoir un bouton pour ouvrir une nouvelle fenêtre de navigateur. Cette fenêtre définit un cookie pour mon domaine, actualise l'ouvre-porte puis se ferme.

Ainsi, votre script principal pourrait ressembler à:

<?php if(count($_COOKIE) > 0): ?>
<!--Main Content Stuff-->
<?php else: ?>
<a href="/safari_cookie_fix.php" target="_blank">Click here to load content</a>
<?php endif ?>

Alors safari_cookie_fix.php ressemble à:

<?php
setcookie("safari_test", "1");
?>
<html>
    <head>
        <title>Safari Fix</title>
        <script type="text/javascript" src="/libraries/prototype.min.js"></script>
    </head>
    <body>
    <script type="text/javascript">
    document.observe('dom:loaded', function(){
        window.opener.location.reload();
        window.close();
    })
    </script>
    This window should close automatically
    </body>
</html>

Je pensais à quelque chose comme ça. Fonctionne parfaitement. Je le charge avec la boîte de dialogue d'autorisation. Merci!
vwoelm

On dirait que cela fonctionne également autour des paramètres de Safari, et que, une fois que cela sera connu de tous, il sera éliminé comme les autres «solutions». Je recherche une solution complètement différente, car il devient assez évident que les cookies tiers sont désormais le diable, même lorsqu'ils sont utilisés de manière appropriée.
LocalPCGuy

1
Cette solution a fonctionné pour moi, cependant, le popup est-il nécessaire? Pourriez-vous rediriger votre iframe vers la page safari, définir le cookie, puis rediriger vers le jeu avec des en-têtes de redirection? Ou avez-vous besoin du popup pour que l'utilisateur ait une forme de contact direct avec le serveur?
Anthony Hastings

cela a bien fonctionné; Heureusement, appuyer sur un bouton pour initialiser ce n'était pas un gros problème dans mon application.
porté le

@LocalPCGuy Je ne suis pas sûr que cela soit supprimé comme les autres solutions car cela nécessite qu'un utilisateur clique / interagisse avec la page afin que le popup ne soit pas bloqué. Cette solution proposée par Safari semble bien fonctionner: les annonceurs ne pourront pas définir secrètement des cookies inter-domaines, et les applications intégrées nécessiteront un utilisateur d'interagir avant de pouvoir définir un cookie.
Aaron Gibralter

15

J'ai trompé Safari avec un .htaccess:

#http://www.w3.org/P3P/validator.html
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID CUR ADM DEV OUR BUS\""
Header set Set-Cookie "test_cookie=1"
</IfModule>

Et ça a cessé de fonctionner pour moi aussi. Toutes mes applications perdent la session dans Safari et redirigent hors de Facebook. Comme je suis pressé de réparer ces applications, je recherche actuellement une solution. Je te tiendrai au courant.

Edit (2012-04-06): Apparemment, Apple l'a "corrigé" avec 5.1.4. Je suis sûr que c'est la réaction à la chose Google: "Un problème existait dans l'application de sa politique en matière de cookies. Les sites Web tiers pouvaient définir des cookies si la préférence" Bloquer les cookies "dans Safari était définie sur le paramètre par défaut" De tiers et d'annonceurs ". Http://support.apple.com/kb/HT5190


1
Apparemment, Apple l'a "corrigé" avec 5.1.4. Je suis sûr que c'est la réaction à la chose Google: "Un problème existait dans l'application de sa politique en matière de cookies. Les sites Web tiers pouvaient définir des cookies si la préférence" Bloquer les cookies "dans Safari était définie sur le paramètre par défaut" de tiers et les annonceurs ». support.apple.com/kb/HT5190
vwoelm

1
Je pense donc que ce commentaire de vwoelm est le plus proche de la réponse que je recherchais. Tout d'abord, je voulais la confirmation qu'Apple a définitivement fermé la faille et que la référence à l'article de support Apple n'est que cela. La deuxième partie de ma question est cependant toujours d'actualité. Quelle est la gamme d'options pour les solutions de contournement. Clairement, nous pouvons encoder les identifiants de session en tant que paramètres GET / POST, mais quelles sont les autres options. Le stockage local fonctionne-t-il dans ce contexte? Des cookies flash?
gs hurley

@vwoelm: c'est bien la réponse que je cherchais (mais n'espérais pas). Si vous mettez cela dans une réponse au lieu d'un commentaire, je vous attribuerai la prime.
mscha

3
@gshurley Je pense que l'envoi des identifiants de session via les paramètres GET / POST est la seule option. Ce n'est pas sûr, mais encore une fois, Facebook nous oblige à servir des applications de canevas sans SSL de toute façon. Et en plus de ce que vous obtenez vraiment en piratant une application Facebook, haha? Nous sommes à la merci d'Apple et ils sont actuellement en mode cruel.
hekevintran

14

Dans votre contrôleur Ruby on Rails, vous pouvez utiliser:

private

before_filter :safari_cookie_fix

def safari_cookie_fix
  user_agent = UserAgent.parse(request.user_agent) # Uses useragent gem!
  if user_agent.browser == 'Safari' # we apply the fix..
    return if session[:safari_cookie_fixed] # it is already fixed.. continue
    if params[:safari_cookie_fix].present? # we should be top window and able to set cookies.. so fix the issue :)
      session[:safari_cookie_fixed] = true
      redirect_to params[:return_to]
    else
      # Redirect the top frame to your server..
      render :text => "<script>alert('start redirect');top.window.location='?safari_cookie_fix=true&return_to=#{set_your_return_url}';</script>"
    end
  end
end

Y a-t-il un problème similaire avec les sessions en safari?
Rails débutant le

vous pouvez remplacer set_your_return_url par request.env ['HTTP_REFERER'] car nous sommes à l'intérieur d'un iframe :-D
Luc Boissaye

J'ai essayé cette solution, et le seul problème est que je ne peux pas revenir à l'url iframe parent. Existe-t-il une méthode dans Rails pour obtenir l'URL de l'iframe parent? merci
idejuan

Cela m'a pris du temps, mais j'ai finalement compris que le moyen le plus simple (TMO) était de simplement l'ajouter en tant que paramètre de chaîne de requête à l'URL de redirection de l'application rails. Wasy et propre.
guyaloni

1
Cette réponse crée un redirecteur ouvert, ce qui est un problème de sécurité courant. Le code dangereux est redirect_to params[:return_to]. Ce paramètre doit être vérifié par rapport à une liste blanche d'endroits sûrs vers lesquels rediriger. Voir owasp.org/index.php/…
phylae

13

Pour ma situation spécifique, j'ai résolu le problème en utilisant window.postMessage () et en éliminant toute interaction de l'utilisateur. Notez que cela ne fonctionnera que si vous pouvez d'une manière ou d'une autre exécuter js dans la fenêtre parente. Soit en lui faisant inclure un js de votre domaine, soit si vous avez un accès direct à la source.

Dans l'iframe (domaine-b), je vérifie la présence d'un cookie et s'il n'est pas défini, j'enverrai un message postal au parent (domaine-a). Par exemple;

if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1
    && document.cookie.indexOf("safari_cookie_fix") < 0) {
    window.parent.postMessage(JSON.stringify({ event: "safariCookieFix", data: {} }));
}

Ensuite, dans la fenêtre parent (domaine-a), écoutez l'événement.

if (typeof window.addEventListener !== "undefined") {
    window.addEventListener("message", messageReceived, false);
}

function messageReceived (e) {
    var data;

    if (e.origin !== "http://www.domain-b.com") {
        return;
    }

    try {
        data = JSON.parse(e.data);
    }
    catch (err) {
        return;
    }

    if (typeof data !== "object" || typeof data.event !== "string" || typeof data.data === "undefined") {
        return;
    }

    if (data.event === "safariCookieFix") {
        window.location.href = e.origin + "/safari/cookiefix"; // Or whatever your url is
        return;
    }
}

Enfin, sur votre serveur (http://www.domain-b.com/safari/cookiefix), vous définissez le cookie et redirigez vers l'endroit d'où l'utilisateur vient. L'exemple ci-dessous utilise ASP.NET MVC

public class SafariController : Controller
{
    [HttpGet]
    public ActionResult CookieFix()
    {
        Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "1"));

        return Redirect(Request.UrlReferrer != null ? Request.UrlReferrer.OriginalString : "http://www.domain-a.com/");
    }

}

Vous n'obtenez pas d'erreur de syntaxe avec votre appel à postMessage?
akousmata

Besoin d'ajouter un deuxième paramètre "*"pour PostMessagecorriger l'erreur de syntaxe
Michael Baldry

J'aimerais pouvoir donner à cette réponse plus de votes positifs. C'est le moyen le plus simple et le plus correct de résoudre ce problème. Merci de l'avoir posté!
AaronP

9

J'ai eu le même problème et aujourd'hui j'ai trouvé un correctif qui fonctionne bien pour moi. Si l'agent utilisateur contient Safariet qu'aucun cookie n'est défini, je redirige l'utilisateur vers la boîte de dialogue OAuth:

<?php if ( ! count($_COOKIE) > 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')) { ?>
<script type="text/javascript">
    window.top.location.href = 'https://www.facebook.com/dialog/oauth/?client_id=APP_ID&redirect_uri=MY_TAB_URL&scope=SCOPE';
</script>
<?php } ?>

Après l'authentification et la demande d'autorisations, la boîte de dialogue OAuth redirigera vers mon URI à l'emplacement supérieur. Il est donc possible de configurer des cookies. Pour toutes nos applications de canevas et d'onglets de page, j'ai déjà inclus le script suivant:

<script type="text/javascript">
    if (top.location.href==location.href) top.location.href = 'MY_TAB_URL';
</script>

Ainsi, l'utilisateur sera redirigé vers l'onglet de la page Facebook avec un cookie valide déjà défini et la demande signée est à nouveau publiée.


Excellent travail à ce sujet. J'ai mis à jour la vérification de l'agent utilisateur pour m'assurer que Chrome n'était pas non plus dans l'agent utilisateur, car Chrome a également Safari dans la chaîne de l'agent utilisateur. La redirection vers la page de votre domaine, la configuration des cookies nécessaires / la session de démarrage, puis la redirection vers votre application sur apps.facebook.com ont fonctionné comme un charme. Cela semble idiot, mais fonctionne bien. Merci Sascha pour le tuyau!
Mike

7

J'ai finalement opté pour une solution similaire à celle fournie par Sascha, mais avec quelques ajustements, car je configure les cookies explicitement en PHP:

// excecute this code if user has not authorized the application yet
// $facebook object must have been created before

$accessToken = $_COOKIE['access_token']

if ( empty($accessToken) && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {

    $accessToken = $facebook->getAccessToken();
    $redirectUri = 'https://URL_WHERE_APP_IS_LOCATED?access_token=' . $accessToken;

} else {

    $redirectUri = 'https://apps.facebook.com/APP_NAMESPACE/';

}

// generate link to auth dialog
$linkToOauthDialog = $facebook->getLoginUrl(
    array(
        'scope'         =>  SCOPE_PARAMS,
        'redirect_uri'  =>  $redirectUri
    )
);

echo '<script>window.top.location.href="' . $linkToOauthDialog . '";</script>';

Cela vérifie si le cookie est disponible lorsque le navigateur est en safari. Dans l'étape suivante, nous sommes sur le domaine de l'application, à savoir l'URI fourni comme URL_WHERE_APP_IS_LOCATED ci-dessus.

if (isset($_GET['accessToken'])) {

    // cookie has a lifetime of only 10 seconds, so that after
    // authorization it will disappear
    setcookie("access_token", $_GET['accessToken'], 10); 

} else {

  // depending on your application specific requirements
  // redirect, call or execute authorization code again
  // with the cookie now set, this should return FB Graph results

}

Ainsi, après avoir été redirigé vers le domaine d'application, un cookie est défini explicitement et je redirige l'utilisateur vers le processus d'autorisation.

Dans mon cas (puisque j'utilise CakePHP mais cela devrait fonctionner correctement avec n'importe quel autre framework MVC), j'appelle à nouveau l'action de connexion où l'autorisation FB est exécutée une autre fois, et cette fois, elle réussit grâce au cookie existant.

Après avoir autorisé l'application une fois, je n'ai plus eu de problèmes d'utilisation de l'application avec Safari (5.1.6)

J'espère que cela pourrait aider n'importe qui.


1
cela a fonctionné pour moi !! Merci!! .. J'avais ce problème avec Safari 5.1.7 .... maintenant c'est résolu!
Khalizar

5

J'ai eu ce problème sur les appareils exécutant iOS. J'ai créé une boutique intégrable dans un site Web normal à l'aide d'une iframe. D'une manière ou d'une autre, à chaque chargement de page, l'utilisateur a un nouvel identifiant de session, ce qui fait que les utilisateurs sont bloqués à mi-chemin du processus parce que certaines valeurs n'étaient pas présentes dans la session.

J'ai essayé certaines des solutions proposées sur cette page, mais les popups ne fonctionnent pas très bien sur un iPad et j'avais besoin de la solution la plus transparente.

Je l'ai résolu en utilisant une redirection. Le site Web qui intègre mon site doit d'abord rediriger l'utilisateur vers mon site, de sorte que le cadre supérieur contient l'url de mon site, où je place un cookie et redirige l'utilisateur vers la page appropriée sur le site Web qui intègre mon site, qui est passé via l'url.

Exemple de code PHP

Le site Web distant redirige l'utilisateur vers

http://clientname.example.com/init.php?redir=http://www.domain.com/shop/frame

init.php

<?php
// set a cookie for a year
setcookie('initialized','1',time() + 3600 * 24 * 365, '/', '.domain.com', false, false);
header('location: ' . $_GET['redir']);
die;

L'utilisateur se retrouve http://www.domain.com/shop/framelà où mon site est intégré, stockant les sessions comme il se doit et mangeant des cookies.

J'espère que cela aide quelqu'un.


3

Permettez-moi de partager mon correctif dans ASP.NET MVC 4. L'idée principale comme dans la bonne réponse pour PHP. Le code suivant ajouté dans la mise en page principale dans l'en-tête près de la section des scripts:

@if (Request.Browser.Browser=="Safari")
{
    string pageUrl = Request.Url.GetLeftPart(UriPartial.Path);
    if (Request.Params["safarifix"] != null && Request.Params["safarifix"] == "doSafariFix")
    {
        Session["IsActiveSession"] = true;
        Response.Redirect(pageUrl);
        Response.End();
    }
        else if(Session["IsActiveSession"]==null)
    {
        <script>top.window.location = "?safarifix=doSafariFix";</script>
    }
}

3

Cette solution s'applique dans certains cas - si possible:

Si la page de contenu iframe utilise un sous-domaine de la page contenant l'iframe, le cookie n'est plus bloqué.


Ce sont des informations utiles - exactement ce que je cherchais. Bien que je sois sûr que la plupart des gens ne peuvent pas changer de domaine, c'est ce que je vais faire. Demandez au site dans lequel je suis intégré de créer un sous-domaine <mycompany>. <theircompany> .com qui correspond à mon IP et à un VHost de mon côté pour ce domaine et utilise cette URL dans l'iFrame. Compliqué, mais devrait être à l'épreuve des balles.
Elocution Safari

1
Cela peut devenir compliqué si vous utilisez https avec le sous-domaine, car le serveur de sous-domaine aura besoin d'un certificat SSL pour correspondre.
Roger Halliburton

1

Google a en fait laissé le chat sortir du sac sur celui-ci. Ils l'utilisaient depuis un certain temps pour accéder aux cookies de suivi. Il a été corrigé presque immédiatement par Apple = \

article original du Wall Street Journal


Je connais le truc de Google, mais je n'ai rien vu d'Apple en train de «réparer» cela (et de casser la moitié d'Internet). Avez-vous des détails à ce sujet?
mscha

1

Voici un code que j'utilise. J'ai constaté que si je place un cookie sur mon site, les cookies fonctionnent comme par magie dans l'iframe à partir de là.

http://developsocialapps.com/foundations-of-a-facebook-app-framework/

 if (isset($_GET['setdefaultcookie'])) {
        // top level page, set default cookie then redirect back to canvas page
        setcookie ('default',"1",0,"/");
        $url = substr($_SERVER['REQUEST_URI'],strrpos($_SERVER['REQUEST_URI'],"/")+1);
        $url = str_replace("setdefaultcookie","defaultcookieset",$url);
        $url = $facebookapp->getCanvasUrl($url);
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    } else if ((!isset($_COOKIE['default'])) && (!isset($_GET['defaultcookieset']))) {
        // no default cookie, so we need to redirect to top level and set
        $url = $_SERVER['REQUEST_URI'];
        if (strpos($url,"?") === false) $url .= "?";
        else $url .= "&";
        $url .= "setdefaultcookie=1";
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    }

1

Une version légèrement plus simple en PHP de ce que d'autres ont publié:

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
    print '<script>top.window.location="https://example.com/?start_session=true";</script>';
    exit();
}

if (isset($_GET['start_session'])) {
    header("Location: https://apps.facebook.com/YOUR_APP_ID/");
    exit();
}

1

J'ai trouvé la réponse parfaite à cela, tout cela grâce à un gars appelé Allan qui mérite tout le crédit ici. ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )

Sa solution est simple et facile à comprendre.

Sur le serveur de contenu iframe (domaine 2), ajoutez un fichier appelé startsession.php au niveau du domaine racine qui contient:

<?php
// startsession.php
session_start();
$_SESSION['ensure_session'] = true;
die(header('location: '.$_GET['return']));

Maintenant, sur le site Web de niveau supérieur contenant l'iframe (domaine1), l'appel à la page contenant l'iframe devrait ressembler à:

<a href="https://domain2/startsession.php?return=http://domain1/pageWithiFrame.html">page with iFrame</a>

Et c'est tout! Simples :)

La raison pour laquelle cela fonctionne est que vous dirigez le navigateur vers une URL tierce et lui dites ainsi de lui faire confiance avant d'afficher le contenu de celle-ci dans l'iframe.


0

J'ai utilisé l'astuce de Whiteagle modifiée (ajout du paramètre signed_request au lien) et cela a fonctionné bien pour le safari, mais IE actualise constamment la page dans ce cas. Ma solution pour Safari et Internet Explorer est donc:

$fbapplink = 'https://apps.facebook.com/[appnamespace]/';
$isms = stripos($_SERVER['HTTP_USER_AGENT'], 'msie') !== false;

// safari fix
if(! $isms  && !isset($_SESSION['signed_request'])) {

    if (isset($_GET["start_session"])) {
        $_SESSION['signed_request'] = $_GET['signed_request'];
        die(header("Location:" . $fbapplink ));

    }
    if (!isset($_GET["sid"])) {
        die(header("Location:?sid=" . session_id() . '&signed_request='.$_REQUEST['signed_request']));
    }
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid) {
    ?>
    <script>
        top.window.location="?start_session=true";
    </script>
    <?php
    exit;
    }
}

// IE fix
header('P3P: CP="CAO PSA OUR"');
header('P3P: CP="HONK"');


.. later in the code

$sr = $_REQUEST['signed_request'];
if($sr) {
        $_SESSION['signed_request'] = $sr;
} else {
        $sr = $_SESSION['signed_request'];
}

0

J'ai également souffert de ce problème, mais j'ai finalement obtenu la solution.Initialement, chargez directement l'url iframe dans le navigateur comme une petite fenêtre contextuelle, puis accédez uniquement aux valeurs de session à l'intérieur de l'iframe.



-2

J'ai décidé de me débarrasser de la $_SESSIONvariable ensemble et j'ai écrit un wrapper autour de Memcache pour imiter la session.

Vérifier https://github.com/manpreetssethi/utils/blob/master/Session_manager.php

Cas d'utilisation: au moment où un utilisateur atterrit sur l'application, stockez la demande signée à l'aide de Session_manager et comme elle est dans le cache, vous pouvez y accéder sur n'importe quelle page désormais.

Remarque: cela ne fonctionnera pas lors de la navigation privée dans Safari car le session_id se réinitialise à chaque fois que la page se recharge. (Safari stupide)


-9

Vous pouvez résoudre ce problème en ajoutant l'en-tête en tant que politique p3p .. J'ai eu le même problème sur Safari donc après l'ajout d'un en-tête au-dessus des fichiers, mon problème a été résolu.

<?php
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
?>

Êtes-vous sûr que cela fonctionne (toujours) avec la dernière version de Safari? Nous avons des en-têtes P3P depuis des années, pour IE, mais Safari est toujours en panne.
mscha

2
Essayez d'effacer tous vos cookies et testez à nouveau. Le problème ne se manifeste pas si votre navigateur a déjà des cookies pour votre site iframed.
rmarscher

Hmmm, je ne peux pas non plus faire fonctionner les en-têtes P3P. Cependant, ils fonctionnent toujours dans IE!
Seth Brown

2
Cela fonctionnait. Mais ce n'est pas le cas pour la version la plus récente de Safari. Videz votre cache et réessayez ....
chantheman

2
Je tiens à préciser que cette solution fonctionne. assurez-vous de SUPPRIMER TOUS les cookies lors du safari. Et puis essayez ceci.
dnuske
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.