如何使用用户脚本访问并可能修改 cookie?

问题描述 投票:0回答:2

我经常访问的一个公司网站使用基本身份验证来触发用户/密码对话。我的密码管理器(LastPass)无法填充它。所以我想使用用户脚本来注入登录表单,该表单可由 LastPass 填写。

为了测试注入的表单

onsubmit
功能,我在 Firefox Web Console 中运行:

var request = new XMLHttpRequest();
request.open("GET", "https://someweb.com/login.do", false);
request.setRequestHeader("Authorization", "Basic " + btoa(USERNAME + ":" + PASSWORD));
request.setRequestHeader("User-Agent", navigator.userAgent);
request.setRequestHeader("Cookie", "JSESSIONID=*****");
request.send();

USERNAME
PASSWORD
将从填写的表格中检索。

一切都按预期工作,除了我必须检索

JSESSIONID
会话 cookie。 cookie 是在登录锚点之前从主主页发送的,我可以在 Firefox 中从存储检查器中检索它,或者通过检查开发人员工具中网络选项卡中的请求标头来检索它。由于存储检查器将此 cookie 标记为
HttpOnly
,因此我无法使用
document.cookie
检索它。

小事

curl -I 'https://someweb.com/home.do'     

输出

JSESSIONID
cookie,所以我尝试获取释放 cookie 的主页:

var request = new XMLHttpRequest();
request.open("GET", "https://someweb.com/login.do/home.do", false);
request.send();
request.getAllResponseHeaders();

但是cookie仍然没有显示。

我尝试将

GM_xmlHttpRequest
与各种用户脚本管理器一起使用,并从
responseHeaders
对象获取
Response
,但
JSSESSIONID
cookie 不存在。

我知道

HttpOnly
cookie 不会暴露给 JavaScript,以避免注入恶意脚本。但是,对于由扩展运行的用户脚本(因此受到浏览器信任)来说,情况不应该如此,并且应该有一种方法可以填充我的凭据,而无需手动复制和粘贴。

javascript cookies userscripts
2个回答
2
投票

是的,这是可能的,但只能在Tampermonkey Beta中使用

GM_cookie
(请参阅:带有类型和示例的文档)。 ViolentmonkeyGreasemonkey 不支持类似的东西。

你应该使用

GM_cookie.list(details, callback)
:

// ==UserScript==
// @name        Stack Overflow Question 65749907
// @version     0.1
// @include     https://someweb.com/login.do
// @run-at      document-end
// @grant       GM_cookie
// ==/UserScript==

(function() {
    'use strict';

    const cookieName = 'JSESSIONID';
    const urlToFetch = 'https://someweb.com/login.do'

    GM_cookie.list(
        { url: urlToFetch, name: cookieName },
        (cookie, error) => {
            if (!error) console.log(cookie[0]);
            else console.error(error);
        }
    );
})();

这会在

cookieName
中搜索 cookie 名称
urlToFetch
。您只能访问允许脚本运行的 URL 上的 cookie - 否则,您将收到错误消息。

要设置或删除 cookie,您应该分别使用

GM_cookie.set()
GM_cookie.delete()


0
投票

如果您的后端注入了 cookie,您所需要做的就是根据您的请求设置

withCredentials: true
:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/', true);
xhr.withCredentials = true;
xhr.send(null);

https://developer.mozilla.org/en/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials

© www.soinside.com 2019 - 2024. All rights reserved.