从 chrome 扩展中清除特定域的会话和本地存储

Clear session and local storage for specific domain from a chrome extension

是否可以从 chrome 扩展程序 中清除特定域的会话和本地存储?

假设我想将 sessionStoragelocalStorage 定位为 somedomain.com。我现在这样做的方式是:

function clearSessionSotorage(key) {
  /**
   * Clears the session storage value for the given key
   * @param string key The key whose value should be cleared, if not provided, all keys are cleared for the current domain
   */
   var code = key ? 'window.sessionStorage.clear(' + key + ')' : 'window.sessionStorage.clear()';
   chrome.tabs.executeScript(null, { code: code });
}

function clearLocalStorage(key) {
  /**
   * Clears the local storage value for the given key
   * @param string key The key whose value should be cleared, if not provided, all keys are cleared for the current domain
   */
  var code = key ? 'window.localStorage.clear(' + key + ')' : 'window.localStorage.clear()';
  chrome.tabs.executeScript(null, { code: code });
}

只要 活动选项卡 打开到 somedomain.com 上的页面,它就可以工作。

但是,我想定位到特定的域,而不需要在活动选项卡中打开该域。

如果可以的话,我该怎么做?

我考虑过在所有选项卡中循环寻找目标 url,这将是一个改进,但实际上,我更喜欢一个完全避免必须激活域的选项。

我认为唯一的方法是循环所有选项卡并查找目标 url,然后删除该域的 sessionStorage,或者如果需要,您可以为特定域插入内容脚本,这将清除sessionStorage逻辑。

当你说

I'd prefer an option that avoids having to have the domain active at all

你好像忘记了sessionStorage的生命周期,根据Window.sessionStoragesessionStorage会在tab/browser关闭时被清除,不会在标签之间共享。

Opening a page in a new tab or window will cause a new session to be initiated

如果您希望清除 sessionStorage/localStorage 当前在您的浏览器中打开但未激活的特定域 window,则您需要在该域的上下文中执行一些脚本。

我认为您可以通过 chrome.tabs.query()(link1) and then chrome.tabs.executeJavaScript()(link2) 的组合使用代码作为字符串或使用内容脚本文件的名称来做到这一点。

chrome.tabs.query({
  'url' : 'target-domain.com'
});

chrome.tabs.executeScript({
    code: 'sessionStorage.clear()'
  });

(or)

chrome.tabs.executeScript(null, {file: "content_script.js"});

对于 tabs.query() 中的 url 属性,您可以使用提到的模式 here;

正如已经指出的那样,有一种方法可以使用选项卡,您可以在其中打开一个选项卡并 运行 那里的代码。但是打开/关闭标签并不是一个很好的解决方案...

经过一些调查,我有一个使用 IFRAME 而不是选项卡的小而有效的解决方案。将此代码添加到您的 background.js:

// create a URL suffix to make it unique and make nearly impossible to hit the existing page
var suffix = 'chrome-run-on-domain-' + chrome.runtime.id;

// if the domain is blocking displaying pages in IFRAME, remove the restriction
chrome.webRequest.onHeadersReceived.addListener(function(details) {
  return {
    responseHeaders: details.responseHeaders.filter(function(e) {
      return e.name.toUpperCase() !== 'X-FRAME-OPTIONS';
    })
  };
}, { urls: [ '*://*/' + suffix ] }, ["blocking", "responseHeaders"]);

// finally the function which does the job: it adds an IFRAME to the background page
function injectScript(protocol, domain) {
  var iframe = document.createElement("iframe");

  iframe.src = protocol + '://' + domain + '/' + suffix;

  document.body.appendChild(iframe);
}

// run the code
injectScript('https', 'www.google.de');

这段代码已经完成了大部分工作。它会在您的背景页面上创建一个 iframe,安全地进入您想要的域。

然后您需要创建一个文件,其中包含您要在页面上运行所做的更改:

// actually any action to do with a session/localStorage
sessionStorage.clear();
localStorage.clear();

// important, stops the page loading
// this prevents unnecessary images / css / js calls on that page
// and prevents js redirects
window.stop();

现在是时候在清单文件中设置引用和权限了:

"background": {
  "scripts": [
    "background.js"
  ]
},
"content_scripts": [{
  "all_frames": true,
  "js": ["injectable.js"],
  "matches": ["*://*/chrome-run-on-domain-*"],
  "run_at": "document_start"
}],
"permissions": [
  "<all_urls>",
  "webRequest",
  "webRequestBlocking"
]

你到底有什么:你可以清除 localStorage,而且不仅如此。你不会为此打开新标签,所以它进行得很顺利。还是有缺点(tabs的解决方案还是会存在同样的问题):

  1. 没有服务器端重定向(301 / 302 / 等)保护。如果服务器将以重定向响应,则无法真正拦截。
  2. 仍有服务器调用。我试图取消请求(如果可行,则没有任何缺点)但不幸的是 chrome 不允许将脚本注入已取消的请求。 window.stop() 在这里有所帮助,但仍然...

使用您的初始方法效果更好:您只需首先检查您的选项卡是否有来自您的域的页面,如果有,则 none 使用上述方法。

如果您的 localStorage 来自 iFrame,您可以通过在控制台上擦此代码来清除它。

$('.my_iframe')[0].contentWindow.localStorage.clear();