2016-07-26 19 views
13

Das Problem:Local Storage Cross Domain - Safari deaktiviert es standardmäßig

I Github-Projekt von Ofir Dagan verwendet haben: Speichern von Cross-Domain lokalen Speicher.

Es implementiert html5 lokalen Speicher: https://github.com/ofirdagan/cross-domain-local-storage


Das Problem:

Safari erlaubt keine Cookies von Drittanbietern standardmäßig (anderer Browser erlaubt es).

Safari Datenschutzeinstellungen sind:

enter image description here

Der Standardwert ist: "Erlauben von Websites, die ich besuchen".

Ich las über diese Einstellungen:

  1. Immer sperren - Block alle Cookies von Erstanbietern und blockieren alle Cookies von Drittanbietern.

  2. Nur aktuelle Website zulassen - Alle Cookies von Erstanbietern zulassen und alle Cookies von Drittanbietern blockieren.

  3. von Websites zulassen I Besuchen - Lassen Sie alle Cookies von Erstanbietern und blockieren alle Cookies von Drittanbietern, es sei denn, dass Dritte eine erste Partei auf einmal war (basierend auf aktuellen Cookies und Browserverlauf).

  4. Immer zulassen - Alle Cookies von Erstanbietern zulassen und alle Cookies von Drittanbietern zulassen.


Lösung Ich habe versucht:

Local Storage mit einem iframe (Pixel) - Ich denke, es ist nicht mehr auf Safari funktioniert - Is there any workaround to set third party cookie in Iframe for safari?


Ich denke, dass Es gibt eine Möglichkeit, lokalen Speicherplatz zwischen Websites von Erstanbietern und Drittanbietern in Safari freizugeben. (Facebook.com und Booking.com teilen Daten zwischen verschiedenen Domains).

Ich habe es erreicht, indem ich die API löschte und es selbst schrieb, aber ich möchte nicht die API entfernen und es selbst implementieren (hoffe, dass es eine kleine Korrektur gibt, um Safari zu unterstützen):

Iframe.html:

window.addEventListener('cors_event', function(event) { 
    if(event.event_id === 'my_cors_message'){ 
     if (event.data.options.funcName == "SetItem") { 
      localStorage.setItem(event.data.options.key, event.data.options.value); 
     } 
     else if (event.data.options.funcName == "GetItem") { 
      return localStorage.getItem(event.data.options.key); 
     } 
    } 
}); 

MainPage:

<iframe id="target" src="iframe.html" frameborder="1"></iframe> 

<script> 

    var target = document .getElementById('target'); 
    target.onload = function(){ 
     target.contentWindow.postMessage('set', '*') 
    } 
</script> 

Weiß jemand, wie ich das erreichen kann, indem ich eine API-Logik ändere, um Safari zu unterstützen?

Jede Hilfe wird geschätzt!

+0

keine Cookies und lokale Speicherung verwirren. Das sind verschiedene Dinge. Cookies sind überhaupt nicht mit dem lokalen Speicher verknüpft. Wenn Sie also lokalen Speicher verwenden, kann die Richtlinie zum Umgang mit Cookies keine Probleme mit dem lokalen Speicher verursachen. – hindmost

+0

Ich weiß, dass Cookies und lokaler Speicher unterschiedlich sind. Wenn ich jedoch zu "Immer zulassen" wechsle, wird der lokale Speicher von der Cross-Domain gelesen. Ich denke, dass lokaler Speicher mit "und Website-Daten" verwandt ist. Ich kann Ihnen ein Beispiel dafür senden .. (Speichern von Daten im lokalen Speicher der Website X und dann gehen Sie zur Website Y, die versucht, die Daten zu lesen). –

+1

Bei welcher Safari-Version wurde dieses Verhalten geändert? – mash

Antwort

6

Sie Store.JS versuchen können. Gemäß der Dokumentation:

store.js eine einfache API für Cross-Browser lokalen Speicher macht

+5

Funktioniert store.js domänenübergreifend? Ich sehe, wo es Cross-Browser sagt, aber keinen Verweis auf Cross-Domain (das ist sehr unterschiedlich). –

+0

Wenn sich jemand fragt, funktioniert das nicht domainübergreifend für Safari. Wenn also Ihre Top-Level-Domain "site-a.com" und Ihr iframe "site-b.com" ist, werden die Daten für "site-b" gelöscht. –

3

Hinweise auf Safari 7+ (OSX, iOS)

All Cross-Domain lokaler Speicherzugriff ist standardmäßig mit Safari 7+ deaktiviert. Dies ist ein Ergebnis der Datenschutzeinstellung "Cookies und andere Websitedaten blockieren", die auf "Von Dritten und Werbetreibenden" gesetzt ist. Jeder cross-storage-Client-Code stürzt nicht ab. Er hat jedoch nur Zugriff auf eine isolierte isolierte lokale Speicherinstanz. Daher kann auf keine der Daten zugegriffen werden, die zuvor von anderen Herkünften festgelegt wurden. Wenn eine Option verwendet wird, könnte man auf Root-Cookies für diese Benutzeragenten zurückgreifen oder die Daten von einem serverseitigen Speicher anfordern.

weitere Details zu sehen dies lib