Javascript Firefox-当某个变量与某个模式匹配时拦截/修改post数据

Javascript Firefox-当某个变量与某个模式匹配时拦截/修改post数据,javascript,firefox,firefox-addon,http-post,tamper-data,Javascript,Firefox,Firefox Addon,Http Post,Tamper Data,我想知道,当url和一些变量满足某种模式时,是否可以截取和修改post数据 例如: 让登录url为: 让post数据为: email: "myemail@gmail.com" pass: "mypass" theme: "skyblue" 如果: url=”http://www.someonlineprofiles.com/ajax/login_action_url“和 电子邮件=”myemail@gmail.com“ 然后将主题值无条件更改为:“hotdesert” 有可能为此创建一个Fir

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

例如:

让登录url为:

让post数据为:

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

url
=
”http://www.someonlineprofiles.com/ajax/login_action_url“

电子邮件
=
”myemail@gmail.com“

然后将
主题
值无条件更改为:
“hotdesert”

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

我找到了这个链接:

提前谢谢

[添加信息]


我不知道了解我的Firefox版本是否有意思:35.0.1你的问题太宽泛了,因此我将仅概述如何做到这一点,而不是复制粘贴解决方案,这将需要一段时间才能创建,也将剥夺你的学习体验

观察员 首先,您只需要实现并注册所谓的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 observer:

  • 如果您正在使用SDK,请将其放入
    main.js
    或专用模块中。您还需要稍微重写代码并替换
    const..=组件
    与一个
  • 如果您正在编写一个XUL覆盖插件,请将其放入
重写post数据 我们仍然需要实现
doSomething()
,并实际重写post数据。http通道通常实现
nsIUploadStream
接口,上传流是当前post数据所在的位置(如果有)。它还有一个
setUploadStream()
方法,您可以使用该方法完全替换上载流

function doSomething(channel) {
  if (!(channel instanceof Ci.nsIUploadStream)) {
    return;
  }
  // construct new post data
   channel.setUploadStream(newStream);
}
构建新的post数据将取决于您的实际需求。我想知道你怎么做


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

您的问题过于宽泛,因此我将仅概述如何做到这一点,而不是复制粘贴就绪的解决方案,这将需要一段时间来创建,也将剥夺您的学习体验

观察员 首先,您只需要实现并注册所谓的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 observer:

  • 如果您正在使用SDK,请将其放入
    main.js
    或专用模块中。您还需要稍微重写代码并替换
    const..=组件
    与一个
  • 如果您正在编写一个XUL覆盖插件,请将其放入
重写post数据 我们仍然需要实现
doSomething()
,并实际重写post数据。http通道通常实现
nsIUploadStream
接口,上传流是当前post数据所在的位置(如果有)。它还有一个
setUploadStream()
方法,您可以使用该方法完全替换上载流

function doSomething(channel) {
  if (!(channel instanceof Ci.nsIUploadStream)) {
    return;
  }
  // construct new post data
   channel.setUploadStream(newStream);
}
构建新的post数据将取决于您的实际需求。我想知道你怎么做


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

您的问题过于宽泛,因此我将仅概述如何做到这一点,而不是复制粘贴就绪的解决方案,这将需要一段时间来创建,也将剥夺您的学习体验

观察员 首先,您只需要实现并注册所谓的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 observer:

  • 如果您正在使用SDK,请将其放入
    main.js
    或专用模块中。您还需要稍微重写代码并替换
    const..=组件
    与一个
  • 如果您正在编写一个XUL覆盖插件,请将其放入
重写post数据 我们仍然需要实现
doSomething()
,并实际重写post数据。http通道通常实现
nsIUploadStream
接口,上传流是当前post数据所在的位置(如果有)。它还有一个
setUploadStream()
方法,您可以使用该方法完全替换上载流

function doSomething(channel) {
  if (!(channel instanceof Ci.nsIUploadStream)) {
    return;
  }
  // construct new post data
   channel.setUploadStream(newStream);
}
构建新的post数据将取决于您的实际需求。我想知道你怎么做


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

您的问题过于宽泛,因此我将仅概述如何做到这一点,而不是复制粘贴就绪的解决方案,这将需要一段时间来创建,也将剥夺您的学习体验

观察员 首先,您只需要实现并注册所谓的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 observer:

  • 如果您正在使用SDK,请将其放入
    main.js
    或专用模块中。您还需要稍微重写代码并替换
    const..=组件
    与一个
  • 如果您正在编写一个XUL覆盖插件,请将其放入
重写post数据 我们仍然需要实现
doSomething()
,并实际重写post数据。http通道通常实现
nsIUploadStream
接口,上传流是当前