javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JavaScript浏览器Cookie拦截与修改

JavaScript实现浏览器Cookie拦截与修改的操作方法

作者:星哲最开心

在浏览器中拦截和修改 Cookie 的设置或修改位置,通常可以通过以下方法实现,具体场景取决于你是想在前端 JavaScript 中操作,还是在底层网络请求中拦截,本文小编给大家介绍了浏览器Cookie拦截与修改方法,需要的朋友可以参考下

一、前端 JavaScript 层拦截(修改 document.cookie)

浏览器通过 document.cookie API 读写 Cookie,可通过重写其 getter 和 setter 实现拦截:

// 保存原始的 cookie 操作
const originalCookie = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie').get;

// 重写 cookie 的 setter 和 getter
Object.defineProperty(document, 'cookie', {
  get() {
    const value = originalCookie.call(document);
    console.log('读取 Cookie:', value);
    return value;
  },
  set(newValue) {
    console.log('修改 Cookie:', newValue);
    // 在此处拦截或修改 Cookie 值
    // 例如:阻止特定 Cookie 写入
    if (newValue.includes('block_this_cookie')) {
      return;
    }
    originalCookie.call(document, newValue);
    return true;
  },
});

二、拦截网络请求中的 Cookie(如 Set-Cookie 头)

若需拦截 HTTP 请求/响应中的 Cookie(如 Set-Cookie 头),可 Hook 网络请求:

1. 拦截 XMLHttpRequest 和 fetch

// 拦截 XMLHttpRequest
const originalXHROpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function (method, url) {
  this.addEventListener('readystatechange', function () {
    if (this.readyState === 4) {
      const cookies = this.getResponseHeader('Set-Cookie');
      if (cookies) {
        console.log('拦截到 Set-Cookie:', cookies);
      }
    }
  });
  originalXHROpen.apply(this, arguments);
};

// 拦截 fetch
const originalFetch = window.fetch;
window.fetch = async function (...args) {
  const response = await originalFetch.apply(this, args);
  const cookies = response.headers.get('Set-Cookie');
  if (cookies) {
    console.log('拦截到 Set-Cookie:', cookies);
  }
  return response;
};

2. 使用 Service Worker(更底层拦截)

通过 Service Worker 拦截所有网络请求:

// 注册 Service Worker
navigator.serviceWorker.register('sw.js').then(() => {
  console.log('Service Worker 注册成功');
});

// sw.js 文件内容
self.addEventListener('fetch', (event) => {
  event.respondWith(
    (async () => {
      const response = await fetch(event.request);
      const cookies = response.headers.get('Set-Cookie');
      if (cookies) {
        console.log('拦截到 Set-Cookie:', cookies);
        // 修改后返回新响应
        const newHeaders = new Headers(response.headers);
        newHeaders.set('Set-Cookie', 'modified_cookie=value');
        return new Response(response.body, { headers: newHeaders });
      }
      return response;
    })()
  );
});

三、浏览器扩展(Chrome Extension)

通过浏览器扩展的 webRequest API 修改请求头:

// manifest.json 中声明权限
{
  "permissions": ["webRequest", "webRequestBlocking", "http://*/*", "https://*/*"]
}

// background.js 中监听请求
chrome.webRequest.onHeadersReceived.addListener(
  (details) => {
    const headers = details.responseHeaders;
    for (const header of headers) {
      if (header.name.toLowerCase() === 'set-cookie') {
        header.value = header.value.replace('original=', 'modified=');
      }
    }
    return { responseHeaders: headers };
  },
  { urls: ["<all_urls>"] },
  ["blocking", "responseHeaders"]
);

四、代理工具拦截(如 Charles/Fiddler)

使用代理工具直接修改请求/响应中的 Cookie:

注意事项

根据具体需求选择合适的方法。如果是用于调试或分析,推荐使用浏览器开发者工具的 Network 面板直接查看 Cookie 变化。

以上就是JavaScript实现浏览器Cookie拦截与修改的操作方法的详细内容,更多关于JavaScript浏览器Cookie拦截与修改的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文