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