一个javascript,可以选择性地阻止页面上其他javascript创建cookie

时间:2015-05-18 07:29:09

标签: javascript cookies httpcookie

我已经写了这个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 ???
        }         
    }
  });
});

是否可以致电"父母" /"本地"功能?我尝试过使用document.cookie,但浏览器启动循环,再次调用我的函数(这是正确的)。

提前致谢

玛丽艾拉·

1 个答案:

答案 0 :(得分:1)

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

问题是document.cookie不使用JavaScript getter和setter,但是(可能是)本机的,我们无法访问。
您可以通过调用Object.getOwnPropertyDescriptor

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

(我无法将其作为摘录,因为代码段无法访问Cookie。)
在Chrome中:

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

在Firefox中:

undefined

如果没有掌握处理赋值的函数,你就无法调用它。

但是,如果您delete document.cookie Jon 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中进行了测试。