Firefox FF插件SDK读取post数据仅挂起登录数据
下面的代码片段在标准POST请求上运行良好。但是,仅在任何类型的站点登录上,下面的Firefox FF插件SDK读取post数据仅挂起登录数据,firefox,firefox-addon,firefox-addon-sdk,Firefox,Firefox Addon,Firefox Addon Sdk,下面的代码片段在标准POST请求上运行良好。但是,仅在任何类型的站点登录上,下面的read调用都会挂起,永远不会回来。如果我将read放在异常块中,则不会引发异常,它只是永远不会返回: if(httpChannel.requestMethod == "POST") { channel.QueryInterface(Ci.nsIUploadChannel); var instream = Cc["@mozilla.org/scriptableinputs
read
调用都会挂起,永远不会回来。如果我将read
放在异常块中,则不会引发异常,它只是永远不会返回:
if(httpChannel.requestMethod == "POST") {
channel.QueryInterface(Ci.nsIUploadChannel);
var instream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
instream.init(channel.uploadStream);
var post_data = instream.read(instream.available());
...
在这些登录中,instream.available()
实际上返回了POST数据中可用的正确字节数。事实上,如果以类似Burp的方式查看POST数据,它看起来非常正常(实际上是密码的纯文本,等等,因为它还没有发出)。再一次,如果不是登录,它可以正常工作。无论如何都不应该挂在那里。我当然在谷歌上搜索了nsIScriptableInputStream read login
完整代码:
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
//"use strict";
const EXPORTED_SYMBOLS = ['HttpRequestObserver'];
const {Cc, Ci, Cu} = require('chrome');
const module = Cu.import;
const error = Cu.reportError;
module("resource://gre/modules/XPCOMUtils.jsm");
module("resource://gre/modules/Services.jsm");
function HttpRequestObserver() {
this._init();
}
HttpRequestObserver.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference, Ci.nsIWeakReference]),
QueryReferent: function(iid) this.QueryInterface(iid),
GetWeakReference: function() this,
_init: function _init() {
Services.obs.addObserver(this, 'xpcom-shutdown', true);
Services.obs.addObserver(this, 'http-on-modify-request', true);
},
_uninit: function _uninit() {
Services.obs.removeObserver(this, 'http-on-modify-request');
Services.obs.removeObserver(this, 'xpcom-shutdown');
},
observe: function observe(subject, topic, data) {
switch(topic) {
case 'xpcom-shutdown':
this._uninit();
break;
case 'http-on-modify-request':
this.observeRequest(subject, topic, data);
break;
}
},
observeRequest: function observeRequest(channel, topic, data) {
if (!(channel instanceof Ci.nsIHttpChannel)) return;
var httpChannel = channel.QueryInterface(Ci.nsIHttpChannel);
//error("Request: " + channel.requestMethod + ": " + channel.URI.spec);
if(httpChannel.requestMethod == "POST") {
channel.QueryInterface(Ci.nsIUploadChannel);
var instream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
instream.init(channel.uploadStream);
var post_data = instream.read(instream.available());
post_data = post_data.replace(/= *%2344\+Font.+KrazyKool[^&]+/m,"=No+Flash+or+Java+fonts+detected");
var inputStream =
Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
inputStream.setData(post_data, post_data.length);
var contentType = httpChannel.getRequestHeader("Content-Type");
channel.setUploadStream(inputStream, contentType, -1);
httpChannel.requestMethod = "POST";
//channel.uploadStream.QueryInterface(Ci.nsISeekableStream);
//channel.uploadStream.seek(0,0);
}
},
};
HttpRequestObserver = new HttpRequestObserver();
注:
正则表达式只是在post参数中查找我的系统字体,并用消息“未检测到Flash或Java字体”覆盖它们,这实际上阻止了Panoptick对我的系统字体进行指纹识别。这可能是毫无意义的,因为我猜任何在上面的指纹实际上都不会返回实际的字体列表。但除此之外,上面的代码是用于更改post参数的模板。但是如上所述,如果post参数是登录参数,就进入梦幻岛。Firefox插件“篡改数据”显示登录的post数据,没有问题。任何Firefox插件的源代码都是现成的,所以我现在查看它们的源代码。要获取外接程序的源代码,请转到Mozilla外接程序,在搜索栏中键入篡改数据(在本例中),右键单击以保存链接,而不是单击以进行安装,该链接是外接程序的xpi文件。该文件实际上是一个zip文件,因此解压缩它,它将包含一个.jar(java)文件,而这个文件实际上也是一个zip文件。解压它,它将包含您的js代码的篡改数据加载项
所有内容都在tamperdata.js文件中,我现在仍在解密该文件。它和我的代码做着同样的事情,但不完全一样,不用说。该文件显然没有绑定到他们的界面,因此我可以将其插入我的代码。Firefox插件“篡改数据”显示登录的post数据,没有问题。任何Firefox插件的源代码都是现成的,所以我现在查看它们的源代码。要获取外接程序的源代码,请转到Mozilla外接程序,在搜索栏中键入篡改数据(在本例中),右键单击以保存链接,而不是单击以进行安装,该链接是外接程序的xpi文件。该文件实际上是一个zip文件,因此解压缩它,它将包含一个.jar(java)文件,而这个文件实际上也是一个zip文件。解压它,它将包含您的js代码的篡改数据加载项
所有内容都在tamperdata.js文件中,我现在仍在解密该文件。它和我的代码做着同样的事情,但不完全一样,不用说。该文件显然没有绑定到他们的接口,因此我可以将其插入到我的代码中。非常有趣!你能在scratchpad示例()和一个要测试的站点上发布一个更完整的拷贝粘贴吗?我在视频剪辑上看不到任何声音。scratchpad是某种共享环境吗?如果我把所有的代码都放在线程中,你可以复制并运行它。(只有大约40行)。你可以在Panoptick上尝试它(这很有效),然后注销say SO,并尝试使用我编写的插件重新登录。它会像上面所描述的那样挂起,永远不会回来。以前从未使用过scratchpad。只是用“cfx运行”和/或用“cfx xpi”打包并作为插件安装。非常有趣!你能在scratchpad示例()和一个要测试的站点上发布一个更完整的拷贝粘贴吗?我在视频剪辑上看不到任何声音。scratchpad是某种共享环境吗?如果我把所有的代码都放在线程中,你可以复制并运行它。(只有大约40行)。你可以在Panoptick上尝试它(这很有效),然后注销say SO,并尝试使用我编写的插件重新登录。它会像上面所描述的那样挂起,永远不会回来。以前从未使用过scratchpad。只是用“cfx运行”和/或用“cfx xpi”打包并作为插件安装。非常有趣!你能在scratchpad示例()和一个要测试的站点上发布一个更完整的拷贝粘贴吗?我在视频剪辑上看不到任何声音。scratchpad是某种共享环境吗?如果我把所有的代码都放在线程中,你可以复制并运行它。(只有大约40行)。你可以在Panoptick上尝试它(这很有效),然后注销say SO,并尝试使用我编写的插件重新登录。它会像上面所描述的那样挂起,永远不会回来。以前从未使用过scratchpad。正在使用“cfx运行”进行测试和/或使用“cfx xpi”进行打包,并作为插件安装。