21

很多人可能都知道新的欧盟隐私法,但对于那些不知道的人来说,这基本上意味着欧盟居民公司运营的任何网站都不能设置归类为“对网站运营非必要”的 cookie在访客机器上,除非得到明确许可。

那么,问题就变成了如何最好地处理这个问题?

浏览器显然有能力阻止来自内置于它们的特定网站的 cookie。我的问题是,有没有办法使用 JS 或 PHP 做类似的事情?

即拦截可能试图设置的任何 cookie(包括分析或 Facebook 等第 3 方 cookie),并阻止它们,除非用户同意。

显然,一旦设置了所有 cookie,就可以删除它们,但是尽管这与一开始就不允许设置它们是一样的,但我猜在这种情况下它还不够好,因为它没有遵守法律条文。

想法?

4

5 回答 5

17

我也对这个答案很感兴趣。我已经完成了我需要在 PHP 中完成的工作,但是 JavaScript 组件仍然让我望而却步。

这是我在 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
    }        
}

然后我有一些额外的代码可以在用户接受 cookie 时将其关闭。

问题是我的网站中使用了第三方插件,它们通过 javascript 操作 cookie,并且没有扫描它们以确定哪些访问 document.cookie - 他们仍然可以设置 cookie。

如果他们都使用相同的框架会很方便,所以我可能能够覆盖 setCookie 函数 - 但他们没有。

如果我可以删除或禁用 document.cookie 以使其无法访问,那就太好了...

编辑:可以防止 javascript 访问获取或设置 cookie。

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

编辑 2:为此在 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() {} );
}
于 2012-05-31T07:12:59.560 回答
11

我从这里改编了迈克尔斯的代码来提出这个问题。

基本上它使用defineGetteranddefineSetter方法设置页面上的所有 cookie,然后删除用户指定的 cookie,如果这是您的目标,这个角色当然也可以反转。

我已经使用第三方 cookie(例如 Google Analytics)对此进行了测试,它似乎运行良好(不包括__utmbcookie 意味着我不再在 Google Analytics 中被选中),也许您可​​以使用它并使其适应您的特定需求。

我已经包含了关于如果 cookie 名称不__utmb供您参考的部分,尽管您可以轻松地从数组中获取这些值并以这种方式循环这些值。

基本上,此功能将包括所有 cookie,除了在声明部分中指定的那些if( cookie_name.trim() != '__utmb' ) { all_cookies = all_cookies + cookies[i] + ";"; }

您可以使用 OR 或 AND 过滤器添加此内容,或从数组、数据库、用户输入或任何您喜欢排除特定内容的内容中提取(用于确定必要和非必要 cookie)。

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

}

}
于 2013-03-08T17:26:14.263 回答
2

您不能完全禁用它,但您可以使用覆盖默认设置.htaccess

尝试

 SetEnv session.use_cookies='0';

如果它对某些用户是可选的,请不要使用.htaccess

if(!$isAuth)
{
    ini_set('session.use_cookies', '0');
}
于 2012-04-24T21:38:24.243 回答
1

有点老了,但我认为你应该得到一个有效的答案:

第一步:不要执行第三方脚本代码。

第 2 步:显示 cookie 横幅。

第三步:等到用户接受,现在就可以执行第三方脚本代码了。

为我工作。

于 2019-10-08T16:38:09.807 回答
-2

不注意恶作剧怎么样?

除了这是旧消息这一事实之外,文本清楚地表明它仅适用于对网站功能不重要的 cookie 。这意味着会话 cookie、购物篮或与使网站正常运行直接相关的任何东西都非常好。未经许可,“不允许”任何其他内容(跟踪、统计信息等)。

于 2012-04-24T21:31:24.043 回答