gpt4 book ai didi

javascript - 如何在Outlook.com Web邮件中拦截具有Firefox XUL扩展名的电子邮件附件的上传

转载 作者:行者123 更新时间:2023-11-28 01:51:20 24 4
gpt4 key购买 nike

我有一个XUL扩展名,它使用本机Windows DLL和js-ctypes加密本地文件系统中的文件。我已经测试了它的菜单驱动版本,并且看起来工作正常。

现在,我要执行以下操作:在创建带有附件的新电子邮件时,能够“捕获”附件文件并对其进行处理(意味着:对其进行加密),然后再将其上传到所编写的电子邮件中。我想以透明的方式进行操作,因此用户除了提供用于加密的密码外,不必经过菜单驱动的过程。

我想在基于Outlook.com网络的电子邮件(不是Office版本)中执行此操作。

我知道这是一个远景,但是有人对从哪里开始寻找想法吗?过去有人做过这样的事情吗?

提前致谢!

最佳答案

一个不错的起点是一个已经完成了您想要的(以通用方式)的插件:

https://addons.mozilla.org/en-US/firefox/addon/tamper-data/

在下载页面上,它显示Use tamperdata to view and modify HTTP/HTTPS headers and post parameters。您对更改“后参数”感兴趣,因此这是一个不错的起点。



但是,如果您只是想自己实现这一点……

我已经无序地回答了这个问题,以便在开发过程中逐步建立解决方案。

在最后的扩展中,您需要:


拦截请求
定位正确的请求
获得对POST请求正文的访问权限
解析POST请求主体的表单数据(以获取真实的二进制文件数据)
做你的加密步骤
重新编码二进制文件数据,重新组合表单数据,并修改POST请求标头
替换POST请求中的现有内容。




拦截请求并替换现有的POST内容

基础知识是您需要实现一个nsIObserver并将nsIHTTPChannel作为“主题”传递给观察。您希望观察的“通知”称为http-on-modify-request

GET的文档中,有一些简单的示例(12)用于拦截http-on-modify-request请求,但是拦截POST请求则更为复杂。

进入POST请求正文:

有一个mozillazine forum thread处理这个确切的主题。
Kamelot9
该线程中的第二篇文章详细介绍了如何(1)获得文章正文:

var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
var uploadChannel = httpChannel.QueryInterface(Ci.nsIUploadChannel);
var uploadChannelStream = uploadChannel.uploadStream;
uploadChannelStream
.QueryInterface(Ci.nsISeekableStream)
.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);
var stream = Cc["@mozilla.org/binaryinputstream;1"]
.createInstance(Ci.nsIBinaryInputStream);
stream.setInputStream(uploadChannelStream);
var postBytes = stream.readByteArray(stream.available());
var poststr = String.fromCharCode.apply(null, postBytes);


其中 aSubject作为 http-on-modify-request通知的参数。然后,您可以只修改 poststr。根据服务器的不同,您可能还需要修改 Content-length标头(否则您的帖子可能会被截断)。

替换POST请求内容:

修改后的POST正文后,您需要(2)用您自己的内容替换 inputStreamuploadChannel的现有内容:

var inputStream = Cc["@mozilla.org/io/string-input-stream;1"]
.createInstance(Ci.nsIStringInputStream);
inputStream.setData(poststr, poststr.length);
uploadChannel.setUploadStream(
inputStream,
"application/x-www-form-urlencoded",
-1);
// do this last - setUploadStream resets requestMethod to PUT
httpChannel.requestMethod = "POST";


上面的 CcCi分别是 Components.classesComponents.interfaces的简写。这些速记变量可能已经设置,或者您可以自己定义它们。

解析表单数据:

我认为通常对于文件上传, Content-type:将是 multipart/form-data

要深入了解您感兴趣的特定“附件”,您需要:


解析mime信封以获取文件附件
查找文件附件
删除所有已使用的文本编码(例如: BASE64


在POST标头中,您将获得类似以下内容的信息:

Content-Type: multipart/form-data; boundary=JGUOAeGT3Fjgjcdk6s35F2mPVVyTdzgR


其中“ JGUOAeGT3Fjgjcdk6s35F2mPVVyTdzgR”是MIME边界。在POST正文中,内容开始的格式将如下所示:

--[boundary]
CONTENT-PART #1
--[boundary]
CONTENT-PART #2
--[boundary]


上面的每个 CONTENT-PART都有一些HTTP标头,一个空行,然后是该特定 CONTENT-PART的正文。

来自另一个 stackoverflow question的示例:

Content-Disposition: form-data; name="updates"; filename="update1353963418000.json"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: binary

{"collectionType":"activities","date":"2012-11-26","ownerId":"qw12er23","ownerType":"user","subscriptionId":"112233-activities"}]


在这种情况下, Content-Transfer-Encoding是二进制(原始,编码的)UTF8,因此您无需执行任何其他工作就能读取 CONTENT-PART正文中的JSON。

在您的情况下,浏览器将发送一个二进制文件,因此可能会将 Content-Transfer-Encoding设置为 base64,这意味着您需要对 CONTENT-PART的主体进行Base64解码,才能进入真正的二进制文件。如果 base64data包含编码后的内容,则将为您提供原始二进制数据:

var rawData = atob(base64data);


此时,您可以对 rawData进行所需的任何加密。

记住,加密后(使用 btoa)必须重新编码二进制数据,然后在重新构造POST请求正文之前,需要重新组装多部分信封。 (不要忘记获取最终请求正文的 .length,以便您可以替换请求标头中的 Content-length。)。

定位请求:

这是修改POST请求的基本机制。但是,您仍然必须挑出特定的POST请求(检查观察者通知中的POST请求URL),以便允许其他POST请求正常进行而无需调用修改代码。

关于javascript - 如何在Outlook.com Web邮件中拦截具有Firefox XUL扩展名的电子邮件附件的上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19664526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com