Frage

Evernote 's Bookmarklet ist in der Lage, dies zu tun, damit die meisten upvoted Antwort dies nicht, obwohl die Prämie wird es gehen (in einer nicht-produktiven Art und Weise).

Ich habe Domain A.com nennen (die die Cookies mit http Sets) von Domain B.com. Alles, was ich tun auf Domain B.com ist (JavaScript):

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

Damit wird der Cookie auf A.com auf jedem Browser die ich getestet habe, außer Safari. Erstaunlicherweise funktioniert dies in IE6, auch ohne die P3P-Header.

Gibt es eine Möglichkeit, diese Arbeit in Safari zu machen?

War es hilfreich?

Lösung

Von der Safari Developer FAQ :

  

Safari Schiffe mit einer konservativen Cookie-Politik, die Cookie begrenzt schreiben nur die ausgewählten Seiten ( „navigiert“) durch den Benutzer. Dieser Standard konservative Politik kann Frame-basierte Websites verwechseln, die Cookies zu schreiben versuchen und scheitern.

Ich habe keine Möglichkeit gefunden, dies zu umgehen.

Wenn es etwas wert ist, Chrome nicht die Cookies entweder wenn Sie die <script> Methode anhängt, aber wenn Sie eine versteckte <img haben> mit der gleichen Quelle, arbeitet Chrome zusätzlich zu dem Rest des Browser (außer wieder, Safari)

Andere Tipps

Arbeitsmethode 2014-2016:

Sie haben window.open der Domäne / assign ein Cookie / Schließen des Pop-up zu tun, wird die Domain jetzt safelisted.

Original post @ PHP mehrere Cookies nicht auf dem iPad arbeiten / iPhone-Browser

Es ist ein bisschen von einem bösen Trick vorausgesetzt, sie haben Flash installiert.

Ich bin mir nicht sicher, ob es noch funktioniert oder nicht, aber Flash'es "Local Shared Objects" aka Flash-Cookies könnten Sie helfen, same-Domänenrichtlinien Safari umrunden.

Local Shared Object Tutorial

Allerdings kann es schwierig sein, zu implementieren, um es gelinde auszudrücken.

Additonally, LSO in das Licht comming ein Unsicherheitsfaktor als:

Also denken Sie sorgfältig, bevor Sie sie.

Ein Beitrag zu einem versteckten <iframe> kann, damit Sie diese Einschränkung in Safari By-Pass - http: // Kern .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>

Es gibt eine richtige Lösung für dieses Arbeits im Jahr 2015. Lassen Sie uns sagen, dass es Website y.com ist die iframe mit Website x.com enthält. Die x.com iframe will einen Cookie speichern. Das ist nicht von Safari Politik erlaubt, jedoch ist y.com der Lage, es zu speichern. So muss y.com auf Nachrichten von x.com hören und speichern Sie dann das Cookie selbst.

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);

Wenn x.com das Cookie speichern muss, muss eine Nachricht an y.com schreiben:

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

Sie können auch Ihre Art und Weise zusammenarbeiten, um Ihre Mitteilung an den iframe zu schreiben, wenn Sie das Cookie lesen möchten. Oder man kann es als Parameter in x.com iframe url umfasst mit Javascript:

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

Eine Abhilfe kamen wir nur mit an meinem Job up war das Cookie über eine window.open einzustellen () - es ist nicht für Sie optimal sein kann (wie Sie ein hässlicher Arsch Popup-Fenster geöffnet haben werden), aber es funktionierte gut für uns. Wir mussten ein Popup-Fenster sowieso für OAuth-Authentifizierung geöffnet haben.

So ist der jist das, was wir taten, war:

  1. Der Benutzer klickt auf einen Link von B.com
  2. Popup-Fenster öffnet sich zu A.com/setCookie
  3. A.com setzt seine Cookie und leitet dann zu B.com an der richtigen Stelle

Auch hier gilt nicht in allen Lösungen, aber es funktionierte in unserem. Hoffe, das hilft.

Ich weiß, diese Frage ist ziemlich alt, aber das hat mir geholfen, Cookies Problem zu lösen:

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

cookieForm.submit();

Die Idee, eine Form-Post auf einer Seite zu machen, dass Ihre Cookies setzt.

* EDIT * Diese Lösung wurde so in WebKit berichtet geschlossen.

Luca,

Ok, so dass diese Antwort ist zwei Jahre alt, aber ... Sie ein Cookie von einem Iframe festlegen können, wenn Sie ein Formular in einem versteckten iframe posten. Sie können dies tun, indem Sie ein Formular erstellen:

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

Dann in Javascript, einen Verweis auf das Formular erhalten und rufen Sie einreichen:

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

können Sie auf der onload des iframe hören, oder Sie können Ihre iframe Aktion Seite Problem einige Javascript haben, die die Last signalisiert. Ich habe dies getestet in Safari und Chrome, und es funktioniert.

Prost.

Dies könnte nicht für alle, aber ich über dieses Thema gekommen, weil ich eine App aus einer anderen Host-Reaktion diente als die API und die Lösung, die schließlich arbeitete, war die Verwendung von DNS:

Unser Kunde wurde serviert von www.company-name.com und unsere API war auf company-name.herokuapp.com. Indem Sie eine CNAME Datensatz api.company-name.com -> company-name.herokuapp.com und unseren Kunden den Einsatz mit, die für die API-Aufrufe Sub-Domain, Safari aufhörte wenn man bedenkt es ein „Dritt "Cookie.

Der Vorteil ist, dass es sehr wenig Code beteiligt, und es ist alles mit gut etablierten Sachen ... Der Nachteil ist, dass Sie eine gewisse Kontrolle / Eigentum über die API-Host benötigen, wenn Sie https verwenden werden - sie brauchen eine Zertifikat, das für die Client-Domäne oder Benutzer erhält ein Zertifikat Warnung erhält gültig ist -. so würde dies nicht funktionieren (zumindest nicht für etwas Endverbraucher gerichteten), wenn die API in Frage ist nicht verkaufen oder ein Partner

Vielleicht pragmatisch erstellen und eine Verbindung mit einem href="A.com/setCookie?cache=1231213123" und einem Zielattribut klicken auf einen versteckten iframe zeigt. Die kann Bypass Safari Politik der Benutzerführung für die Einstellung von Cookies (ich habe nicht Safari praktisch zu testen.)

Ich habe einige umfangreiche Untersuchung, um dieses, wenn ich eine Website bereitstellen versuchte, die Windows Live ID verwendet, die auf der Fähigkeit ab, in der Lage sein 3rd-Party-Cookies zu setzen, um sich abzumelden. Es ist einfach ... hat nicht funktioniert. Nichts, was wir tun könnten, wäre damit es funktioniert. Das Live ID-Team hat auch umfangreiche Untersuchungen und ihre Antwort war „kann es nicht funktioniert“.

Beachten Sie die folgende Zeile:

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

Ich konnte nicht diese Arbeit bekommen, bis ich die http hinzugefügt, d.

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

fand ich eine einfache Lösung. Sie müssen nur für die erste Zeit Cookie Einstellung zu überprüfen, ob Anfrage aus demselben Ursprung oder nicht, wenn nicht wie üblich ein Skript in iframe zurückgeben müssen, der diese Anforderung wiederholen wird, bereits die Erlaubnis Cookie zuweisen zu müssen. Danach können Sie andere Anfrage iframe tun direkt über dieses Cookie zugreifen. Das half mir in meinem Tracking-System. Versuchen Sie, das funktioniert gut.

Es ist erwähnenswert, dass diese Einschränkung in Safari nicht über Sub-Domains gilt. Also, wenn Sie direkt sitea.com besuchen, dann können Sie Cookies von subdomain.sitea.com ohne direkte Interaktion mit dem Benutzer (Iframe / JavaScript).

Dies war relevant für meinen Fall, wenn eine API zu entwickeln. Wenn Sie Besucher bei mysite.com ankommen, und dann wollen Sie einige JavaScript mit Ihrem API zu kommunizieren, sich dann, wenn die API bei api.mysite.com gehostet wird, dann wird es auf Safari arbeiten.

Dieses JavaScript auf der Seite macht Cross-Domain-Anfragen, 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>

Dann erstellen Sie eine Datei auf dem anderen Server, die Cookies zu setzen braucht, 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();
  }
  ?>

Hier ist, wie das funktioniert:

  1. Wenn http://example1.com/index.html zuerst besucht, wird eine Überprüfung vorgenommen, um zu sehen, ob der Browser Safari ist und ob eine GET-Parameter des Namens „aktiviert“ existiert nicht. Wenn beide Bedingungen erfüllt sind (die auf dem ersten Besuch für einen Safari-Browser passieren wird), dann wird der Browser http : //example2.com/activate.php mit einem GET-Parameter „Callback“, die anrufende URL mit „aktivierten“ Parameter angehängt enthält.

  2. http://example2.com/activate.php leitet einfach zurück in die URL in der GET-Parameter enthalten, "Rückruf".

  3. Wenn http: //example1.index.html nun dieses zweite Mal getroffen wird, nachdem sie umgeleitet zu, wird nun der GET-Parameter „aktiviert“ gesetzt werden, so führen Sie die bedingte von Schritt 1 nicht, so dass das Skript der Ausführung fortzusetzen erlaubt.

Dies erfüllt Safari Anforderung des Browser mit der 3rd-Party-Domäne mindestens einmal besuchen, um Cookies zu starten Einstellung.

Versuchen Sie so etwas wie:

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

Es kann Safari der Sicherheitsrichtlinien umgehen.

Es ist nicht die fehlende Typ-Attribut thats, ärgert dich? -)

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top