Domanda

Evernote's bookmarklet è in grado di fare questo, quindi la maggior parte con voto positivo rispondere non rispondere a questo anche se il bounty andrà ad esso (in modo non modo produttivo).

Devo chiamare dominio A.com (che imposta il cookie con http), di dominio B.com.Faccio nel dominio B.com è (javascript):

var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "A.com/setCookie?cache=1231213123";
head.appendChild(script);

Questo imposta il cookie A.com su tutti i browser che ho provato, tranne Safari.Incredibilmente questo funziona in IE6, anche senza il P3P intestazioni.

C'è qualche modo per fare questo lavoro in Safari?

È stato utile?

Soluzione

Dal Safari Developer FAQ:

Safari navi conservativo politica in materia di cookie che i limiti di cookie scrive solo le pagine scelte ("navigato") dall'utente.Questa impostazione predefinita criterio conservativo può confondere cornice di siti che tentano di scrivere i cookie e non.

Io non ho trovato nessun modo per aggirare questo.

Se ne vale nulla, Chrome non impostare i cookie se si utilizza il <script> aggiungendo metodo, ma se si dispone di un nascosto <img> con la stessa origine, Chrome funziona, oltre al resto dei browser (ad eccezione, di nuovo, Safari)

Altri suggerimenti

Metodo di lavoro 2014-2016:

Devi fare la finestra.aperto al dominio / assegnare un cookie / chiudere il popup, il dominio è ora safelisted.

Post originale @ PHP più cookie non funziona su iPad / iPhone browser

C'è un po ' un male trucco supponendo che hai flash installato.

Non so se funziona ancora o no, ma Flash es "Oggetti Condivisi Locali" aka I Cookie Di Flash potrebbe aiutare a circumnavigare Safari stesso-i criteri di dominio.

Oggetti Condivisi Locali Tutorial

Tuttavia, può essere complicato da implementare, per non dire altro.

Inoltre, LSO sono venuti in luce come la sicurezza incubo:

Pensa bene prima di utilizzarli.

Un post di un nascosto <iframe> consente di by-passare questa restrizione in Safari -- http://gist.github.com/586182:

<?php
  header('P3P: CP=HONK');
  setcookie('test_cookie', '1', 0, '/');
?>
<div id="test_cookie" style="position: absolute; top: -10000px"></div>
<script>
  window.setTimeout(function() {
    if (document.cookie.indexOf('test_cookie=1') < 0) {
      var      
        name = 'test_cookie',
        div = document.getElementById(name),
        iframe = document.createElement('iframe'),
        form = document.createElement('form');

      iframe.name = name;
      iframe.src = 'javascript:false';
      div.appendChild(iframe);

      form.action = location.toString();
      form.method = 'POST';
      form.target = name;
      div.appendChild(form);

      form.submit();
    }
  }, 10);
</script>

Non c'è una vera e propria soluzione per questo lavoro nel 2015.Diciamo che c'è il sito web y.com che include iframe con il sito x.com.Il x.com iframe desidera memorizzare un cookie.Non è consentito dal Safari politica, tuttavia, y.com è in grado di memorizzare.Così y.com deve ascoltare i messaggi da x.com e poi memorizzare il cookie stesso.

var _cookieEvMth = window.addEventListener ? "addEventListener" : "attachEvent";
var _cookieEvAction = window[_cookieEvMth];
var _cookieEv = _cookieEvMth == "attachEvent" ? "onmessage" : "message";
_cookieEvAction(_cookieEv, function(evt){
  if(evt.data.indexOf('cookieset')!=-1){
    var datack = evt.data.split('|');
    YOUR_CUSTOM_COOKIE_SAVE_METHOD(datack[1],datack[2],datack[3]);
  }
},false);

Quando x.com ha bisogno di memorizzare i cookie, si deve inviare un messaggio a y.com:

window.parent.postMessage('cookieset|'+ckName+'|'+ckVal+'|'+days,'*');

Inoltre, si può lavorare il vostro modo per pubblicare un messaggio iframe se si desidera leggere il cookie.O è possibile includere il parametro x.com iframe url utilizzando javascript:

iframe.setAttribute('url','x.com/?cookieval='+YOUR_COOKIE_GET_METHOD('cookiename'));

Una soluzione ci è venuta al mio lavoro è stato quello di impostare i cookie tramite una finestra.open (), potrebbe non essere ottimale per voi (come avrai una brutta culo finestra di popup aperto), ma ha funzionato bene per noi.Abbiamo dovuto avere una finestra di popup comunque aperto per l'autenticazione OAuth.

Così il jist di quello che abbiamo fatto è stato:

  1. Utente fa clic su un link B.com
  2. Finestra Popup che si apre A.com/setCookie
  3. A.com imposta il cookie, e quindi reindirizza a B.com nel posto appropriato

Di nuovo, non è valida in tutte le soluzioni, ma ha funzionato nella nostra.Spero che questo aiuta.

So che questa domanda è piuttosto vecchio, ma questo mi ha aiutato a risolvere i cookie problema:

var cookieForm = document.createElement("form");
cookieForm.action = "A.com/setCookie?cache=1231213123";
cookieForm.method = "post";
document.body.appendChild(cookieForm);

cookieForm.submit();

L'idea di fare un post del modulo su una pagina che consente di impostare i cookie.

*MODIFICA* Questa soluzione è stata segnalata chiuso in WebKit.

Luca,

Ok, questa risposta è di due anni, ma...è possibile impostare un cookie da un iframe, se si registra un modulo per un iframe nascosto.È possibile farlo attraverso la creazione di un modulo:

<form id="myiframe" action="http://yourdomain.com" method="POST" target="iframe_target">

Quindi in Javascript, ottenere un riferimento al form e chiamata a presentare:

document.getElementsByTagName('form')[0].submit();

È possibile ascoltare l'iframe onload, o si può avere il tuo iframe una pagina di problema un po ' di javascript che segnali il carico.Ho testato questo in Safari e Chrome, e funziona.

Ciao.

Questo potrebbe non funzionare per tutti, ma mi sono imbattuto in questo problema, perché io ero una di Reagire App da un altro host di API, e la soluzione che alla fine ha funzionato è stata di utilizzare DNS:

Il nostro cliente è servito da www.company-name.com e le nostre API era company-name.herokuapp.com.Facendo un CNAME record api.company-name.com --> company-name.herokuapp.com e con il nostro client di utilizzare quel sottodominio per chiamate di API, Safari smesso di considerarlo un "terzo" cookie.

Il vantaggio è che c'è molto poco di codice coinvolti, e non usando la stabilita ' di roba...Il rovescio della medaglia è che avete bisogno di un po ' di controllo/proprietà delle API host se si sta andando per l'utilizzo di https, hanno bisogno di un certificato valido per il dominio del client, o gli utenti potranno ottenere un certificato di avviso - in modo che ciò non funziona (almeno non per qualcosa utente finale-di fronte) se l'API in questione non è tua o di un partner.

Forse un modo pragmatico di creare e fare clic su un collegamento con un href="A.com/setCookie?cache=1231213123" e un attributo di destinazione che puntano ad un iframe nascosto.Che può bypass Safari politica di navigazione dell'utente per l'impostazione dei cookie (non ho Safari portata di mano per prova).

Ho fatto qualche indagine estesa in tutto questo quando stavo cercando di distribuire un sito che utilizza Windows Live ID, che dipendeva dalla capacità di essere in grado di impostare 3 ° cookie di terze parti al fine di effettuare il log out.E ' solo...non lavoro.Nulla abbiamo potuto fare a farlo funzionare.Il Live ID team, inoltre, ha fatto un'indagine approfondita e la loro risposta è stata "non è possibile farlo funzionare".

Nota questa riga:

script.src = "A.com/setCookie?cache=1231213123";

Non ho potuto ottenere questo lavoro fino a quando ho aggiunto il http, cioè

script.src = "http://A.com/setCookie?cache=1231213123";

Ho trovato una soluzione semplice.Hai solo bisogno di una prima impostazione del tempo di cookie per verificare se la richiesta di provenire dalla stessa origine, se non, come di consueto, è necessario tornare in iframe un copione che si ripeterà questa richiesta, già in possesso di permesso di assegnare cookie.Dopo di che è possibile fare richiesta direttamente tramite iframe accesso a questo cookie.Questo mi ha aiutato nel mio sistema di tracciamento.Provare, questo funziona bene.

Vale la pena notare che questa restrizione in Safari non si applicano a tutti i sottodomini.Quindi, se si visita direttamente sitea.com quindi è possibile impostare i cookie dal subdomain.sitea.com senza interazione diretta con l'utente (iframe/JavaScript).

Questo è rilevante per il mio caso, quando lo sviluppo di una API.Se siete i visitatori che arrivano a mysite.com e poi volete un po ' di JavaScript per interagire con le API, quindi se l'API è ospitato presso api.mysite.com quindi funziona su Safari.

Posto questo codice JavaScript nella pagina che effettua il cross-richieste di dominio, http://example1.com/index.html:

  <script>
  var gup = function(name, url) {
     if(!url) url = location.href;
     name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
     var regexS = "[\\?&]"+name+"=([^&#]*)";
     var regex = new RegExp( regexS );
     var results = regex.exec( url );
     return results == null ? null : results[1];
  }
  var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && navigator.userAgent && !navigator.userAgent.match('CriOS');
  var n = gup("activated");
  if(isSafari && n == null) {
     //browser is Safari and cookies have not yet been activated
     var current_url = location.protocol + '//' + location.host + location.pathname;
     var query_string = '?callback=' + encodeURIComponent(current_url + '?activated=1');
     var new_url = 'http://example2.com/activate.php' + query_string;
     window.location.href = new_url;
  }
  //the rest of your code goes here, and you can now set cross-domain cookies on Safari
  </script>

Quindi creare un file su un altro server, che deve impostare i cookie http://example2.com/activate.php:

  <?php
  if(isset($_GET['callback'])) {
     header('Location: '.$_GET['callback']);
     exit();
  } else {
     //in case callback param is not set, simply go back to previous page
     echo "<script>";
     echo "window.history.back();";
     echo "</script>";
     exit();
  }
  ?>

Ecco come funziona:

  1. Quando http://example1.com/index.html è visitato per la prima volta, viene eseguito un controllo per vedere se il browser è Safari e se un parametro di nome "attivato" non esiste.Se entrambe le condizioni sono soddisfatte (che avverrà durante la prima visita per un Safari browser), quindi il browser viene reindirizzato a http://example2.com/activate.php con un parametro di "callback", contenente il richiamo URL aggiunto un "attivato" parametro.

  2. http://example2.com/activate.php reindirizza indietro per l'URL contenuto nel parametro GET, "callback".

  3. Quando http://example1.index.html è ora colpito per la seconda volta dopo essere stato reindirizzato a, il parametro GET, "attivato" per impostare, quindi il condizionale dal punto 1 non verrà eseguito, consentendo lo script per continuare l'esecuzione.

Questo soddisfa il Safari esigenza di avere il browser che visita il 3 ° partito di dominio, almeno una volta per avviare l'impostazione dei cookie.

Provare qualcosa di simile:

var w = window.open("A.com/setCookie?cache=1231213123");
w.close();

Si può bypassare il safari di politica di sicurezza.

Non è mancante di tipo attributo thats fastidioso ?-)

<script type="text/javascript">
  var head = document.getElementsByTagName("head")[0];
  var script = document.createElement("script");
  script.setAttribute("type","text/javascript");
  script.src = "A.com/setCookie?cache=1231213123";
  head.appendChild(script);
</script>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top