Pergunta

Evernote 's bookmarklet é capaz de fazer isso, portanto, a resposta mais upvoted não responder a esta embora a recompensa vai para ele (de forma não produtiva).

Eu tenho que domínio chamada A.com (que define os cookies com http) do domínio B.com. Tudo que eu faço no domínio B.com é (javascript):

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

Isso define o cookie no A.com em todos os navegadores que eu testei, exceto Safari. Surpreendentemente isso funciona no IE6, mesmo sem os cabeçalhos P3P.

Existe alguma maneira de fazer este trabalho no Safari?

Foi útil?

Solução

A partir da Safari Developer FAQ :

navios Safari com uma política de cookies conservadora que limita as gravações de biscoito para apenas as páginas escolhidos ( "navegado") por parte do usuário. Esta política conservadora padrão pode confundir sites baseados quadro que tentam biscoitos escrita e falhar.

Eu encontrei nenhuma maneira de contornar esta situação.

Se vale nada, o Chrome não define os biscoitos quer se você usar o <script> método anexando, mas se você tiver um <img escondido> com a mesma fonte, o Chrome funciona, além do resto dos navegadores (exceto , mais uma vez, Safari)

Outras dicas

Método de trabalho 2014-2016:

Você tem que fazer window.open para o domínio / Atribuir um cookie / fechar o pop-up, o domínio é agora safelisted.

post original @ PHP vários cookies não funciona no iPad / navegador iPhone

Há um pouco de um truque mal supondo que eles tenham o Flash instalado.

Eu não tenho certeza se ele ainda funciona ou não, mas Flash'es "Local Shared Objects" aka Flash cookies pode ajudá-lo a circunavegar políticas do mesmo domínio do Safari.

objeto compartilhado local Tutorial

No entanto, pode ser complicado de implementar, para dizer o mínimo.

Additonally, de LSO estão vindo para a luz como sendo um pesadelo de segurança:

Então, pense com cuidado antes de usá-los.

Um post para um <iframe> escondida pode permitir que você contornar esta restrição no Safari - http: // essência .github.com / 586.182 :

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

Existe uma solução adequada para este trabalho em 2015. Vamos dizer que há website y.com que inclui iframe com o site x.com. O iframe x.com quer guardar um cookie. Isso não é permitido pela política Safari, no entanto, y.com é capaz de armazená-lo. Então y.com deve ouvir as mensagens de x.com e depois armazenar o cookie em si.

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 precisa armazenar o cookie, ele deve postar uma mensagem para y.com:

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

Além disso, você pode trabalhar o seu caminho para mensagem de correio para o iframe se você quiser ler o cookie. Ou você pode incluí-lo como parâmetro no x.com iframe url usando javascript:

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

Uma solução que só veio com o meu trabalho era definir o cookie através de um window.open () - pode não ser o ideal para você (como você vai ter uma janela aberta ass pop-up feio), mas funcionou bem para nós. Tivemos de ter um de qualquer maneira aberta a janela pop-up para autenticação OAuth.

Assim, o jist do que fizemos foi:

  1. O usuário clica um link de B.com
  2. Janela de popup abre para A.com/setCookie
  3. A.com define seu cookie e, em seguida, redireciona para B.com no lugar apropriado

Mais uma vez, não é válido em todas as soluções, mas funcionou no nosso. Espero que isso ajude.

Eu sei que esta questão é bastante antiga, mas isso me ajudou a resolver os cookies problema:

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

cookieForm.submit();

A idéia de fazer um post de formulário em uma página que define seus cookies.

* Editar * Esta solução alternativa tem sido relatada fechado em WebKit.

Luca,

Ok, então esta resposta é de dois anos de idade, mas ... você pode definir um cookie de um iframe, se você postar um formulário para um iframe escondido. Você pode fazer isso através da criação de um formulário:

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

Então, em Javascript, obter uma referência para a forma e chamar apresentar:

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

Você pode ouvir onload do iframe, ou você pode ter sua ação iframe página problema algum javascript que sinaliza a carga. Eu testei isso no Safari e Chrome, e ele funciona.

Felicidades.

Este pode não funcionar para todos, mas me deparei com esta questão, porque eu estava servindo a Reagir App de um host diferente do API, e a solução que finalmente trabalhou foi usar DNS:

O nosso cliente estava sendo servido a partir www.company-name.com e nossa API estava em company-name.herokuapp.com. Ao fazer um CNAME recorde api.company-name.com -> company-name.herokuapp.com, e ter o nosso uso do cliente que subdomínio para chamadas de API, Safari parou de considerá-lo um "third-party "cookie.

A vantagem é que há muito pouco código envolvido, e tudo isso é usando coisas bem estabelecida ... A desvantagem é que você precisa de algum controle / propriedade sobre o anfitrião API se você estiver indo para usar https - eles precisam de um certificado que é válido para o domínio do cliente, ou os usuários receberão um aviso de certificado - para que isso não iria funcionar (pelo menos não por algo end-user-facing) se o API em questão não é seu ou de um parceiro

Talvez pragmaticamente criar e clicar em um link com um href="A.com/setCookie?cache=1231213123" e uma apontando atributo target para um iframe escondido. Que pode desvio política de navegação do usuário do Safari para configurar cookies (eu não tenho Safari útil para teste.)

Eu fiz algumas extensa investigação em torno deste quando eu estava tentando implantar um site que usou o Windows Live ID, que dependia da habilidade de ser capaz de definir cookies 3o partido, a fim de encerrar a sessão. Ele só ... não funcionou. Nada que pudéssemos fazer seria fazê-lo funcionar. A equipa Live ID também fez extensa investigação ea sua resposta foi "não pode fazê-lo funcionar".

Observe esta linha:

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

Eu não poderia começar este trabalho até que eu adicionei o http, i.

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

Eu encontrei uma solução simples. Você só precisa de cookie de configuração de primeira vez para verificar se o pedido vem da mesma origem ou não, se não como de costume, você precisa voltar para iframe um script que irá repetir este pedido, já tendo permissão para cookies Atribuir. Depois que você pode fazer outro pedido diretamente através iframe aceder a este cookie. Isso me ajudou no meu sistema de rastreamento. Tente, isso funciona bem.

Vale a pena notar que esta restrição no Safari não se aplica em subdomínios. Então, se você visitar diretamente sitea.com, então você pode definir cookies de subdomain.sitea.com sem a interação direta do usuário (iframe / JavaScript).

Este foi relevante para o meu caso ao desenvolver uma API. Se você é visitantes estão chegando mysite.com, e então você quer um pouco de JavaScript para interagir com a sua API, então, se a API está hospedado em api.mysite.com, então ele vai trabalhar no Safari.

Coloque este JavaScript na página de fazer solicitações entre domínios, 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>

Em seguida, crie um arquivo em outro servidor, que precisa biscoitos set, 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();
  }
  ?>

Aqui está como isso funciona:

  1. Quando http://example1.com/index.html é visitou pela primeira vez, é feita uma verificação para ver se o navegador é o Safari e se um parâmetro GET do nome "ativado" não existe. Se estiverem preenchidas as duas condições (o que vai acontecer na primeira visita de um navegador Safari), em seguida, o navegador é redirecionado para http : //example2.com/activate.php com um parâmetro GET, "retorno", que contém a URL chamada anexado com um parâmetro "ativado".

  2. http://example2.com/activate.php simplesmente redireciona para o URL contido no parâmetro GET, "callback".

  3. Quando http: //example1.index.html está agora atingiu esta segunda vez depois de ser redirecionada-to, o parâmetro GET, "ativado" será definida agora, de modo que o condicional do passo 1 não será executado, permitindo assim que o script para continuar a execução.

Isto cumpre exigência de ter a visita do navegador do domínio 3o partido pelo menos uma vez, a fim de começar a definir os cookies do Safari.

Tente algo como:

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

Pode desvio do safari política de segurança.

Não é o atributo do tipo faltando isso é chato você -?)

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top