如何使用用户脚本检索 HttpOnly cookie?

问题描述

我碰巧经常访问的公司网站使用触发用户/密码对话的基本身份验证。我的密码管理器 (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();

USERNAMEPASSWORD 将从填写的表单中检索。

一切都按预期工作,只是我必须检索 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 问题。 ViolentmonkeyGreasemonkey 不支持任何类似的内容。

在你的情况下,它应该是这样的:

// ==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 中,否则会出错!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...