gpt4 book ai didi

javascript - 有选择地阻止页面上其他 javascript 创建 cookie 的 javascript

转载 作者:行者123 更新时间:2023-11-29 15:35:01 25 4
gpt4 key购买 nike

我写了这个 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,但浏览器开始循环,再次调用我的函数(这是正确的)。

提前致谢

玛丽拉

最佳答案

当您的 getter/setter 代理处于事件状态时,您不能这样做。

问题是 document.cookie 不使用 JavaScript getters 和 setters,而是(大概)使用我们无法访问的 native 方法。
您可以通过调用 Object.getOwnPropertyDescriptor 来查看:

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

(我无法将其设为片段,因为片段无法访问 cookie。)
在 Chrome 中:

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

在 Firefox 中:

undefined

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

但是,如果您删除 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 中测试。

关于javascript - 有选择地阻止页面上其他 javascript 创建 cookie 的 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30297363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com