重定向到firefox中的扩展资源

时间:2016-03-17 14:18:44

标签: javascript firefox-addon xss

出于开发目的,我正在尝试构建一个扩展,将与正则表达式匹配的所有请求重定向到特定页面。问题是firefox API似乎没有做chrome.webRequest.onBeforeSendHeaders.addListener文档中宣传的内容。以下是扩展程序的简化版本:

manifest.js

{
    "applications": {
      "gecko": {
        "id": "addon@example.com",
          "strict_min_version": "42.0",
          "strict_max_version": "50.*",
          "update_url": "https://example.com/updates.json"
      }
    },

    "name": "Developer",
    "version": "0.1.26",
    "manifest_version": 2,
    "description": "A script useful for development.",
    "icons": {"16": "logo16.png",
              "48": "logo48.png",
              "128": "logo128.png"},
    "background": {
    "scripts": ["background.js"]
    },
    "web_accessible_resources": ["hello.html"],
    "permissions": [
        "activeTab",
        "webRequest",
        "webRequestBlocking"
    ]
}

background.js

// I found somewhere that onBeforeSendHeader it should work but it doesn't.
chrome.webRequest.onBeforeRequest.addListener(
  function(details) {
    var redirect;
    if (details.url.match(/example\.com/)) {
      redirect = chrome.extension.getURL("hello.html");
      console.log("Redirecting:", details.url, "->", redirect);
      return {redirectUrl: redirect};
      }
    console.log("Requesting:",details.url);
  }, {urls: [
    "<all_urls>"
  ]}, ["blocking"]);

hello.html的

<html>
    <head>It works</head>
    <body>And it's not apache!</body>
</html>

简而言之,它会将从example.com获取的所有内容重定向到扩展资源hello.html

所以我转到about:config并将security.fileuri.strict_origin_policy设置为false。然后我转到about:debugging并加载扩展程序。然后我打开浏览器控制台Tools -> Web Developer -> Browser Console。最后我去了example.com。我应该得到hello.html的内容,但我什么都没得到(白屏),在浏览器控制台中我得到了:

Redirecting: "http://example.com/" -> "moz-extension://ce33a9b5-2c20-ed41-b8aa-f52143783c38/hello.html"
Security Error: Content at http://example.com/ may not load or link to file:///path/to/extension/hello.html.

我需要扩展用于个人开发目的,因此我不介意更改about:config

编辑:如果我将重定向网址更改为网络上的内容,onBeforeReqeuest更改为onBeforeSendHeaders,一切正常:

chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    var redirect;
    if (details.url.match(/example\.com/)) {
      redirect = "https://www.google.com"; // chrome.extension.getURL("hello.html");
      console.log("Redirecting:", details.url, "->", redirect);
      return {redirectUrl: redirect};
      }
    console.log("Requesting:",details.url);
  }, {urls: [
    "<all_urls>"
  ]}, ["blocking"]);

Edit2:抱歉这将是一个WebExtension(虽然我认为很明显,因为有一个manifest.json文件而不是install.rdf。此外,addListener部分的文档onBeforeRequest声明:

  

返回:webRequest.BlockingResponse。如果在“extraInfoSpec”参数中指定了“blocking”,则事件侦听器应返回此类型的对象。

然后在BlockingResponse文档:

  

redirectUrl可选       串。仅用作对onBeforeRequest和onHeadersReceived事件的响应。如果设置,则阻止原始请求   从发送/完成,而是重定向到给定的URL。   允许重定向到非HTTP方案,例如data :.重定向   由重定向操作启动使用原始请求方法   重定向,但有一个例外:如果重定向是在   onHeadersReceived阶段,然后重定向将使用   GET方法。

1 个答案:

答案 0 :(得分:0)

这对Chrome和Firefox都适用。

    let { tabId } = details;
    let redirectUrl = chrome.extension.getURL('hello.html');
    if(navigator.userAgent.toLowerCase().indexOf("firefox") > -1) {
        chrome.tabs.update(tabId, {
            url: redirectUrl
        })
        return {
            cancel: true
        }
    } else return { redirectUrl }