Firefox - Intercept/Modify post 某些变量匹配某些模式时的数据
Firefox - Intercept/Modify post data when some variable match some pattern
我想知道当 url 和一些变量符合某种模式时是否可以拦截和修改 post 数据。
例如:
让登录 url 为:http://www.someonlineprofiles.com
设post数据为:
email: "myemail@gmail.com"
pass: "mypass"
theme: "skyblue"
我愿意,如果:
url
= "http://www.someonlineprofiles.com/ajax/login_action_url"
和
email
= "myemail@gmail.com"
则theme
值无条件修改为:"hotdesert"
是否可以为此创建一个 Firefox 附加组件?附加组件是否足够强大?
我找到了这个 link:
modify the post data of a request in firefox extension
提前致谢!
[补充信息]
不知道有没有兴趣知道我的火狐版本:35.0.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。
重写post数据
我们还需要实现doSomething()
并实际重写post数据。 http通道通常实现nsIUploadStream
接口,上传流是当前post数据所在的地方,如果有的话。它还有一个 setUploadStream()
方法,您可以使用它来完全替换上传流。
function doSomething(channel) {
if (!(channel instanceof Ci.nsIUploadStream)) {
return;
}
// construct new post data
channel.setUploadStream(newStream);
}
构建新的 post 数据将取决于您的实际需求。我 provided a working example in another answer 告诉你怎么做。
如果您需要从旧的上传流中获取一些数据,您需要自己将现有的 channel.uploadStream
解码为 multipart/form-data
。我建议您查看 TamperData 和类似的附加组件,了解它们在那里的工作方式。
我想知道当 url 和一些变量符合某种模式时是否可以拦截和修改 post 数据。
例如:
让登录 url 为:http://www.someonlineprofiles.com
设post数据为:
email: "myemail@gmail.com"
pass: "mypass"
theme: "skyblue"
我愿意,如果:
url
= "http://www.someonlineprofiles.com/ajax/login_action_url"
和
email
= "myemail@gmail.com"
则theme
值无条件修改为:"hotdesert"
是否可以为此创建一个 Firefox 附加组件?附加组件是否足够强大?
我找到了这个 link: modify the post data of a request in firefox extension
提前致谢!
[补充信息]
不知道有没有兴趣知道我的火狐版本:35.0.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。
重写post数据
我们还需要实现doSomething()
并实际重写post数据。 http通道通常实现nsIUploadStream
接口,上传流是当前post数据所在的地方,如果有的话。它还有一个 setUploadStream()
方法,您可以使用它来完全替换上传流。
function doSomething(channel) {
if (!(channel instanceof Ci.nsIUploadStream)) {
return;
}
// construct new post data
channel.setUploadStream(newStream);
}
构建新的 post 数据将取决于您的实际需求。我 provided a working example in another answer 告诉你怎么做。
如果您需要从旧的上传流中获取一些数据,您需要自己将现有的 channel.uploadStream
解码为 multipart/form-data
。我建议您查看 TamperData 和类似的附加组件,了解它们在那里的工作方式。