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

2022-08-30 19:13:17

你们中的许多人可能都知道新的欧盟隐私法,但对于那些不了解的人来说,这基本上意味着,除非获得明确许可,否则由欧盟居民公司运营的网站无法在访问者机器上设置被归类为“对网站运营非必需”的cookie。

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

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

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

一旦设置了它们,显然可以删除所有cookie,但是尽管这与首先不允许设置它们相同,但我猜在这种情况下它不够好,因为它不符合法律条文。

想法?


答案 1

我对这个答案也很感兴趣。我已经在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() {} );
}

答案 2

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

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

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

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

基本上,此功能将包括除在状态部分中指定的Cookie之外的所有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; } );

}

}