我在 document.cookie 变量上创建了一个代理脚本。
将此脚本作为文档中的第一个脚本运行。
注意
此解决方案假设:
- Cookie 是通过 javascript 设置的(服务器端使用会话)。
- 它也仅适用于支持使用 javascript 代理的浏览器。
- 仅适用于本地域(仅阻止设置外部域 cookie)
代理脚本
设置 cookie
它拦截document.cookie 变量的作用是因为window.disableCookies 在下面的脚本中设置为true。它将 cookie 存储在 window.cookieList 数组中,直到执行 enableCookies 脚本。如果enableCookies被执行,它将禁用代理并遍历window.cookieList变量,以在浏览器中设置cookie。
读取 cookie
如果脚本设置了 cookie,则它需要 document.cookie 变量中的 cookie。所以在调用enableCookies 函数之前(并且window.disableCookies 设置为false),它会伪造document.cookie 响应,它会根据window.cookieList 变量构建它。
var cookie_setter_orig = document.__lookupSetter__("cookie").bind(document);
var cookie_getter_orig = document.__lookupGetter__("cookie").bind(document);
window.cookieList = [];
window.disableCookies = true;
Object.defineProperty(document, "cookie", {
get: function () {
if(!window.disableCookies) {
return cookie_getter_orig();
} else {
var response = "";
window.cookieList.forEach(function(cookie){
var splitted = cookie.split(";")[0].split("=");
response += splitted[0] + "=" + splitted[1] + "; ";
});
return response.slice(0, response.length - 2);
}
},
set: function (val) {
if(!window.disableCookies) {
cookie_setter_orig(val);
} else {
window.cookieList.push(val);
}
}
});
function enableCookies()
{
window.disableCookies = false;
window.cookieList.forEach(function(cookie){
document.cookie = cookie;
});
window.cookieList =[];
}
测试一下
要测试它,您可以执行以下脚本:
/* These cookies are not set; they are set on the window.cookieList, until enableCookies is activated */
document.cookie = 'cookie1=test; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/';
document.cookie = 'cookie2=test; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/';
document.cookie = 'cookie3=test; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/';
/* This is a fake cookie list from the window.cookieList variable
* Output: cookie1=test; cookie2=test; cookie3=test
*/
console.log(document.cookie);
setTimeout(function(){
enableCookies(); /* Enable cookies and pass them to the browser */
/* The cookie below is passed to the browser directly, since cookies are enabled */
document.cookie = 'cookie4=test; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/';
/* This is the real cookie list
* Output: cookie1=test; cookie2=test; cookie3=test; cookie4=test
*/
console.log(document.cookie);
}, 2500);