是否可以阻止使用Javascript或PHP设置cookie?

fre*_*ate 18 javascript php cookies blocking

很多人可能都知道新的欧盟隐私法,但对于那些没有的人,它基本上意味着没有一个居住在欧盟的公司运营的网站可以设置被归类为"对网站运营不重要"的cookie在访客机器上,除非获得明确许可.

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

浏览器显然能够阻止内置于其中的特定网站的cookie.我的问题是,有没有办法使用JS或PHP做类似的事情?

即拦截可能试图设置的任何cookie(包括像Analytics或Facebook这样的第三方cookie),并阻止它们,除非用户已经同意.

显然有可能在设置完成后删除所有的cookie,但是虽然这相当于不允许它们首先被设置,但我猜它在这种情况下不够好,因为它没有坚持法律条文.

想法?

Mic*_*ael 12

我对这个答案也很感兴趣.我已经完成了我需要在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
    }        
}
Run Code Online (Sandbox Code Playgroud)

然后我有一些额外的代码,当用户接受cookie时将其关闭.

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

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

如果我可以删除或禁用document.cookie以便它变得无法访问,那将是很好的...

编辑:可以防止JavaScript访问获取或设置cookie.

document.__defineGetter__("cookie", function() { return '';} );
document.__defineSetter__("cookie", function() {} );
Run Code Online (Sandbox Code Playgroud)

编辑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() {} );
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*one 10

我从这里改编了Michaels代码来提出这个问题.

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

我已经使用第三方Cookie(例如Google Analytics)对此进行了测试,但它似乎运行良好(不包括__utmbCookie意味着我不再在Google Analytics中使用),也许您可​​以使用它并根据您的特定需求进行调整.

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

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

您可以使用OR或AND过滤器添加或者从数组,数据库,用户输入或任何您喜欢的内容中提取以排除特定的(用于确定基本cookie和非必要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; } );

}

}
Run Code Online (Sandbox Code Playgroud)