【问题标题】:Enabling / Disabling All Cookies Upon User Consent for GDPR在用户同意 GDPR 后启用/禁用所有 Cookie
【发布时间】:2018-10-17 10:27:52
【问题描述】:

这个问题与 GDPR 合规性有关,但我会更关注手头的技术问题:

我为 Cookie 同意横幅找到了一些很棒的开源资源,例如 Cookie 同意和 Cookie 脚本。横幅的实现看起来很简单。但问题是它们需要默认禁用 cookie,我不确定如何在域的全局级别上执行此操作。

我不太了解 JavaScript,但我想知道的是:是否有一种使用 Javascript 的方法可以普遍允许或拒绝域上的 cookie? 或者,这种方法是唯一的吗?每个有问题的脚本?例如,谷歌分析有关于禁用 cookie 的文档。我如何将它与 Facebook、Youtube 和所有其他使用 cookie 的脚本混为一谈,并且仅在用户同意后才允许使用 cookie?或者,我是否必须为每个单独的脚本解决它?

换句话说,JavaScript 中是否有一种方法可以根据用户偏好普遍关闭/打开 cookie?就我目前的研究来看,似乎没有。

【问题讨论】:

    标签: javascript cookies


    【解决方案1】:

    我在 document.cookie 变量上创建了一个代理脚本。 将此脚本作为文档中的第一个脚本运行。

    注意

    此解决方案假设:

    • Cookie 是通过 javascript 设置的(服务器端使用会话)。
    • 它也仅适用于支持使用 javascript 代理的浏览器。
    • 仅适用于本地域(仅阻止设置外部域 cookie)

    代理脚本

    设置 cookie

    它拦截document.cookie 变量的作用是因为window.disableCookies 在下面的脚本中设置为true。它将 cookie 存储在 window.cookieList 数组中,直到执行 enableCookies 脚本。如果enableCookies被执行,它将禁用代理并遍历window.cookieList变量,以在浏览器中设置cookie。

    读取 cookie

    如果脚本设置了 cookie,则它需要 document.cookie 变量中的 cookie。所以在调用enableCookies 函数之前(并且window.disableCookies 设置为false),它会伪造document.cookie 响应,它会根据window.cookieList 变量构建它。

    var cookie_setter_orig = document.__lookupSetter__("cookie").bind(document);
    var cookie_getter_orig = document.__lookupGetter__("cookie").bind(document);
    window.cookieList = [];
    window.disableCookies = true;
    
    Object.defineProperty(document, "cookie", {
      get: function () {
        if(!window.disableCookies) {
          return cookie_getter_orig();
        } else {
          var response = "";
          window.cookieList.forEach(function(cookie){
            var splitted = cookie.split(";")[0].split("=");
            response += splitted[0] + "=" + splitted[1] + "; ";
          });
          return response.slice(0, response.length - 2);
        }
      },
      set: function (val) {
        if(!window.disableCookies) {
          cookie_setter_orig(val);
        } else {
          window.cookieList.push(val);
        }
      }
    });
    
    function enableCookies()
    {
      window.disableCookies = false;
      window.cookieList.forEach(function(cookie){
        document.cookie = cookie;
      });
      window.cookieList =[];
    }
    

    测试一下

    要测试它,您可以执行以下脚本:

    /* These cookies are not set; they are set on the window.cookieList, until enableCookies is activated */
    document.cookie = 'cookie1=test; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/';
    document.cookie = 'cookie2=test; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/';
    document.cookie = 'cookie3=test; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/';
    
    /* This is a fake cookie list from the window.cookieList variable
     * Output: cookie1=test; cookie2=test; cookie3=test 
     */
    console.log(document.cookie);
    
    setTimeout(function(){
      enableCookies(); /* Enable cookies and pass them to the browser */
    
      /* The cookie below is passed to the browser directly, since cookies are enabled */
      document.cookie = 'cookie4=test; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/';
    
      /* This is the real cookie list
       * Output: cookie1=test; cookie2=test; cookie3=test; cookie4=test
       */
      console.log(document.cookie);
    }, 2500);
    

    【讨论】:

    • 不错的实现
    【解决方案2】:

    是否有一种使用 Javascript 的方法来普遍允许或拒绝域上的 cookie?

    没有。

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 2021-03-15
      • 1970-01-01
      • 2018-11-17
      • 2020-05-08
      • 2021-03-18
      • 1970-01-01
      • 2016-09-17
      • 2018-05-28
      相关资源
      最近更新 更多