javascript - internet - bloquear cookies de terceros-solución(aplicaciones de Facebook, etc.)
ver cookies chrome android (6)
Es posible que deba usar un archivo de políticas de dominio cruzado para que el swf funcione correctamente.
Safari en una Mac tiene un Block cookies
establecido en From third parties and advertisers
de forma predeterminada.
Impide que el SharedObject funcione si el swf incrustado es de un dominio diferente.
Este problema no es nuevo: ¿el truco de iframe de cookies de terceros de Safari ya no funciona?
¿Alguien ha encontrado una solución (aparte de pasar el ID de sesión a través de los parámetros GET / POST en cada solicitud)?
NOTA: No tengo acceso al sitio, que está incrustando el swf, por lo que no hay manera de alterar ese HTML o de poner ningún JavaScript, etc.
He resuelto de esta manera, pero es mejor usar HTML5 localstorage y hacer que los servicios web sean tranquilos porque mantener las variables de sesión en server2 hace que su aplicación no sea bien escalable. Aquí el código que he usado para resolver el problema de cookies de terceros. Básicamente, los invitados del servidor1 van primero al servidor2 para tomar "la moneda: D" y de repente regresa al servidor1. De esta manera, las variables de sesión de server2 están disponibles en toda la navegación. www.yourserver.com/index.html page
<script src="js/jquery.cookie.js" type="text/javascript"></script>
<script src="js/mobile-detect.js" type="text/javascript"></script>
<script>
var md = new MobileDetect(window.navigator.userAgent);
if (md.userAgent()==''Safari'') {
var firstsafariuser = $.cookie(''safari-user'');
if (firstsafariuser != ''true'') {
$.cookie(''safari-user'', true);
location.href=''http://www.yourserver2.com/coin.php?frompage=''
+location.href.replace(location.hash,"")+''&hashtags=''+location.hash.substr(1);
}
}
</script>
www.yourserver2.com/coin.php
<?php
session_start();
if (isset($_GET["frompage"])&&$_GET["frompage"]!=null){
$url=$_GET["frompage"];
} else {
$url=''http://www.yourserver.com'';
}
if (isset($_GET["hashtags"])&&$_GET["hashtags"]!=null){
$hash=''#''.$_GET["hashtags"];
} else {
$hash='''';
}
header(''Location:''.$url.$hash);
?>
PS window.open se ve como un tipo de ventana emergente, por lo que puede tener problemas con los bloqueadores de anuncios o la configuración del navegador.
Puedo decir por experiencia muy reciente que esto no es un problema con Safari en una Mac, ni tampoco lo he experimentado como un problema.
Mencionó que la configuración está bloqueando las cookies de terceros: el almacenamiento de SharedObject nunca es de un tercero, es del sitio que está visitando (¿el primero?). Así que no creo que eso sea un problema.
Mediante el panel de configuración de Flash Player, el usuario puede deshabilitar SharedObject
(o limitar la cantidad de espacio de almacenamiento). Entonces, en general, su aplicación debe manejar el caso en el que SharedObject
no esté disponible.
Sin embargo, creo que la mayoría de los usuarios no conocen el SharedObject
y que pueden desactivarlo.
Safari sigue bloqueando las cookies de los dominios que no ha visitado en la ventana superior .
Para solucionar esto, contamos ($ _ COOKIES) en PHP y dirigimos el navegador a una página de nuestro dominio cuyo trabajo es simplemente enviar el navegador de regreso a donde proviene. Es un truco sucio, lo que significa que algunos usuarios se alejarán y volverán innecesariamente, pero la red está llena de trucos sucios.
Si no puede configurar top.location.href
en una página del dominio que necesita configurar cookies, o no puede modificar una página en dicho dominio, entonces puedo decir con confianza que necesitará usar sesiones basadas en URL.
Sin embargo, una opción alternativa (que aún requiere poder crear una página en el dominio) es solicitar que el usuario haga clic en su SWF, luego puede activar window.open
y hacer que la URL apunte a la página que creó. Todo lo que tiene que hacer es cargar con éxito, entonces el usuario (o incluso JS en la página emergente) puede cerrar la ventana emergente. A continuación, puede establecer cookies.
Desarrollo aplicaciones de Facebook, que viven dentro de iframes, que sufren este problema. Cada aplicación individual tiene que ser enviada con esta solución.
Solo para agregar una forma más limpia sin setTimeout ni jquery para la página safari.xxx. Funciona bien con el último ios (8.1.2), sé que para 8.1.0 hubo un error donde la ventana / pestaña no se cerraría.
Aquí está el código:
<%
request.getSession(true); //or anyway to set the cookie depending on your language (jsp here)
%>
<script type="text/javascript">
window.addEventListener("load", window.close);
</script>
La ventana emergente no es un problema en mi caso, ya que se inicia con un clic del usuario.
function setCookie(){
if ( navigator.userAgent.indexOf(''Safari'') != -1 &&
navigator.userAgent.indexOf(''Chrome'') == -1 ){
window.open(''safari.php'','''',''width=200,height=100'' );
}
}
// then we set the cookie in safari.php
Fuente: http://www.reizbombardement.de/archives/safari-5-1-4-enforces-cookie-policy
// ACTUALIZACIÓN 23 de julio de 2013
Esta forma horrible de solucionar este problema solía funcionar hasta Safari 6.
Por favor vea los comentarios de @Fabio Antunes y @ncubica a continuación.
// ACTUALIZACIÓN 23 de julio de 2013 por Fabio Antunes
Aquí está mi código
En la página de destino tendremos una breve descripción de la aplicación y un botón que dice algo como "entrar". Estoy usando jquery para simplificar este proceso, creando un oyente para el evento de clic, solo pondré el código javascript, ya que asumo que ya tienes el resto del código html para la página de destino:
$(document).on("click", "#bt-landing", function(){
var left = (screen.width/2)-(500/2);
var top = (screen.height/2)-(250/2);
window.open(''URL_FOR_THE_PHP_THAT_WILL_CREATE_THE_SESSION'', ''_blank'', ''width=500,height=250,toolbar=0,location=0,menubar=0, top=''+top+'', left=''+left);
});
Esto abrirá una pequeña ventana, con 500 por 250 px, centrada en su pantalla.
El código que tengo para la ventana pequeña es este:
<?php setcookie("safari_cookie", "1");?>
<html>
<head>
<meta charset="utf-8">
<title>THE NAME OF YOUR APP OR SOMETHING THAT THE USER WE''LL READ AND ASSUME THAT THIS SMALL WINDOW IS RELIABLE</title>
</head>
<body>
<script type="text/javascript">
$(document).ready(function(){
setTimeout(function(){window.close()},1000);
})
</script>
</body>
</html