Firefox FF插件SDK读取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

下面的代码片段在标准POST请求上运行良好。但是,仅在任何类型的站点登录上,下面的
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”进行打包,并作为插件安装。