2015-05-18 77 views
3

上阻止cookie創建一個JavaScript我寫了這其中的JavaScript塊餅乾的創建所有的JavaScript頁面上(我有jQuery的頁面上太)其他:有選擇地通過其他JavaScript

jQuery(document).ready(function() { 
    Object.defineProperty(document, 'cookie', { 
    get: function() { 
     return ''; 
    }, 
    set: function (value) { 
    } 
    }); 
}); 

現在我需要更進一步。我需要選擇性地阻止cookies,如下所示:

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 ??? 
     }   
    } 
    }); 
}); 

是否可以調用「父」/「本機」函數?我試過用document.cookie,但瀏覽器啓動一個循環,再次調用我的函數(這是正確的)。

在此先感謝

瑪麗艾拉·

+0

您是否在安全方面嘗試使用它?重新定義Cookie getter/setter實際上並不安全,並且有'HttpOnly'標誌阻止從DOM訪問cookie。在OWASP上詳細瞭解[HttpOnly](https://www.owasp.org/index.php/HttpOnly)。 – raidendev

+1

此問題涉及新的歐盟關於cookie的隱私法。例如,我需要阻止谷歌分析腳本創建cookie(_ga,_gat等),直到用戶同意爲止。我同意你的看法,這是瘋狂的,但對立法者來說並不重要! – Mariella

回答

1

你不能這樣做,而你的getter/setter代理是有效的。

問題是document.cookie沒有使用JavaScript getter和setter,但是(可假設)是本機的,我們無法訪問。
你可以看到,通過調用Object.getOwnPropertyDescriptor

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

(我不能讓這樣的代碼片段,因爲片段無法訪問的cookie。)
在Chrome中:

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

在Firefox:

undefined 

而沒有掌握處理分配的功能,你有沒有辦法調用它。

不過,如果你delete document.cookie喬恩斯基特所說它自動地恢復恢復正常。

所以你可以做的是存儲任務的地方,在某些時候刪除您的代理(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測試。

+0

非常感謝您的代碼! – Mariella