【问题标题】:Firefox - Intercept/Modify post data when some variable match some patternFirefox - 当某些变量与某些模式匹配时拦截/修改发布数据
【发布时间】:2015-02-14 13:18:46
【问题描述】:

我想知道当url和一些变量符合某种模式时,是否可以截取和修改post数据。

例如:

让登录网址为:http://www.someonlineprofiles.com

让帖子数据为:

email: "myemail@gmail.com"
pass: "mypass"
theme: "skyblue"

如果:

url = "http://www.someonlineprofiles.com/ajax/login_action_url"

email = "myemail@gmail.com"

然后将theme值无条件更改为:"hotdesert"

是否可以为此创建一个 Firefox 插件?插件是否足够强大?

我找到了这个链接: modify the post data of a request in firefox extension

提前致谢!

[添加信息]

不知道了解我的Firefox版本是否有趣:35.​​0.1

【问题讨论】:

  • 是的,Firefox 插件非常强大。篡改数据会这样做。开始编码!
  • 但是只有当登录 url 和某些变量符合某些模式时,我可以使用 TamperData 进行更改吗?我正在尝试 TamperData 但没有找到这样的选项。谢谢。
  • Tamper Data 很遗憾没有自动化或其他类似功能。您必须为每个请求手动修改它。不过,您可以制作自己的插件。
  • 非常感谢亚历山大。如果有人有一些关于如何捕获请求并可能对其进行修改的基本 Firefox 插件示例,那就太好了!谢谢。

标签: javascript firefox firefox-addon http-post tamper-data


【解决方案1】:

您的问题过于宽泛,因此我将仅提供有关如何执行此操作的概述,而不是可复制粘贴的解决方案,这需要一段时间才能创建,并且还会剥夺您的学习经验.

观察者

首先it is possible for add-ons to observe and manipulate HTTP(S) requests before the browser sends the request,你只需要实现并注册一个所谓的http观察者。

const {classes: Cc, instances: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm"); // for Services

var httpRequestObserver = {
  observe: function(channel, topic, data) {
    if (topic != "http-on-modify-request") {
      return;
    }
    if (!(channel instanceof Ci.nsIHttpChannel)) {
      return; // Not actually a http channel
    }
    // See nsIChannel, nsIHttpChannel and nsIURI/nsIURL
    if (channel.URI.host != "www.someonlineprofiles.com") {
      return;
    }
    doSomething(channel);
  },

  register: function() {
    Services.obs.addObserver(this, "http-on-modify-request", false);
  },

  unregister: function() {
    Services.obs.removeObserver(this, "http-on-modify-request");
  }
};

httpObserver.register();
// When your add-on is shut down, don't forget to call httpObserver.unregister();

只在你的插件中注册一次 http 观察者:

  • 如果您使用 SDK,请将其放入 main.js 或专用模块中。您还需要稍微重写代码并将const .. = Components 行替换为require("chrome")
  • 如果您正在编写 XUL 覆盖插件,请将其放入 code module

重写帖子数据

我们仍然需要实现doSomething() 并实际重写帖子数据。 http 通道通常实现nsIUploadStream 接口,上传流是当前发布数据所在的位置(如果有)。它还有一个setUploadStream() 方法,可以用来完全替换上传流。

function doSomething(channel) {
  if (!(channel instanceof Ci.nsIUploadStream)) {
    return;
  }
  // construct new post data
   channel.setUploadStream(newStream);
}

构建新的帖子数据将取决于您的实际需求。我provided a working example in another answer 告诉你怎么做。

如果您需要从旧的上传流中获取一些数据,您需要自己将现有的channel.uploadStream 解码为multipart/form-data。我建议您查看 TamperData 和类似的附加组件,了解它们是如何在那里做事的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2012-01-22
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多