FilterProxy‎ > ‎

FilterProxy ver2(Japanese)

<<趣旨>>
Android端末でPCページを見ていて思うのは「広告画像多すぎ!」ということ。
ただでさえ帯域が狭いのだから、無駄な広告画像なんて見たくないのよ。
というわけで、このアプリを作った。

<<機能>>

  • パターンにマッチしたURLへのアクセスをブロックします(デフォルトでは'403 Forbidden'として返す。変更可能。)
  • ブロックしたくないURLパターンを登録できます
  • 条件にマッチしたURLを別のURLにリダイレクトします(内部リダイレクト機能)
  • HTTPリクエストヘッダの書き換えを行います
<<使い方>>
<初期設定>
1.起動して[基本/設定]タブにある"プロキシ設定"ボタンを押します(機種によってはこのボタンが動作しません。その場合は「設定」アプリの「無線とネットワーク」を利用してください)
2."モバイルネットワーク"→"アクセスポイント名"→{利用しているアクセスポイント}の順に選択します(端末によって表現は微妙に異なるかもしれません)

3."プロキシ"に「localhost」を設定します
4."ポート"に[基本/設定]タブのPORTで指定している数値を設定します(デフォルトでは「8000」)


以上で使う準備は完了です。これでブラウザからのアクセスがFilterProxyを経由するようになります。

<基本>

FilterProxyの基本的な設定を行ったり、FilterProxyを経由したアクセスのログを表示します

<[基本/設定]タブ>


・ACTIVE/BYPASS
一時的にFilterProxyの処理を無効にしたい場合にこのボタンを押します。ACTIVEの場合はFilterProxyが動作しています。BYPASSの場合はFilterProxyの動作は無効になっています。
・プロキシ設定
アクセスポイントにプロキシを設定をする場合、Androidの「設定」アプリから辿って行くこともできますが、このボタンをつかって辿った方が楽です。一部の機種(例:IS01)ではこのボタンが動作しないようです。この場合は「設定」アプリの「無線とネットワーク」から辿って設定を行ってください。
・PORT
FilterProxyが利用するポート番号を指定します。(この数値をアクセスポイントの"ポート"に指定します)1024以上65535以下の値が設定可能です。デフォルトは8000です。
・アイコン表示
アイコンを表示します。アイコンを表示すると端末のメモリが逼迫している場合でもFilterProxyが終了しづらくなります。
・透明
アイコンがステータスバー上で見えないようにします。見えないようにしているだけで透明なアイコンが存在している為、ステータスバーの領域は消費されます。
・アクセスログ削除順
ログには100件のアクセスを保持しています。100件を越えるアクセスがあった場合、どのログを削除するのかを指定します。
 ・レスポンスが早かったものを削除
  コンテンツ取得に時間がかからなかったログを削除します。つまりログにはコンテンツ取得に時間がかかった物が残ります。コンテンツ取得に時間がかかっているサイトを調べる場合に便利です。
 ・リクエストが古かったものを削除
  リクエストを行った時刻が古い物を削除します。つまり直近のログが残ることになります。直前にアクセスしたコンテンツについて知りたい場合に便利です。
・アクセスログ表示順
ログの表示順を指定します。
 ・レスポンスが遅い順
  コンテンツ取得に時間がかかった物ほど上に表示されます。取得に時間がかかっているコンテンツを調べる際に便利です。
 ・リクエスト順(最新が下に)
  リクエストを行った時刻が古いほど上に表示されます。コンテンツの取得順を追っていきたいときに便利です。
 ・リクエスト順(最新が上に)
  リクエストを行った時刻が新しいほど上に表示されます。直前にアクセスしたコンテンツに興味がある場合に便利です。
 ・URL文字列順
  URLでソートして表示します。探したいURLが分かっている場合に便利です。
・全ログ削除
「基本/ログ」「フィルタ/ログ」「リダイレクト/ログ」のログを削除します。
・Menuボタン-設定出力
現在の設定をXMLとして表示します。コピペしてどこかに保存しておくことで現在のFilterProxyの設定をバックアップすることができます。
・Menuボタン-拒否リスト出力
現在の拒否リストをテキストとして表示します。行頭が"#"になっている行はコメント行です。無効にしているパターンはコメントとして出力します。拒否リストだけを共有する場合には、こちらの方が便利だと思います。
・Menuボタン-設定読込
「設定出力」および「拒否リスト出力」で出力した設定を読み込みます。「拒否リスト出力」で出力したものでなくても空白文字(スペース、タブ、改行)で区切られたものであれば拒否パターンとして受け入れます。(ただしあまりに短いパターンは登録後に意図しないアクセス拒否が発生する可能性が高いため、4文字以下のパターンは登録できないようになっています)「追加」は既に登録されていない項目だけ読み込むのに対し、「上書」は読み込んだもので現在の設定を置き換えます。


<[基本/ログ]タブ>


FilterProxyでアクセスしたURLのログが表示されます。
ログは1行が1レスポンスになっていて以下のようなフォーマットになっています。
・[NNNms]URL([StatusCode]{付加情報})
・"[NNNms]"
  サーバにリクエストを送ってからブラウザにレスポンスを渡し終わるまでにかかった時間をミリ秒で示します
 ・"URL"
  アクセスしたURLを示します
 ・"[StatusCode]"
  サーバからのレスポンスコードを示します(200とか301とか)
 ・{付加情報}
  ・StatusCodeが200の場合
   "{受信サイズ}/{コンテンツサイズ}"になります。{コンテンツサイズ}が"NA"となっているのはchunkedレスポンスで事前にコンテンツサイズが分かっていないことを示します
  ・リダイレクトの場合
   リダイレクト先のURLになります
・「長押し」
長押しされたURLについて選択された処理を行います
 ・フィルタへ(短縮型)
  URLからパラメータを除去したものを[フィルタ/拒否リスト]タブに送ります
 ・フィルタへ
  URLを[フィルタ/拒否リスト]タブに送ります
 ・リダイレクトへ
  URLを[リダイレクタ/編集]タブに送ります
 ・ブラウザで表示
  URLをブラウザで表示します

<フィルタ>
ブラウザからのアクセスをコントロールします。自分に無用だと分かっているコンテンツのURLパターンを登録しておくことで、端末からの無駄な通信を抑制することができます。

<[フィルタ/拒否リスト]タブ>


ブロックしたいURLのパターンを設定します
・パターン入力
 パターンをテキストエディットに入力して「追加」ボタンでパターンリストに登録します。「消」ボタンを押すと記入途中のパターン文字列を全て削除します。
 パターンに含めるとこができる「特殊表現」としては以下のものが利用できます。
 ・"#"
  数値('0'-'9')1文字とマッチ("\d"として解釈)
 ・"?"
  任意の文字1文字とマッチ("."として解釈)
 ・"*"
  任意の文字、任意個とマッチ(".*"として解釈)
 (パターンを含まないフィルターは部分文字列探索(indexOf)で処理するため処理が少し早いです)

パターンのより詳細な説明
  • 特殊表現('#', "?", "*')を含まないパターン文字列の場合
アクセスしようとしているURLにパターン文字列が含まれる場合、そのURLへのアクセスを阻止します。
例)パターン文字列:'affiliate'
URL1:'http://www.test.co.jp/affiliate/id1234567890'
(この場合URL中にパターン文字列'affiliate'が含まれるのでアクセスを阻止します)
URL2:'http://www.test.co.jp/index.html'
(この場合URL中にパターン文字列'affiliate'が含まれないのでアクセスできます)
  • 特殊表現'#'を含むパターン文字列の場合
'#'は数字の0~9のいずれかにマッチします。
例1)パターン文字列:'IMG#.jpg'
URL中に'IMG0.jpg', 'IMG1.jpg', ..., 'IMG8.jpg', 'IMG9.jpg'が含まれるURLへのアクセスを阻止されます。
しかし'http://www.test.co.jp/IMG.jpg'の場合'IMG'の後に数字が来ていないのでこのURLはアクセスできます。

例2)パターン文字列:'IMG###.jpg'
URL中に'IMG000.jpg', 'IMG001.jpg', ..., 'IMG998
.jpg', 'IMG999.jgp'が含まれるURLへのアクセスを阻止します。
しかし'http://www.test.co.jp/img/IMG0a2.jpg'のように間に数字以外が含まれるような場合は'###'が示すように3つの連続した数値になっていないためこのURLはアクセスできます。

  • 特殊表現'?'を含む場合
'?'は任意の1文字のいずれかにマッチします。
例1)パターン文字列:'IMG_?.jpg'
'IMG_'と'.jpg'の間に何か1文字が挟まっているURLへのアクセスを阻止します。
'http://www.test.co.jp/img/IMG_l.jpg'はこのパターンにマッチするのでこのURLへのアクセスは阻止されます。
しかし'http://www.test.co.jp/img/IMG_00.jpg'は'IMG_'と'.jpg'の間に2文字('00')が挟まれているためこのパターンにはマッチせず、このURLにアクセスできます。
例2)パターン文字列:'IMG_???.jpg'
'IMG_'と'.jpg'の間に何か3文字が挟まっているURLへのアクセスを阻止します。
  • 特殊表現'*'を含む場合
'*'は任意長の任意文字とマッチします。任意長には長さ0も含まれます。
例)パターン文字列:'IMG_*.jpg'
'IMG_'と'.jpg'の間に何もないか、何か挟まっているURLへのアクセスを阻止します。
そのため'IMG_000.jpg', 'IMG_000abc.jpg', 'IMG_.jpg'(長さ0の文字:文字無し)のいずれにもマッチし、これらを含むURLへのアクセスを阻止します。
しかし'IMG_000.JPG'は末尾が'.jpg'になっていないため、このパターンにはマッチせず、このURLにアクセスできます。
応用例)パターン文字列:'IMG_?*.jpg'
パターン'?'と'*'の複合技。'?'が任意の1文字とマッチするため、'IMG_'と'.jpg'の間に最低1文字はなにかが挟まっていないとパターンにマッチしません。

・パターンリスト
登録されているパターンの一覧が表示されています。左端の数値はそのパターンにマッチしてURLを拒否した回数になっています。マッチ回数はFilterProxyを再起動したときにクリアされます。
 ・クリック
  パターンのOn/Offを切り替えます
 ・長押し
  長押した項目をパターンリストから削除します。削除した項目は、パターン入力に移動されます。そのため、間違って長押しした場合はすぐに「追加」ボタンを押すことで再登録することができます。
・Menuボタン-拒否時レスポンス選択
URLがフィルタで拒否された場合にブラウザに返すレスポンスコードを指定します
 ・204 No Content
  OperaMobileで403を返しているとレイアウトが崩れるので、そのような場合にはこちらを選択します
 ・403 Forbidden
  アクセスが拒否されたと言うことブラウザに返します。デフォルトはコレで通常は変更する必要はありません。
 ・404 Not Found
  取りあえず付けてみたけどあまり使うことは無いのではないだろうか。
 ・410 Gone
  要望があったので追加しました。

<[フィルタ/許可リスト]タブ>


拒否リストとは逆に許可したいURLのパターンを設定します。
拒否リストより許可リストの方が優先度が高いため、こちらに設定したパターンにマッチするURLは拒否リストの設定に関係なくアクセスされます。
・パターン
 パターンをテキストエディットに入力して「追加」ボタンでパターンリストに登録します。「消」ボタンを押すと記入途中のパターン文字列を全て削除します。
 パターンに含めることができる「特殊表現」は[フィルタ/拒否リスト]と同じです。
・Referer条件
 "Referer"リクエストヘッダがここで指定するパターンに合致した場合のみ、上記のパターンによる許可リスト処理を適用します。
 パターンに含めることができる「特殊表現」は[フィルタ/拒否リスト]と同じです。

"Referer"リクエストヘッダの説明
ブラウザでAというURLにアクセスしたとします。そのページにはBという画像が張り付けられています。このときブラウザがサーバにBをリクエストする際には"Referer: A"という"Referer"リクエストヘッダが付けられます。
同様にAというページにCへのリンクが張ってあり、このリンクをクリックした際にも"Referer: A"という"Referer"リクエストヘッダが付けられます。
つまり"Referer"リクエストヘッダにはそのリクエストがどのページに由来するものかを示すURLが設定されています。(ブックマークや直接URLを入力した場合には"Referer"リクエストヘッダは設定されません)
たとえば通常サイトを見ている場合は「~rakuten.co.jp/~」へのアクセスは拒否したいが、「~rakuten.co.jp~」というサイトを見ているときは「~rakuten.co.jp/~」へのアクセスを許可したいような場合があると思います。(つまり楽天以外のサイトを見ているときは広告画像がウザイので楽天へのアクセスを拒否したいが、楽天を見ているときはきちんと画像を表示して欲しいような場合)
このような場合には"Referer"リクエストヘッダの性質を利用して、以下のように設定することで実現可能です。
 ・[拒否パターン]rakuten.co.jp/?
 ・[許可パターン]rakuten.co.jp/
 ・[Referer条件]rakuten.co.jp/
ポイントは2点。一つ目は拒否パターンは"rakuten.co.jp/?"というように末尾に"?"を付けて、"rakuten.co.jp/"へのアクセスだけは許可するようにすること。
もう一点は楽天にアクセスする際には"rakuten.co.jp/"にアクセスする事です。初回アクセス時には"Referer"リクエストヘッダはつかないので許可リストは適用されないことに注意して下さい。

<[フィルタ/ログ]タブ>

フィルタによってアクセスを拒否されたURLが表示されています。緑色は適用されたルールを示しています。
・「長押し」
長押しされたURLについて選択された処理を行います
 ・ブラウザで表示
  URLをブラウザで表示します。このとき15秒ほどFilterProxyがBYPASS状態になることで、通常フィルターによって拒否されるURLにアクセスできるようにしています。

<リダイレクト>

WEBサイトによってはリダイレクトを利用してアクセスカウンタを実現している物があります。しかし、これにも無駄な通信が発生するので最終的な飛び先が分かっているならリダイレクタにアクセスしたくありません。
リダイレクタURLと飛び先URLが分かっている場合にはその情報をルールとして登録しておくことで通信を発生させることなくリダイレクトを行わせることが可能です。(301リダイレクトとして処理します)
ただしここに登録してしまうとうまくページ遷移しないサイトも存在するかもしれません。その辺も考慮して上手に利用してください。

<[リダイレクト/リスト]タブ>


リダイレクトルールの一覧が表示されています。ルールは上から順に評価され最初に条件に合致したルールが適用されます。
・クリック
ルールのOn/Offを切り替えます
・長押し
長押した項目をルールリストから削除します。削除した項目は、[リダイレクト-編集]タブに移動されます。そのため、間違って長押しした場合はすぐに「追加」ボタンを押すことで再登録することができます。

<[リダイレクト/編集]タブ>


リダイレクトルールを設定します。
リダイレクトルールはそれを適用する「条件」とURLを書き換える「上書きパターン」によって構成されています。
・「説明」
省略可。動作には影響しません。ルールの説明を記述します。サイト名などを入れておくと[リダイレクト-リスト]タブで見たときにわかりやすいかもしれません。
・「条件」
リダイレクトルールを適用する条件を指定します。
Host,Dir,File,Paramのうち少なくとも一つは条件を指定してください。
ブラウザからのリクエストURLはFilterProxy内で
 http://{host}{dir}{file}?{パラメータ群}
というように分解されます。たとえば
 "http://www.host.com/pages/index.cgi?name1=val1&name2=val2"
というURLの場合は
 ・{host} : www.host.com
 ・{dir} : /pages/ (先頭と末尾が'/'になっています)
 ・{file} : index.cgi
 ・{パラメータ群} : name1=val1&name2=val2
というように分解されます。
条件として設定したHost,Dir,Fileはそれぞれ{host},{dir},{file}と完全一致で比較されます。Paramに関しては左がパラメータの名前、右がパラメータの値となっていて以下のように比較されます。
 ・パラメータの名前のみを指定した場合
  {パラメータ群}の中に"{パラメータの名前}="もしくは"{パラメータの名前}"という表現が存在すればマッチします
 ・パラメータの名前と値の両方を指定した場合
  {パラメータ群}の中に"{パラメータの名前}={パラメータの値}"という表現が存在すればマッチします
指定していない部分は対象と無条件にマッチすると考えます。
・「上書きパターン」
「条件」にマッチした場合にどのURLにリダイレクトするのかを指定します。
パターン中には"$(host)", "$(dir:N)", "$(dir2:M,N)", "$(file)", "$(file:s)", "$(file:e)", "$(p)", "$(pe:xxx[,yyy[,...]])", "$(pv:xxx)", "$(through)"という特殊表現が利用できます。
 ・$(host)
  リクエストURLの{host}に置き換わります
 ・$(dir:N) [非推奨]
  リクエストURLの{dir}を加工した'/'で始まり'/'で終わる文字列に置き換わります。Nは0以上の数値です。
  Nに1以上の数値を指定した場合{dir}のパスがその分だけ短くなります。
  たとえば{dir}="/1/2/3/4/"だった場合、$(dir:0)は"/1/2/3/4/"、$(dir:1)は"/1/2/3/"となります。
    現在は$(dir2:M,N)で代替可能なので$(dir:N)は非推奨としています。直接入力すれば動作しますが、サポート用のボタンは用意していません。
 ・$(dir2:M,N)
    リクエストURLの{dir}を加工した'/'で始まり'/'で終わる文字列に置き換わります。{dir}部のうち利用する部分をMとNとで範囲指定します。
    Mが開始位置(含む)を指定し、Nで終了位置(含む)を示します。M,Nには0, 正の整数と負の整数を指定することができます。
    0は{dir}部の先頭を示し、1以上の場合はより右の部分を示します。負の値である-1は{dir}部の最後の部分を示し、-2以下の場合はより左の部分を示します。
    Mが省略された場合は0が指定されているものとし、Nが省略されていた場合は-1が指定されているものとして動作します。
    例)
    {dir}="/0/1/2/3/4/"だった場合
    ・$(dir2:0,) → "/0/1/2/3/4/"
    ・$(dir2:0,0) → "/0/" (M,N共に'含む'なので、開始と終了が同じなのは問題ありません)
    ・$(dir2:2,) → "/2/3/4/"
    ・$(dir2:,-1) → "/0/1/2/3/4/" (Mが省略された場合は0が指定されているものとして動作する)
    ・$(dir2:1,-2) → "/1/2/3/"
    ・$(dir2:5,) → "/" (開始位置が{dir}の範囲を超えた場合は"/"になります)
    ・$(dir2:-2,) → "/3/4/" (開始位置に負の整数を指定することもできます)
    ・$(dir2:1,-5) → "/" (結果として開始位置と終了位置が逆転するような場合は"/"になります)
 ・$(file)
  リクエストURLの{file}に置き換わります
 ・$(file:s)
  リクエストURLの{file}の幹部分(正確には一つ目の「.」の前の部分)に置き換わります
  (s:stem)
 ・$(file:e)
  リクエストURLの{file}の拡張子部分(正確には一つ目の「.」より後の部分)に置き換わります
  (e:extension)
 ・$(p)
  リクエストURLの{パラメータ群}に置き換わります
 ・$(pe:xxx[,yyy[,...]]) 
  リクエストURLの{パラメータ群}を加工した物に置き換わります。
  具体的には{パラメータ群}からxxx(とyyyと...)のパラメータを除去した物になります。
  たとえば{パラメータ群}="name1=val1&name2=val2&name3=val3&name4=val4"の場合$(pe:name1,name3)は"name2=val2&name4=val4"となります。
  (pe = Parameter Except)
 ・$(pv:xxx)
  リクエストURLの{パラメータ群}中にある、xxxというパラメータの「値」に置き換わります。
  名前xxxが{パラメータ群}中に見付からない場合は""(空文字)に置き換わります。
  たとえば{パラメータ群}="name1=val1&name2=val2"の場合$(pv:name1)は"val1"となります。
  (pv = Parameter Value)
 ・$(through)
  これは他の特殊表現とは根本的に動作が異なります。上書きパターンにこの特殊表現が含まれている場合は、そのURLに対してはリダイレクトが行われなくなります。
上記のように特殊表現が適用されるので、パターン"http://$(host)$(dir2:0,)$(file)?$(p)"はほぼ元のリクエストURLと同じ結果になります。(リクエストURLにパラメータがない場合、余計に'?'がついてしまうので「ほぼ」です)
 ・各種ボタン
  パターンを入力するのが便利なように各種ボタンを用意しています。
  "$(dir)", "$(pe)", "キー", "$(pv)"には左に対応するテキストエディットがあり、ここに値を入れてボタンを押すことでそれぞれ"($dir:XX)", "$(pe:XX)", "XX", "$(pv:XX)"が入力されます。("XX"が入力されている場合)

<[リダイレクト/ログ]タブ>

リダイレクトルールによってリダイレクトが行われたURLが表示されます。

<ヘッダ>

HTTP Request Headerを書き換える場合に利用します。HTTPの仕組みが分かる人だけ利用して下さい。
・名前
 書き換えるHTTP Request Header名を指定します。「消」を押すと入力中の文字が全て削除されます。
・値
書き換え後の値を指定します。値を設定したいのではなく「名前」で指定したHTTP Request Headerを送信したくない場合は「削」のボタンを押してください。"(REMOVE)"が設定されます。("(REMOVE)"が値として設定されているとそのHTTP Request Headerはリクエストから削除されます)
・条件
HTTP Request Headerを書き換える条件を指定します。リクエストしているURLが条件にマッチしたときに、ヘッダの書き換えが行われます。条件には特殊表現('#', "?", "*')を利用することができます。
・説明
省略可。動作には影響しません。「名前」と「値」だけだと何のためのフィルターか分からなくなるかもしれないので、そういう場合はここに説明を記述しておきます。
・'名前'を正規化しない
チェックを付けると'名前'を正規化せずに利用します。
通常'名前'は"User-Agent"のように'-'で区切られた英単語の先頭文字を大文字にする形で正規化されます。ブラウザから送られてくるヘッダも内部的に一旦正規化して'名前'と比較を行っているので、ブラウザのヘッダを置き換えるなら正規化した'名前'を指定する必要があります。そして正規化した'名前'でサーバにヘッダが送信されます。しかし正規化していない'名前'のヘッダを送信したいような特殊な場合にはこのチェックを付けることで、正規化されていないヘッダを送信することができます。
・フィルターリスト
 ・クリック 
  フィルターのOn/Offを切り替えます
 ・長押し
  フィルターリストから長押し項目を削除すると当時に、フィルターにその文字列を移動します。間違って長押した場合、すぐに「追加」を押せば再登録することができます。

<免責>
このアプリを利用して発生したいかなる問題にも作者は責任を負いません。自己責任のもと利用してください。

<注意>
  • このアプリは「アプリ」に表示される広告を非表示にするアプリではありません。あくまでも、ブラウザからのアクセスを操作するアプリです。
  • 問題があったらアンインストールで対処してください。その際にはアクセスポイントのプロキシ設定を元に戻すのを忘れないようにして下さい。
  • メモリ不足が発生した際にこのアプリが停止されるとブラウザが動作しなくなってしまいます。それだと困るのでタイマーで定期的にServiceを起動し直しています。ご了承ください。
  • FilterProxyはHTTPS通信をスルーします。つまりHTTPSに対しては各種機能は適用されません。
<動作確認>
XperiaArc 2.3.4
<動作確認ブラウザ>
標準のブラウザ, AngelBrowser

<KDDI端末>
デフォルトではプロキシの設定ができません。
(詳しくはhttp://www.xperia-index.com/xperia/2708.htmの「APN概念が有るか無いか」をご確認下さい)
そのため標準のブラウザでFilterProxyを利用することができないのですが、ブラウザアプリの中にはアプリケーションとしてプロキシが設定できるものがあります。(AngelBrowser, Opera Mobile等)
このようなブラウザを導入することでFilterProxyを使うことができるかもしれません。お試し下さい。

Comments