Proxomitron Part 29

このエントリーをはてなブックマークに追加
544名無し~3.EXE
URLコマンドの"https.."は使わずにプロトコルをHTTPSからHTTPに切り替えるコマンドって実現出来る?

HTTP -> HTTPS なら単純に

Match = "http://\0"
Replace = "$JUMP(https://\0)"

でいけるんだけど、同じ方法だと HTTPS -> HTTP の場合はダメなんだよね。

Match = "https://\0"
Replace = "$JUMP(http://\0)"

ってやっても、ログウィンドウによると

JumpTo: https://http://http:443//

みたいなワケワカメな挙動をしていてダメだわ。
545名無し~3.EXE:2008/03/19(水) 11:18:44 ID:hr52de1W
フィルタ作成スレで質問してた人かな? フィルタ書いてもらっても無反応なんですね。
546名無し~3.EXE:2008/03/19(水) 11:31:59 ID:Thb2rMC6
いや違うし。
547名無し~3.EXE:2008/03/19(水) 11:44:57 ID:hr52de1W
locationヘッダをいじってみたら
548名無し~3.EXE:2008/03/19(水) 11:44:57 ID:Nhww3eMN
SSLでのおみとろん使用はwiki見れ
549名無し~3.EXE:2008/03/19(水) 13:23:16 ID:hr52de1W
>>544
おまえhttpsでオミトロン使えないと思われてるぞ
550544:2008/03/19(水) 13:59:04 ID:Thb2rMC6
どうにか自己解決。


URL:ヘッダフィルタでURLを変更する場合は、ヘルプに従い、Out に設定した上で
$JUMP() なり $RDIR() なりさせていたんだけど(HTTP接続だとそれで問題ない)、
どうやらHTTPS接続時には Out にすると何故だかURLを正常に取得出来ないっぽい。
これがジャンプ出来なかった理由。

対象URL:
https://www.nhk.or.jp/bs/genre/pic/pickup_baseball2008_s.jpg
に対して、

(実験1)
[HTTP headers]
In = FALSE
Out = TRUE
Key = "URL: HTTPS URL Match Test (out)"
Match = "$URL(https://\0:443\1)$ALERT(\\0=\0\n\\1=\1\n\\u=\u)"
Replace = "\k"

(結果)
\0=www.nhk.or.jp
\1=/
\u=https://www.nhk.or.jp:443/

↑なんかもうダメダメですね。
551544:2008/03/19(水) 14:00:11 ID:Thb2rMC6
ところが、Out を In にしてみたら期待通りに動作した。

(実験2)
[HTTP headers]
In = TRUE
Out = FALSE
Key = "URL: HTTPS URL Match Test (in)"
Match = "$URL(https://\0:443\1)$ALERT(\\0=\0\n\\1=\1\n\\u=\u)"
Replace = "\k"

(結果)
\0=www.nhk.or.jp
\1=/bs/genre/pic/pickup_baseball2008_s.jpg
\u=https://www.nhk.or.jp:443/bs/genre/pic/pickup_baseball2008_s.jpg



というわけで、HTTPS -> HTTP というプロトコルの切り替えは、

[HTTP headers]
In = TRUE
Out = FALSE
Key = "URL: HTTPS -> HTTP Protocol Changer (in)"
Match = "$URL(https://([^/:]+)\0:443\1)"
Replace = "$JUMP(http://\0\1)"

で実現出来た。参考になれば幸い。

# Scott がヘルプにわざわざ
# 'note: this filter would be enabled under the "out" column'
# と注釈を入れているのが謎だけど。
552名無し~3.EXE:2008/03/19(水) 14:17:25 ID:hr52de1W
こんなバグは今まで聞いたことないなー。
非公式改造版のエンバグだったりして。
553544:2008/03/19(水) 15:23:27 ID:Thb2rMC6
追記。


URL:ヘッダフィルタの In/Out についてですが、Out(Scott推奨)の場合は
ブラウザのリクエストを受け取った時点で(リモートサーバにアクセスすることなく)
当該フィルタが適用されるのに対し、In の場合は一旦リモートサーバにアクセス
(但し受信するのはHTTPヘッダのみで、ボディは受け取らないっぽい)してから
適用される、という違いがあるようです。
確かにHTTPの場合は Out に設定しておくに越したことはなさそうですね。
HTTPSの場合とは異なり、わざわざ In に設定せずともちゃんと動作するわけだし。

>>551の方法(In に設定する)だとセキュアサーバに対し一旦接続自体は
行われるのだ、ということは頭に入れておく必要がありますね。
(それを理解した上で使う分には問題ないでしょう)
554名無し~3.EXE:2008/03/19(水) 15:35:05 ID:hr52de1W
OutでもURL欄では正常に動く可能性があるな。
SSLオフにしてるから試す気もないが。
555名無し~3.EXE:2008/03/19(水) 16:08:02 ID:Thb2rMC6
>>554
いや、それも試したんだけどダメだった。

URL欄にはスキーム部分を含めることが出来ないので
やはり"$URL(https://([^/:]+)\0:443\1)"を入れてやってみたんだけど、
Out の場合は>>544と同じ症状。
https://http://http// というワケワカメな新URLに、怒涛の勢いで
狂ったように無限ループでアクセスする。

っつか、この場合 In でも無限ループアクセスに陥ってしまう。
(こちらは、元のURLに、だけど)
556名無し~3.EXE:2008/03/19(水) 16:13:35 ID:hr52de1W
そうなんだ、Outで解決出来ないとなるとアクセス解析を遮断したい場合に困るね。
フィルタの管理もhttpsとhttpと2つのフィルタに分けて管理したほうが良さそうだな。

とりあえず乙。
557名無し~3.EXE:2008/03/19(水) 16:28:59 ID:Thb2rMC6
あ、苦肉の策で In にしたのは、そうでもしないと
何故だかURLを変数に取り込めない(ジャンプ先の新URLを作れない)から。

接続させたくないというだけなら、URLを取り込む必要がないんだから
HTTPSであろうが普通に Out で \k すればOK。
(この場合リモートサーバへのアクセスは行われない)
558名無し~3.EXE:2008/03/19(水) 16:36:31 ID:hr52de1W
あ、そっか。 変数に取り込めないのが問題だったのか。
回避策になるかも知れない案が2つほどあるから後で試してみる。
559名無し~3.EXE:2008/03/19(水) 17:17:54 ID:IGhSyZ4M
>>552
オリジナルでも同じ。
いいかげんなことばっか言ってるなー。
560名無し~3.EXE:2008/03/19(水) 18:05:52 ID:9mRRIAtx
CONNECTの方に作用してるんでそ。
スキームが変わらないのはバグっぽい気もするけど。
561名無し~3.EXE:2008/03/19(水) 18:14:52 ID:21tmCqOU
>>550-557
一連の流れを見てて思ったんだけど
もしかしてhttpsがどうやって通信を確立させてるか知らないでフィルター書いてる?

もし知らないなら、一度ログウィンドウで見てみると良いよ
何故>>550なのか理由が解るから

あと、これを試してみるとか
In = FALSE
Out = TRUE
Key = "URL: HTTPS URL Match Test (out)"
Match = "$URL(https://\0:443\1)$TST(\1=/bs/*)$ALERT(\\0=\0\n\\1=\1\n\\u=\u)"
Replace = "\k"
562544:2008/03/19(水) 19:53:59 ID:Thb2rMC6
うん。ログウィンドウは飽きるほど眺めたので、どうやら>>550の実験結果が、
ブラウザが Proxomitron との間にトンネル接続を確立する際のCONNECT要求の方に
URL:ヘッダフィルタが作用しちゃった結果らしいのは分かったんだけど…。
変数で拾ってるのはauthority部分だけになっちゃってるし。

ただ、パス部分が欠落しちゃうにしても、$JUMP(http://\0\1) の結果は
少なくとも JumpTo: http://www.nhk.or.jp/ にはならないといけない気がするけど。


> あと、これを試してみるとか

これいいですね!
$TST() で \1 の値をチェックすることでCONNECT要求への“誤爆”を回避し、
URL:ヘッダフィルタがトンネリング成功後のリクエストの方に適用されるように
しているのかな。同じ方法論で汎用的なフィルタに書き直せばいいですね。

HTTPの場合同様 Out 設定でOKなので、リモートサーバにアクセスすらしない、
まさに求めている動作になっています!このアイデアいただき!
563名無し~3.EXE:2008/03/19(水) 21:08:52 ID:hr52de1W
どうでもいいことだが$URLいらないよな
564名無し~3.EXE:2008/03/19(水) 21:23:37 ID:Thb2rMC6
ホントだ。
よく考えたらURL:ヘッダフィルタのMatch欄で使う分には必要ありませんねw
565名無し~3.EXE:2008/03/19(水) 22:42:32 ID:Thb2rMC6
Changes.txt のココ↓読んでたら無駄に悩まずに済んだかも。

| * Can now filter the CONNECT method used to establish
|   SSL pass-thru connections. That allows some minimal
|   filtering (basic site blocking and bypass list host
|   matching) even without using OpenSSL. CONNECT headers
|   are now also visible in the log window (though keep
|   in mind they're only used by the proxy and not passed
|   to the remote site).


他にも、ヘルプには明記されていない機能がひっそりと書かれていたりと、
意外と重要かつ有用なドキュメントですね。今まで読んでなかった。
566名無し~3.EXE:2008/03/20(木) 06:52:32 ID:RkrxEgLF
オミトロンのヘルプファイルか・・・

「急いで書かれた上にあまり正確とも言えないガイドへようこそ」

そんなに謙遜しないでよスコットたん・・・(つД`)
分かりやすい具体例を豊富に織り交ぜて、
とても読みやすく親切に仕上がってると思うんだ
567名無し~3.EXE:2008/03/20(木) 07:22:25 ID:fE8AHZo7
暇な時にじっくり読んでる。
オミトロンを使いこなすため、というよりも、
単純に読んでて楽しいw

なんかこう、
ホームセンターの店内を見て回ってるみたいにさ、
ズラリと並んだ盛り沢山の機能を眺めてうっとりしてるw
568名無し~3.EXE:2008/03/20(木) 08:12:48 ID:N72KXTVf
英語ワカリマセン
569名無し~3.EXE:2008/03/20(木) 08:16:20 ID:t16waHuG
570名無し~3.EXE:2008/03/20(木) 08:22:46 ID:N72KXTVf
>>569
サンクス。 日本語でも意味ワカランけど貼っとく。

* SSL pass-thru 接続を確立するために使われる CONNECT メソッドを
 フィルタすることができるようになりました。これで OpenSSL を使用
 しなくても最小限のフィルタリングが可能になりました(基本的な
 サイトブロックやバイパスリスト用のホスト名マッチなど)。
 また、CONNECT ヘッダがログウィンドウで見られるようになりました。
 (これは proxy によって使われるものであって、リモートサイトに
  伝えられるものではないということは覚えておいてください)
571名無し~3.EXE:2008/03/20(木) 08:53:31 ID:N72KXTVf
* 存在しないブロックリストにエントリを追加すると、その名前で「一時的」
 リストを作成するようになりました。このリストはメモリ上だけに存在し、
 全体で使える情報を蓄えておくハッシュ配列のように使うことができます。
 このリストはどのメニューにも表示されず、編集することもできないので
 注意してください(これはファイルではないからです)。しかしこれは
 マッチで呼ぶことができ、他のリストと同じように追加されます。

これ地味に便利だ
572名無し~3.EXE:2008/03/20(木) 09:09:28 ID:Pi+WljVm
>>570
えーと多分、HTTPのGET、例えば http://hoge.com/hage/fuga だと
ブラウザはProxomitronに対して単純に

GET http://hoge.com/hage/fuga HTTP/1.1
Host: hoge.com
(対プロキシなんで絶対URI。ログウィンドウには
 GET /hage/fuga HTTP/1.1 と表示されるけど)

といったGETメソッドリクエストをいきなり発行するけど、
HTTPSの場合はまず前段階としてCONNECTメソッドで
パス部分は含まないホスト名(&ポート番号)のみの

CONNECT hoge.com:80 HTTP/1.1
Host: hoge.com:80

といったリクエスト発行でProxomitronと接続を確立するわけだけど
このCONNECTメソッドリクエストがログウィンドウで確認出来るようになったよ、
フィルタリングも出来るようになったよ、これはOpenSSL入れてなくてもおk、
ただしCONNECTの時点ではProxomitronに通知されているのはホスト名だけだから
ホスト名だけをチェックするような単純なフィルタリングしかこの時点では使えないけどね、
あとログウィンドウに出るCONNECT接続のログは
あくまでブラウザとProxomitronとの間の通信であってリモートは関与してないよ、ってことかと。
詳しくは俺もよく分からん。
573名無し~3.EXE:2008/03/20(木) 09:51:19 ID:N72KXTVf
>>572
なるほど、どうもありがとう。
CONNECTとGETでは同じ接続番号が使われるから$DTM(c)が同一かどうかでCONNECTかどうかを
判別することも出来るね。 >>571の幽霊リスト使えばハッシュ化した状態で記録出来る。 さっそく使い道が。