请教下hook cookie遇到的一个问题
我在调加速乐的时候hook cookie,加速乐需要发送两次请求,第一次请求返回一个js文件用于计算出一个cookie来;然后第二次请求的时候会带上第一次计算出来的cookie,并会返回一个新的js文件用于计算第二个cookie。问题就出在第二次请求上,使用hook脚本之后会导致第二次请求的啥时候带不上第一次计算出来的cookie,就会导致服务器一直返回的是第一次请求的那个js文件。
我写的hook脚本贴在下面了,请教下佬们有什么好的意见吗,或者对于这种需要多次请求计算cookie的网站有什么好的处理办法吗?
(function () {
var cookie_cache = document.cookie;
Object.defineProperty(document, 'cookie', {
set: function (val) {
if (val.indexOf('jsl') != -1) {
debugger;
}
console.log("hook cookie =>", val)
var cookie = val.split(";");
var ncookie = cookie.split("=");
var flag = false;
var cache = cookie_cache.split("; ");
cache = cache.map(function (a) {
if (a.split("=") === ncookie) {
flag = true;
return cookie;
}
return a;
})
cookie_cache = cache.join("; ");
if (!flag) {
cookie_cache += cookie + "; ";
}
return cookie_cache;
},
get: function () {
return cookie_cache;
},
});
})(); 本帖最后由 FitContent 于 2024-11-10 23:59 编辑
可能是在 `Set Cookie` 时对设置的值进行了操作。最好不要修改网站设置的 cookie 值(除非清楚知道自己在干什么)
```js
(function () {
var cookie_cache = document.cookie;
Object.defineProperty(document, 'cookie', {
// set 操作时不需要修改 val 的值
// 也不需要修改 cookie_cache
set: function (val) {
// 在这个函数里面进行条件断点等等
// 也可以和 cookie_cache 对比知道修改了哪些地方
process(val);
cookie_cache = val;
return val;
},
get: function () {
return cookie_cache;
},
});
/** 在这里操作 cookie */
function process(cookie) {
}
})();
```
立即更新 cookie_cache: 可以在设置 cookie 的时候立刻更新 document.cookie,而不仅是缓存到 cookie_cache 中。你可以通过直接调用 document.cookie = cookie_cache 来确保页面上能够读取到最新的 cookie 值。
使用 Set-Cookie 头:如果服务端是通过 Set-Cookie 头来返回新 cookie,那么你可以在 hook 中直接模拟该头的效果,将新的 cookie 添加到 cookie_cache。
确保 cookie 的同步:可以在 set 中调用原生的 document.cookie 方法来保证 cookie 是在页面中的最新值。你的代码中仅在 console.log 后缓存到 cookie_cache,可能需要再调用一次 document.cookie = cookie_cache。
增加对 Cookie 的直接读取:在 get 方法中可以尝试获取当前 document.cookie 值,并与 cookie_cache 合并,以确保读取到的 cookie 是最新的。
基于你的代码,我做出以下修改:
(function () {
var cookie_cache = document.cookie;
Object.defineProperty(document, 'cookie', {
set: function (val) {
if (val.indexOf('jsl') != -1) {
debugger;
}
console.log("hook cookie =>", val)
var cookie = val.split(";");
var ncookie = cookie.split("=");
var flag = false;
var cache = cookie_cache.split("; ");
cache = cache.map(function (a) {
if (a.split("=") === ncookie) {
flag = true;
return cookie;
}
return a;
});
if (!flag) {
cache.push(cookie);
}
cookie_cache = cache.join("; ");
// 将cookie_cache立即同步到document.cookie
document.__defineSetter__('cookie', function() {
return cookie_cache;
});
return cookie_cache;
},
get: function () {
return cookie_cache;
},
});
})(); 学习了学习了
页:
[1]