1

我想在我的Chrome扩展中重写document.cookie,并且在获取原始document.cookie功能的同时也遇到了很多麻烦。目前,我有这样的:在Google Chrome扩展中安全地覆盖document.cookie

var _cookie = document.cookie; 
document.__defineSetter__("cookie", function(the_cookie) {_cookie=the_cookie;}); 
document.__defineGetter__("cookie", function() {return _cookie;}); 

我从内容脚本中使用的技术从here注入JS。

我看到的行为是我重新定义的setter和getter被调用,但原始函数不再有效。例如,我可以使用开发工具检查_cookie和document.cookie,看看它们是否具有相同的期望值,但Chrome的cookie存储中没有出现任何cookie。

任何人都可以告诉我我是如何打破原来的document.cookie功能?是document.cookie是一个属性的问题,所以我实际上并没有得到一个指向原始setter的指针?

回答

1

您重新定义了一部开拓创新的cookie getter和setter函数,并且有可能是你可能已经忘记了原来的功能的重要组成部分,或实施新功能

+0

我理解,但我的希望是,分配不变的document.cookie一个变量,并且然后在我的覆盖中引用它会调用原始设置器。你能解释一下这个假设的错误吗?或者我可以如何访问未改变的setter? – bryophyte 2012-04-13 14:54:09

+0

允许我进一步理解,为什么要首先覆盖get/set方法? – 2012-04-13 14:55:44

+0

我正在编写一个扩展,重命名cookie以防止跨域cookie跟踪。基本上,它拦截传输中的cookie头并决定是否发送它们。使用Chrome扩展webrequest API可以轻松处理HTTP Cookie,但是我没有收到针对JS cookie的传入“Set-Cookie”标头。我的解决方案(可能很疯狂)是重写document.cookie方法,以便在调用setter时调用并重命名cookie。 – bryophyte 2012-04-13 15:41:52

2

var _cookie = document.cookie;不保存原始吸气机会并为cookie设置,它只是调用getter并保存结果。

pageoriginal link,现在破)具有如何保存cookie的setter和getter一个例子:

var cookie_setter = document.__lookupSetter__ ('cookie'); 
var cookie_getter = document.__lookupGetter__ ('cookie'); 
+0

谢谢你指出。我已经尝试了这种方法,不幸的是它在Chrome中无法使用。它总是返回undefined。 我最终做的是通过我自己在隐藏的div中存储cookie字符串来重新实现getter和setter。这是一团糟,但它的工作原理。你可以看到最终结果[这里](https://github.com/rjwalls/CookieMonster/blob/master/contentscript.js) – bryophyte 2012-05-16 16:05:18

+0

断开的链接,该文件发生了什么github回购? – 2015-05-21 05:57:07

+0

@StefanWallin我已经添加了一个指向原始URL的wayback机器捕获的链接。 – rjmunro 2015-05-21 14:59:14