1

ネイティブの Windows DLL と js-ctypes を使用してローカル ファイル システム内のファイルを暗号化する XUL 拡張機能があります。私はすでにそれのメニュー駆動バージョンをテストしており、うまく動作しているようです.

今、私は次のことをしたいと思います: 添付ファイル付きの新しい電子メールを作成するとき、添付ファイルを「キャッチ」して処理 (つまり、暗号化) してから、作成した電子メール メッセージにアップロードできるようにします。暗号化のためのパスワードを提供する以外は、ユーザーがメニュー駆動のプロセスを実行する必要がないように、透過的な方法でそれを行いたいと思います。

Outlook.com Web ベースの電子メール (Office バージョンではない) 内でこれを行いたいと考えています。

私はそれがロングショットであることを知っていますが、どこから始めるべきかについて誰か考えがありますか? 過去にこのようなことをした人はいますか?

前もって感謝します!

4

1 に答える 1

1

開始するのに適した場所は、(一般的な方法で) 必要なことを既に実行しているアドオンです。

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

ダウンロードページには と書かれていますUse tamperdata to view and modify HTTP/HTTPS headers and post parameters。「投稿パラメーター」の変更に興味があるので、ここから始めるのがよいでしょう。


しかし、これを自分で実装したいだけなら....

開発中のソリューションを構築する方法を進めるために、私はこれに順不同で回答しました。

最終的な拡張では、次のことを行う必要があります。

  1. リクエストを傍受する
  2. 正しいリクエストをターゲットにする
  3. POST リクエスト本文へのアクセスを取得する
  4. POST リクエスト本文のフォーム データを解析します (実際のバイナリ ファイル データを取得するため)。
  5. 暗号化の手順を実行します
  6. バイナリ ファイル データを再エンコードし、フォーム データを再アセンブルし、POST 要求ヘッダーを変更します。
  7. POST リクエストの既存のコンテンツを置き換えます。

リクエストの傍受と既存の POST コンテンツの置き換え

基本は、監視の「サブジェクト」としてnsIHTTPChannelを渡すnsIObserverを実装する必要があるということです。観察したい「通知」は と呼ばれます。http-on-modify-request

のドキュメントにリクエストを傍受するための簡単な例 ( 12 ) がありますが、リクエストの傍受はより複雑です。GEThttp-on-modify-requestPOST

POST リクエストの本文を取得します。

この正確なトピックを扱うmozillazine フォーラム スレッドがあります。 Kamelot9そのスレッドの 2 番目の投稿では、(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)の既存のコンテンツを独自inputStreamのものに置き換える必要があります。uploadChannel

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";

Ccと上記はそれぞれとCiの省略形です。これらの省略形の変数は、すでに設定されている場合もあれば、自分で定義することもできます。Components.classesComponents.interfaces

フォーム データの解析:

通常、ファイルのアップロードの場合、Content-type:multipart/form-data.

関心のある特定の「添付ファイル」に到達するには、次のことを行う必要があります。

  1. MIME エンベロープを解析して添付ファイルを取り出します
  2. 添付ファイルを見つける
  3. 使用されているテキスト エンコーディングを削除します (例: 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.

別のスタックオーバーフローの質問の例:

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.

あなたの場合、ブラウザはバイナリ ファイルを送信するため、 を に設定している可能性がありContent-Transfer-Encodingます。つまり、実際のバイナリ ファイルを取得するにbase64は、 の本体を Base64 でデコードする必要があります。CONTENT-PARTエンコードされたコンテンツが含まれている場合base64data、生のバイナリ データが得られます。

var rawData = atob(base64data);

その時点で、必要な暗号化を行うことができますrawData

暗号化後にバイナリ データを再エンコードする必要があることを思い出してください (を使用btoa)。次に、POST 要求本文を再構築する前に、マルチパート エンベロープを再構築する必要があります。.length(リクエスト ヘッダーの を置き換えることができるように、最終的なリクエスト ボディを取得することを忘れないでくださいContent-length)。

リクエストのターゲット:

これが、POST リクエストを変更するための基本的なメカニズムです。ただし、変更コードを呼び出さずに他の POST リクエストを通常どおり続行できるように特定の POST リクエストを選択する必要があります (オブザーバー通知の POST リクエスト URL を調べます)。

于 2014-01-08T03:07:34.983 に答える