【问题标题】:A javascript to selectively block cookie creation by other javascript on page用于选择性阻止页面上其他 javascript 创建 cookie 的 javascript
【发布时间】:2015-05-18 07:29:08
【问题描述】:

我编写了这个 javascript,它阻止页面上所有其他 javascript 创建 cookie(我在页面上也有 jquery):

jQuery(document).ready(function () {
  Object.defineProperty(document, 'cookie', {
    get: function () {
        return '';
    },
    set: function (value) {
    }
  });
});

现在我需要更进一步。我需要选择性地阻止 cookie,如下所示:

jQuery(document).ready(function () {
  Object.defineProperty(document, 'cookie', {
    get: function () {
        if (value == ...) {
          //call to "parent" function here  
        } else {
          return '';
        }
    },
    set: function (value) {
        if (value == ...) {
          //call to "parent" function here
          //document.cookie ???
        }         
    }
  });
});

是否可以调用“parent”/“native”函数?我尝试使用 document.cookie,但浏览器开始循环,再次调用我的函数(这是正确的)。

提前致谢

玛丽埃拉

【问题讨论】:

  • 您是否出于安全原因尝试?重新定义 cookie getter/setter 实际上根本不安全,并且有 HttpOnly 标志来阻止从 DOM 访问 cookie。在 OWASP 阅读有关 HttpOnly 的更多信息。
  • 此问题与关于 Cookie 的新欧盟隐私法有关。例如,在用户同意之前,我需要阻止谷歌分析脚本创建 cookie(_ga、_gat 等)。我同意你的观点,这很疯狂,但对立法者来说并不重要!

标签: javascript cookies httpcookie


【解决方案1】:

当你的 getter/setter 代理处于活动状态时,你不能这样做。

问题是document.cookie 不使用 JavaScript 的 getter 和 setter,而是(大概)原生的,我们无法访问。
你可以通过调用Object.getOwnPropertyDescriptor看到:

JSON.stringify(Object.getOwnPropertyDescriptor(document, 'cookie'));

(我无法将其设为 sn-p,因为 sn-ps 无法访问 cookie。)
在 Chrome 中:

{
    "value": "...",
    "writable": true,
    "enumerable": true,
    "configurable": true
}

在 Firefox 中:

undefined

如果不获取处理分配的函数,您将无法调用它。

但是,如果你 delete document.cookieJon Skeet 会这样做 它会自动恢复 恢复正常。

所以你可以做的是将分配存储在某个地方,在某个时候删除你的代理(最终是window.onunload)并将所有内容重新分配给document.cookie,比如

function getCookies()
{
    var cookies = {};
    var list = document.cookie.split(';');
    for(var i = 0; i < list.length; i++)
    {
        var split = list[i].split('=');
        cookies[split[0].trim()] = split[1];
    }
    return cookies;
}

function hijackCookies()
{
    var cookies = getCookies();
    Object.defineProperty(document, 'cookie',
    {
        configurable: true,
        enumerable: true,
        get: function()
        {
            var list = [];
            for(var key in cookies)
            {
                list.push(key + '=' + cookies[key]);
            }
            return list.join('; ');
        },
        set: function(value)
        {
            var split = value.split('=');
            var key = split[0].trim();
            if(/* YOUR FILTER HERE */)
            {
                return;
            }
            cookies[key] = split[1];
        }
    });
    return function()
    {
        delete document.cookie;
        for(var key in cookies)
        {
            document.cookie = key + '=' + cookies[key];
        }
    };
}

var detach = hijackCookies();

// Do something with cookies or let 3rd party code run
// ...

detach();

[Fiddle](注意:重新加载整个页面和点击“运行”是相同的!)

在 Firefox 38.0.1 和 Chrome 42.0.2311.152 中测试。

【讨论】:

  • 呵呵,用它来使一个网站符合 GDPR,delete document.cookie 工作,但现在几个月后,它不再将本机 getter/setter 重置为正常。
  • @Starwave 什么浏览器和版本?
  • 糟糕,我犯了一个错误,现在正在仔细检查,这仍然有效,抱歉误报! :)
猜你喜欢
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
相关资源
最近更新 更多