编辑:在建议使用标题后,我问了一个类似的问题here。
我正在尝试开发一个Chrome扩展程序,用于分析网站设置/检索的Cookie,如果Cookie不符合某些要求,则会阻止设置/检索。
我想我必须覆盖cookie setter和getter。
我发现了类似的问题:
Cookie Law, Cookie setter & getter
Safely overriding document.cookie in Google Chrome extension
Defining a getter for document.cookie
Retrieving document.cookie getter and setter
阅读答案我不得不说我很困惑,我不再确定我想要做什么甚至可能。
尽管如此,特别提到问题#3,我尝试使用一个简单的测试扩展来覆盖cookie getter和setter,其函数不执行任何操作(因此在此扩展处于活动状态时不应设置cookie) 。这些是扩展程序的3个文件。
的manifest.json
{
"manifest_version": 2,
"name": "Test",
"description": "Test extension",
"version": "1.0",
"permissions": [
"<all_urls>",
"tabs",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
}
}
background.js
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
chrome.tabs.executeScript(null, {
file: "cookiescript.js"
});
}, {
urls: [
"<all_urls>"
]
}, ["blocking"]);
cookiescript.js
var old_cookie = document.cookie;
Object.defineProperty(document, 'cookie', {
get: function() {
console.log('Getting cookie...');
return '';
},
set: function(val) {
console.log('Setting cookie...');
}
});
document.cookie = old_cookie;
我通常在en.wikipedia.org上测试它,因为它在您访问它时会设置各种cookie。但是,通过上面的扩展,控制台日志中充满了获取cookie ... 与 Uncaught TypeError交替:无法重新定义属性:cookie ,当我检查存储的cookie时,我可以看到维基百科创建了它想要的所有cookie,无论我的扩展名如何。
错误似乎说清楚:你不能覆盖cookie setter和getter,但事实上其他问题(特别是#3)被回答说这样做,我不确定。
或者,我尝试使用此版本的cookiescript.js,它采用(已弃用) defineSetter 和 defineGetter
var old_cookie = document.cookie;
document.__defineSetter__('cookie', function() {
console.log('Setting cookie...');
});
document.__defineGetter__('cookie', function() {
console.log('Getting cookie...');
return ('');
});
document.cookie = old_cookie;
控制台日志导致设置cookie ... 和获取cookie ... 的交替,但再次,看着保存的cookie,看起来像Wikipedia成功设置所有的饼干。
是否有人能够指出我必须做些什么来成功地进行cookie设置/获取以便我可以阻止它,或者解释我想要做的事情是不可能的?
我的猜测是,实际上会出现覆盖/设置器的覆盖,但只有在网站设置/获取其cookie之后,但我不知道如何确保我的覆盖首先发生(我认为使用阻止 onBeforeRequest 会实现这一点,但我似乎错了),或者如果它根本不可能这样做。
编辑:我之前曾提到过列出cookie的不同扩展名如何无法检索它们,所以我认为我成功地覆盖了getter。我错了,这个扩展被破坏了,当它被修复时它显示了所有的cookie。
答案 0 :(得分:2)
我认为你在努力重新发明轮子。引用文档:
使用
chrome.cookies
API查询和修改Cookie,并在更改时收到通知。
我明白了,有时你想首先想要阻止它,让我们看看它,但你必须理解cookies是如何工作的。有两种cookie集操作:
由客户端,document.cookie
操纵。那么你的方法可能有所帮助,但为了确保截获cookie你不能依赖程序化注入,它确实太慢了。您需要使用正确的run_at
parameter:
"content_scripts" : [{
"matches" : ["<all_urls>"],
"js": ["cookiescript.js"],
"run_at": "document_start"
}]
这将确保您的代码在页面上的任何之前执行(在DOM中甚至存在任何内容之前)。
由服务器作为HTTP响应的一部分。它甚至可能是没有公开document.cookie
的HTTP-Only cookie。
您也可以拦截它,但是您需要使用webRequest
,特别是blocking response到onHeadersReceived
可以检查和修改设置Cookie的标头,以及阻止响应onBeforeSendHeaders
可以修改向服务器报告的Cookie。