開始するのに適した場所は、(一般的な方法で) 必要なことを既に実行しているアドオンです。
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 コンテンツの置き換え
基本は、監視の「サブジェクト」としてnsIHTTPChannelを渡すnsIObserverを実装する必要があるということです。観察したい「通知」は と呼ばれます。http-on-modify-request
のドキュメントにリクエストを傍受するための簡単な例 ( 1、2 ) がありますが、リクエストの傍受はより複雑です。GET
http-on-modify-request
POST
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.classes
Components.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
.
別のスタックオーバーフローの質問の例:
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 を調べます)。