我经常访问的一个公司网站使用基本身份验证来触发用户/密码对话。我的密码管理器(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,以避免注入恶意脚本。但是,对于由扩展运行的用户脚本(因此受到浏览器信任)来说,情况不应该如此,并且应该有一种方法可以填充我的凭据,而无需手动复制和粘贴。
是的,这是可能的,但只能在Tampermonkey Beta中使用
GM_cookie
(请参阅:带有类型和示例的文档)。 Violentmonkey 和 Greasemonkey 不支持类似的东西。
你应该使用
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()
。
如果您的后端注入了 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