Javascript,Chrome扩展程序:覆盖Cookie getter和setter

时间:2016-02-11 20:56:02

标签: javascript cookies google-chrome-extension getter-setter

编辑:在建议使用标题后,我问了一个类似的问题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。

1 个答案:

答案 0 :(得分:2)

我认为你在努力重新发明轮子。引用文档:

  

使用chrome.cookies API查询和修改Cookie,并在更改时收到通知

我明白了,有时你想首先想要阻止它,让我们看看它,但你必须理解cookies是如何工作的。有两种cookie集操作:

  1. 由客户端,document.cookie操纵。那么你的方法可能有所帮助,但为了确保截获cookie你不能依赖程序化注入,它确实太慢了。您需要使用正确的run_at parameter

    在清单中声明它
    "content_scripts" : [{
      "matches" : ["<all_urls>"],
      "js": ["cookiescript.js"],
      "run_at": "document_start"
    }]
    

    这将确保您的代码在页面上的任何之前执行(在DOM中甚至存在任何内容之前)。

  2. 由服务器作为HTTP响应的一部分。它甚至可能是没有公开document.cookie的HTTP-Only cookie。

    您也可以拦截它,但是您需要使用webRequest,特别是blocking responseonHeadersReceived可以检查和修改设置Cookie的标头,以及阻止响应onBeforeSendHeaders可以修改向服务器报告的Cookie。