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


Is it possible to block cookies from being set using Javascript or PHP?

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

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

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

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

显然,一旦设置

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

想法?

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

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

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

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

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

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

您可以使用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; } );
}
}

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

尝试

 SetEnv session.use_cookies='0';

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

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

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

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

第 2 步:显示 cookie 横幅。

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

为我工作。

不注意恶作剧怎么样?

除了这是旧消息这一事实之外,文本还明确指出它仅适用于对网站功能不重要的cookie。这意味着会话cookie,购物篮或任何与使网站运行直接相关的内容都可以。未经许可,其他任何内容(跟踪、统计数据等)都是"不允许的"。