问题描述
我碰巧经常访问的公司网站使用触发用户/密码对话的基本身份验证。我的密码管理器 (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 以避免注入恶意脚本。但是,对于由扩展程序运行(因此受浏览器信任)的用户脚本来说不应该如此,并且应该有一种无需手动复制和粘贴即可填写我的凭据的方法。
解决方法
如果 yow 后端注入了 cookie,您只需在 yow 请求中设置 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
,是的,这是可能的,但仅在 Tampermonkey Beta 中使用 GM_cookie
- 请参阅 this 问题。 Violentmonkey 和 Greasemonkey 不支持任何类似的内容。
在你的情况下,它应该是这样的:
// ==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
中搜索名称为 urlToFetch
的 cookie。请注意,urlToFetch
应该在 @match
/@include
中,否则会出错!