mitmproxy を使用して、変更できないクライアント (監視エージェント) からの要求を適応させようとしています。
クライアントは、JSON や SOAP XML データなどのデータを要求に POST できません。フォームの名前と値のペア (またはヘッダーの名前と値) のみを投稿できます。
私は次の方法でこの制限を回避しようとしています:
- クライアントにフォームのペアを投稿させる: "phony_key="
- mitmproxy を使用してキーを削除し、データを投稿するだけです
「phony_key =」を取り除くだけの置換式でプロキシを実行すると、最初は見栄えが良かった
mitmproxy --replace /~bq/phony_param=/
...そして、curlからのリクエストを呼び出すと、次のような良い結果が得られました
curl -d phony_param='<SOAP-ENV:Envelope></SOAP-ENV:Envelope> https://host:port/path
しかし、実際のクライアントから呼び出されると、要求はサーバーによって拒否されました。
これは、実際のクライアントから送信されるデータ ペイロードが urlencode されているためだと思います。hex オプションを使用して mitmproxy でリクエストを検査すると、それが示されます。
0000000000 25 33 43 53 4f 41 50 2d 45 4e 56 25 33 41 45 6e %3CSOAP-ENV%3AEn
0000000010 76 65 6c 6f 70 65 2b 78 6d 6c 6e 73 25 33 41 53 velope+xmlns%3AS
0000000020 4f 41 50 2d 45 4e 56 3d 25 32 32 68 74 74 70 25 OAP-ENV=%22http%
一方、curl の呼び出しによって作成されたリクエストは、16 進表示でエンコードされていない XML を示しています。
それ以来、私は仕事をするためにインラインスクリプトを作ろうとしました
def request(context, flow):
if flow.request.method == "POST":
form = flow.request.get_form_urlencoded()
real_post = form.get("phony_param")[0]
form.__delitem__("phony_param")
print real_post
flow.request.content = real_post
flow.request.set_form_urlencoded(form)
上記では、フォームの名前/値を削除し、値をリクエストのコンテンツに追加して、変更されたフォームを追加しようとしています。私は正しい方向に進んでいるとは思わないか、少なくともまだ機能していません。