2012-04-24 6 views
10

Muchos de ustedes probablemente conozcan la nueva ley de privacidad de la UE, pero para los que no lo son, básicamente significa que ningún sitio operado por una empresa residente en la UE puede establecer cookies clasificadas como 'no esenciales para el funcionamiento de la sitio web en una máquina de visitantes a menos que se le haya dado permiso expreso para hacerlo.¿Es posible bloquear el uso de cookies mediante Javascript o PHP?

Entonces, la pregunta es ¿cómo lidiar mejor con esto?

Los navegadores, obviamente, tienen la capacidad de bloquear las cookies de un sitio web específico integrado en ellas. Mi pregunta es, ¿hay alguna manera de hacer algo similar usando JS o PHP?

es decir, interceptar las cookies que puedan estar intentando establecerse (incluidas las cookies de terceros como Analytics o Facebook) y bloquearlas a menos que el usuario haya dado su consentimiento.

Es obviamente posible eliminar todas las cookies una vez que se han establecido, pero aunque esto equivale a lo mismo que no permitir que se establezcan en primer lugar, supongo que no es lo suficientemente bueno en este caso porque no se adhiere a la letra de la ley.

Ideas?

+0

No puede. Es tan simple como eso. Sus cookies de Analytics, por ejemplo, probablemente provengan de otro host (por ejemplo, 'analytics.google.com') que no controla. Con respecto a sus propias cookies, puede volver a desactivarlas después de configurarlas, pero eso ... en realidad no tiene ningún sentido, a menos que esté hablando de un software de terceros que se ejecuta en su host. – caw

Respuesta

10

Estoy muy interesado en esta respuesta también. Logré lo que necesito lograr en PHP, pero el componente de JavaScript todavía me elude.

He aquí cómo lo estoy haciendo en PHP:

$dirty = false; 
foreach(headers_list() as $header) { 
    if($dirty) continue; // I already know it needs to be cleaned 
    if(preg_match('/Set-Cookie/',$header)) $dirty = true; 
} 
if($dirty) { 
    $phpversion = explode('.',phpversion()); 
    if($phpversion[1] >= 3) { 
     header_remove('Set-Cookie'); // php 5.3 
    } else { 
     header('Set-Cookie:'); // php 5.2 
    }   
} 

entonces tengo algo de código adicional que convierte a esta apagado cuando el usuario acepta las cookies.

El problema es que hay plugins de terceros que se usan en mi sitio que manipulan las cookies a través de javascript y no escanean a través de ellos para determinar cuáles acceden a document.cookie; aún pueden establecer cookies.

Sería conveniente si todos usaran el mismo marco, por lo que podría anular una función setCookie, pero no es así.

Sería bueno si pudiera eliminar o desactivar document.cookie por lo que se convierte en inaccesible ...

EDIT: Es posible prevenir el acceso javascript para obtener o las cookies.

document.__defineGetter__("cookie", function() { return '';}); 
document.__defineSetter__("cookie", function() {}); 

EDIT 2: Para que esto funcione en IE:

if(!document.__defineGetter__) { 
    Object.defineProperty(document, 'cookie', { 
     get: function(){return ''}, 
     set: function(){return true}, 
    }); 
} else { 
    document.__defineGetter__("cookie", function() { return '';}); 
    document.__defineSetter__("cookie", function() {}); 
} 
1

¿Qué tal not paying attention to hoaxes?

Aparte del hecho de que esto es una noticia antigua, el texto dice claramente que solo se aplica a las cookies que son no esenciales para la función del sitio. Significa cookies de sesión, una cesta de la compra, o cualquier cosa que esté directamente relacionada con hacer que el sitio funcione. Cualquier otra cosa (seguimiento, estadísticas, etc.) "no está permitido" sin permiso.

+0

No es su responsabilidad impedir que se establezcan las cookies de Google (o de otra persona, salvo la suya). –

+2

Pero ese es el punto exacto - en la UE ahora es, y la ley comenzará a aplicarse el 25 de mayo de este año. Cualquier sitio que elija alojar cookies de terceros es responsable de explicarle al usuario lo que hace y darle la opción de bloquear estas cookies. Binning Analytics, etc. obviamente no es una opción factible, así que estoy buscando alguna otra técnica – freestate

3

No se puede desactivar por completo, pero se puede anular el valor predeterminado con .htaccess

Trate

SetEnv session.use_cookies='0'; 

Si es opcional para algunos usuarios no utilizan .htaccess

if(!$isAuth) 
{ 
    ini_set('session.use_cookies', '0'); 
} 
+0

no había considerado .htaccess - sin embargo, si estoy en lo cierto: 1. esto se aplicará a todos los usuarios y 2: no hay forma de permitir las cookies si se otorga el permiso? – freestate

+0

tiene la razón ... puedo actualizar la respuesta para incluir un permiso opcional – Baba

+0

enfoque interesante ... ¿esto impediría que las cookies de terceros (es decir, Google Analytics) se establezcan también? – freestate

7

Adapté códigos Michaels de aquí para llegar a esto.

Básicamente utiliza los métodos defineGetter y defineSetter para configurar todas las cookies en la página y luego eliminar las especificadas por el usuario, esta función también podría invertirse si esto es lo que pretende.

He probado esto con cookies de terceros como Google Analytics y parece funcionar bien (excluyendo la cookie __utmb significa que ya no me recogen en Google Analytics), tal vez podría usar esto y adaptarlo a su específica necesariamente.

He incluido la parte acerca de si el nombre de una cookie no es __utmb para su referencia, aunque podría tomar fácilmente estos valores de una matriz y recorrerlos de esa manera.

Básicamente esta función incluirá todas las cookies, excepto los que se especifican en la parte que establece if(cookie_name.trim() != '__utmb') { all_cookies = all_cookies + cookies[i] + ";"; }

Se podría añadir a esto utilizando OR o AND filtros o tirar de una matriz, base de datos, la entrada del usuario, o lo que quiera excluir específicos (útiles para determinar entre cookies esenciales y no esenciales).

function deleteSpecificCookies() { 

var cookies = document.cookie.split(";"); 
var all_cookies = ''; 

    for (var i = 0; i < cookies.length; i++) { 

     var cookie_name = cookies[i].split("=")[0]; 
     var cookie_value = cookies[i].split("=")[1]; 

     if(cookie_name.trim() != '__utmb') { all_cookies = all_cookies + cookies[i] + ";"; } 


    } 

if(!document.__defineGetter__) { 

    Object.defineProperty(document, 'cookie', { 
     get: function(){return all_cookies; }, 
     set: function(){return true}, 
    }); 

} else { 

    document.__defineGetter__("cookie", function() { return all_cookies; }); 
    document.__defineSetter__("cookie", function() { return true; }); 

} 

} 
Cuestiones relacionadas