簡體   English   中英

如何使用用戶腳本檢索 HttpOnly cookie?

[英]How can I retrieve an HttpOnly cookie with a userscript?

我碰巧經常訪問的公司網站使用觸發用戶/通行證對話的基本身份驗證。 我的密碼管理器 (LastPass) 無法填寫。 所以我想使用用戶腳本來注入一個登錄表單,該表單可由 LastPass 填寫。

為了在提交 function 上測試注入的表單,我在onsubmit Web 控制台中運行:

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 session cookie。 cookie 是在登錄錨點之前從主頁發送的,我可以從 Storage Inspector 中的 Firefox 中檢索它,或者通過開發者工具中的 Network 選項卡中檢查請求標頭來檢索它。 由於存儲檢查器將此 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與各種用戶腳本管理器一起使用,並從Response object 獲取responseHeaders ,但JSSESSIONID cookie 不存在。

我知道HttpOnly cookies 不會暴露給 JavaScript 以避免注入惡意腳本。 但是,對於由擴展程序(因此受瀏覽器信任)運行的用戶腳本來說不應該這樣,並且應該有一種方法可以在無需手動復制和粘貼的情況下填寫我的憑據。

如果你的后端注入了 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

是的,這是可能的,但僅在Tampermonkey Beta中使用GM_cookie - 請參閱問題。 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);
  });
})();

這會在urlToFetch中搜索名稱為cookieName的 cookie。 請注意, urlToFetch應該在@match / @include中,否則您會收到錯誤消息!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM