【问题标题】:Is it possible to block cookies from being set using Javascript or PHP?是否可以阻止使用 Javascript 或 PHP 设置 cookie?
【发布时间】:2012-05-05 13:58:23
【问题描述】:

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

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

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

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

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

想法?

【问题讨论】:

  • 你不能。就这么简单。例如,您的 Analytics cookie 可能来自您无法控制的其他主机(例如 analytics.google.com)。关于您自己的 cookie,您可以在设置它们之后再次取消设置它们,但这...并没有任何意义——除非您谈论的是在您的主机上运行的第三方软件。
  • 声明欧盟可以将cookies归类为“对网站运行非必要”是不正确的。 GDPR 指令:首先是技术中立的,其次它仅适用于自然人的个人数据。因此,如果使用名为“cookies”的技术来处理可以识别自然人的数据,那么对于“cookies”的这种特殊用途,必须征得同意。例如,如果我们使用“cookies”来跟踪用户会话,但服务器不包含可以识别用户背后自然人的数据,则不需要同意。

标签: php javascript cookies blocking


【解决方案1】:

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

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

第 2 步:显示 cookie 横幅。

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

为我工作。

【讨论】:

    【解决方案2】:

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

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

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

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

    基本上这个函数将包括除了那些在声明if( cookie_name.trim() != '__utmb' ) { all_cookies = all_cookies + cookies[i] + ";"; }的部分中指定的cookie之外的所有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; } );
    
    }
    
    }
    

    【讨论】:

    • 您是如何测试 GA 等第三方 cookie 是否被阻止的?我似乎无法仅通过 GA 调试来区分。
    • document.cookie
    【解决方案3】:

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

    【讨论】:

    • 有没有办法通过 JavaScript 仅阻止特定的 cookie?
    • 您必须将本机 cookie 函数移动到另一个函数名称,然后重写 cookie 函数以检查内容,然后再拒绝 cookie 或将其发送到新的 cookie 函数。我什至不确定将本机功能移动到其他地方是否会或可以工作......
    【解决方案4】:

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

    试试

     SetEnv session.use_cookies='0';
    

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

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

    【讨论】:

    • 没有考虑过 .htaccess - 但是,如果我是对的:1. 这将适用于每个用户和 2:如果获得许可,就没有办法允许 cookie?
    • 你是对的..我可以更新答案以包含可选权限
    • 有趣的方法...这是否会阻止设置第 3 方 cookie(即谷歌分析)?
    • 此方法只停止会话cookie,而不是其他cookie(包括3rd 方cookie)或javascript cookie(包括3rd 方javascript cookie)。
    • "此方法仅停止会话 cookie" - 此方法仅停止内置会话处理程序设置 cookie,它不会停止“会话 cookie”(或任何其他 cookie)。代码仍然可以调用 setcookie() 来设置 session cookie。另外,在.htaccess 中调用SetEnv 来设置一个名为session.use_cookies环境变量 与PHP 的session.use_cookies 配置选项无关。
    【解决方案5】:

    not paying attention to hoaxes怎么样?

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

    【讨论】:

    • 阻止设置 Google(或除您自己之外的任何其他人)的 cookie 不是您的责任。
    • 但这就是确切的一点——现在在欧盟就是这样,该法律将于今年 5 月 25 日开始执行。任何选择托管第 3 方 cookie 的网站都有责任向用户解释他们所做的事情,并为他们提供阻止这些 cookie 的选项。 Binning Analytics 等显然不是一个可行的选择,所以我正在寻找其他一些技术
    • 这是你的责任。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2012-05-21
    • 2011-02-22
    • 1970-01-01
    • 2011-09-06
    • 2019-07-20
    • 2016-12-12
    相关资源
    最近更新 更多