javascript - Establecer cookies entre dominios en Safari
cross-domain cross-site (16)
* EDITAR * Esta solución temporal ha sido reportada cerrada en WebKit.
Luca,
Ok, entonces esta respuesta tiene dos años, pero ... puedes establecer una cookie desde un iframe si publicas un formulario en un iframe oculto. Puedes hacer esto creando un formulario:
<form id="myiframe" action="http://yourdomain.com" method="POST" target="iframe_target">
Luego, en Javascript, obtenga una referencia al formulario y llame a submit:
document.getElementsByTagName(''form'')[0].submit();
Puede escuchar la carga del iframe, o puede hacer que su página de acción iframe emita algún javascript que indique la carga. He probado esto en Safari y Chrome, y funciona.
Aclamaciones.
El bookmarklet de Evernote es capaz de hacer esto, por lo tanto, la respuesta más votada no responde a esto aunque la recompensa vaya a él (de una manera no productiva).
Tengo que llamar al dominio A.com (que establece las cookies con http) desde el dominio B.com. Todo lo que hago en el dominio B.com es (javascript):
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "A.com/setCookie?cache=1231213123";
head.appendChild(script);
Esto establece la cookie en A.com en cada navegador que he probado, excepto Safari. Sorprendentemente, esto funciona en IE6, incluso sin los encabezados P3P.
¿Hay alguna manera de hacer que esto funcione en Safari?
Aquí hay una solución que funciona:
http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/
De las Safari Developer FAQ
:
Safari se envía con una política de cookies conservadora que limita las escrituras de cookies a solo las páginas elegidas ("navegadas a") por el usuario. Esta política conservadora predeterminada puede confundir los sitios basados en marcos que intentan escribir cookies y fallan.
No he encontrado manera de evitar esto.
Si vale algo, Chrome no establece las cookies si usas el método <script
> que se agrega, pero si tienes un <img
> oculto con la misma fuente, Chrome funciona además del resto de los navegadores (excepto de nuevo, Safari)
Encontré una solución simple. Solo necesita configurar la cookie por primera vez para verificar si la solicitud proviene del mismo origen o no, si no es así, debe devolver al iframe un script que repita esta solicitud, que ya tiene permiso para asignar la cookie. Después de eso, puede hacer otra solicitud directamente a través de iframe accediendo a esta cookie. Esto me ayudó en mi sistema de seguimiento. Intenta, esto funciona bien.
Existe una solución adecuada para este funcionamiento en 2015. Digamos que hay un sitio web y.com que incluye iframe con el sitio x.com. El iframe x.com quiere almacenar una cookie. Eso no está permitido por la política de Safari, sin embargo, y.com puede almacenarlo. Entonces y.com debe escuchar los mensajes de x.com y luego almacenar la cookie.
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);
Cuando x.com necesita almacenar la cookie, debe publicar un mensaje en y.com:
window.parent.postMessage(''cookieset|''+ckName+''|''+ckVal+''|''+days,''*'');
También puede trabajar para enviar mensajes al iframe si desea leer la cookie. O puede incluirlo como parámetro en x.com iframe url usando javascript:
iframe.setAttribute(''url'',''x.com/?cookieval=''+YOUR_COOKIE_GET_METHOD(''cookiename''));
Hay un pequeño truco malvado suponiendo que tienen flash instalado.
No estoy seguro de si todavía funciona o no, pero los "Objetos locales compartidos" de Flash, también conocidos como cookies Flash, podrían ayudarlo a circunnavegar las políticas del mismo dominio de Safari.
Tutorial de objetos compartidos locales
Sin embargo, puede ser complicado de implementar, por decir lo menos.
Además, los LSO se están convirtiendo en una pesadilla de seguridad:
- Centro de Información de Privacidad Electrónica en LSO''s
- Flash Cookies: El asesino de privacidad silencioso
Así que piensa cuidadosamente antes de usarlos.
Hice una investigación exhaustiva al respecto cuando intentaba implementar un sitio que usaba Windows Live ID, que dependía de la capacidad de poder establecer cookies de terceros para cerrar la sesión. Simplemente ... no funcionó. Nada que pudiéramos hacer lo haría funcionar. El equipo de Live ID también hizo una investigación exhaustiva y su respuesta fue "no puede hacer que funcione".
Método de trabajo 2014-2016:
Tienes que hacer window.open en el dominio / asignar una cookie / cerrar la ventana emergente, el dominio ahora está safelisted.
Mensaje original @ PHP múltiples cookies que no funcionan en el navegador iPad / iPhone
No es el atributo de tipo que falta que te molesta? -)
<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>
Pruebe algo como:
var w = window.open("A.com/setCookie?cache=1231213123");
w.close();
Puede pasar por alto la política de seguridad de safari.
Sé que esta pregunta es bastante antigua, pero esto me ayudó a resolver el problema de las cookies:
var cookieForm = document.createElement("form");
cookieForm.action = "A.com/setCookie?cache=1231213123";
cookieForm.method = "post";
document.body.appendChild(cookieForm);
cookieForm.submit();
La idea de hacer una publicación de formulario en una página que establece sus cookies.
Tal vez pragmáticamente crear y hacer clic en un enlace con un href="A.com/setCookie?cache=1231213123"
y un atributo de destino que apunta a un iframe oculto. Eso puede eludir la política de navegación de usuario de Safari para establecer cookies (no tengo a mano Safari para probar).
Tenga en cuenta esta línea:
script.src = "A.com/setCookie?cache=1231213123";
No pude hacer que esto funcionara hasta que agregué el http, es decir,
script.src = "http://A.com/setCookie?cache=1231213123";
Una publicación en un <iframe>
oculto puede permitirle eludir esta restricción en 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>
Una solución que acabamos de idear en mi trabajo fue configurar la cookie a través de window.open () - puede que no sea óptima para usted (ya que tendrá una ventana emergente de feo culo abierta), pero funcionó bien para nosotros . Tuvimos que tener una ventana emergente abierta de todos modos para la autenticación OAuth.
Entonces, la explicación de lo que hicimos fue:
- El usuario hace clic en un enlace de B.com
- La ventana emergente se abre en A.com/setCookie
- A.com establece su cookie y luego redirige a B.com en el lugar correcto
De nuevo, no es válido en todas las soluciones, pero funcionó en el nuestro. Espero que esto ayude.
Vale la pena señalar que esta restricción en Safari no se aplica a todos los subdominios. Por lo tanto, si visita sitea.com directamente, puede configurar las cookies de subdomain.sitea.com sin interacción directa del usuario (iframe / JavaScript).
Esto fue relevante para mi caso al desarrollar una API. Si sus visitantes llegan a mysite.com, y luego quiere que JavaScript interactúe con su API, entonces si la API está alojada en api.mysite.com, funcionará en Safari.