Chrome Manifest v3为内容脚本创建cookie

9rygscc1  于 2023-04-27  发布在  Go
关注(0)|答案(1)|浏览(172)

我有点为难,希望有人能有个主意。
我是“新标签页开始页”的作者,我将扩展从v2移植到v3的唯一剩余问题是后台和内容脚本之间的通信。
该功能涉及使用Object.defineProperty通过javascript注入更改内容脚本中的用户代理,但是时间是至关重要的,因此任何从后台使用chrome. tables.sendMessage的内容都是不可能的,因为它无法及时让内容脚本接收,即使它在document_start运行。
例如,当使用sendMessage完成时,它会在webbrowsertools.com/useragent/上的[aggressive] navigator.userAgent测试失败。
因此,我在v2中设计了一个方法,它设置了一个cookie,内容脚本可以读取:

chrome.webRequest.onHeadersReceived.addListener(function(details)
{
    details.responseHeaders.push({name:"Set-Cookie", value:"ESC-AGN75="+encodeURIComponent(agent)+"; Path=/; Max-Age=10"});
    return {responseHeaders:details.responseHeaders};
}, {urls:["<all_urls>"], types:["main_frame"]}, OHROption);

内容脚本抓取它,等等:

var regex = /ESC-AGN75=(.[^;]*)/ig;
var match = regex.exec(document.cookie);
if (match) do_something(decodeURIComponent(match[1]));
document.cookie = "ESC-AGN75=; Path=/; Max-Age=0";

现在v3有一个问题,因为它不再支持webRequest,所以我将其更改为declarativeNetRequest,但不幸的是,尽管它可以工作,但它在某些网站上创建了奇怪的行为,我怀疑csrf令牌有问题:

const addrules =
{
    addRules:
    [
        { id:5, priority:5, condition: { resourceTypes:["main_frame"] }, action: { type:"modifyHeaders", responseHeaders: [{ header:"Set-Cookie", operation:"set", value:"ESC-AGN75="+encodeURIComponent(agent)+"; Path=/; Max-Age=10" }] } }
    ]
};
chrome.declarativeNetRequest.updateSessionRules(addrules);

我不知道我该如何纠正这个问题,也许我错过了一些简单的东西?
更新:奇怪的行为意味着它干扰了网站功能。例如,在https://login.sophos.com上登录时,当启用此cookie时,POST提交收到400响应而不是200响应。当在同一网站上如上所述使用webRequest时,不会发生同样的问题。
失败的xhr请求来自 AJAX .ts:157
更新:在我清除我的cookie后,我不再得到400,但它只是重新加载页面,并再次要求电子邮件地址&再次,非常有趣。
以这种方式简化cookie:header:“Set-Cookie”,operation:“set”,value:“XXX”results in no change,- still breaks.
更新:这也影响了Gmail的登录功能,我从浏览器收到了太多的重定向错误信息。就那一个cookie!:)

thigvfpy

thigvfpy1#

我可能已经找到了一个解决这个问题的方法,可能会帮助一些人(从背景):

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab)
{
    var domain = (new URL(tab.url));
    chrome.cookies.set({ "name":"ESC-AGN75", "url":domain.origin, "value":encodeURIComponent(agent) });
});

这消除了设置cookie的declarativeNetRequest的需要,它还修复了我提到的所有其他问题,并且内容页面立即具有所需的信息,没有任何延迟。
现在唯一的问题仍然是如何修改由网页创建的服务工作者发送的用户代理请求头,但话又说回来,这是不可能通过webrequest的,就我所知...
问题描述如下:https://github.com/tarampampam/random-user-agent/issues/203

相关问题