2009/11/24(火)【対策編】iモード専用サイトのhtmlソースの閲覧方法

iモード専用サイトのhtmlソースの閲覧方法 (mpw.jp管理人のBlog)
という記事が出ていいました。
iモードブラウザ2.0のJavaScriptを調査・研究する過程で、iモード専用サイトのhtmlソースを閲覧する方法を発見しました。
(中略)
今回発見した方法は、iモードブラウザ2.0のJavaScriptのクロスドメイン通信制限が、ホスト名ベースであることを利用して、クロスドメイン通信制限を突破しています。
なお、iモードアプリやiモードFlashでも同様なことが可能であると思います。
iモード専用サイトのhtmlソースの閲覧方法
という話なんですが、なるほどねぇ。という感じです。

ただ、この攻撃に対してであれば、それを防止することはそれほど難しくありません。

Apache httpdを使っている場合、.htaccessに以下の記述を追加しましょう。
もちろんhttpd.confに書いても良いです。(むしろそちら推奨)
※"www.example.jp"は自分の運用しているサーバ名
RewriteEngine On
RewriteCond %{HTTP_HOST} !="" [NC]
RewriteCond %{HTTP_HOST} !=www.example.jp [NC]
RewriteRule .* / [F]
(この設定の意味は「続きを読む」以降で)



これは何をしているかというと、HTTPリクエストヘッダ中のHost:というパラメータ(HTTP_HOST)を見て、そこが自分が本来運用しているホスト名であるかどうかを確認するというものです。もし、自分が運用しているホスト名以外でアクセスされた場合は、403 FORBIDDENを返し、コンテンツにアクセスさせません。

Host:はブラウザがサーバにリクエストを送るときに、どのホスト名のサーバに対してリクエストを送っているかを指定するヘッダです。これは一つのIPアドレスで複数のバーチャルサーバを運用する場合(Apache httpd的にはNameVirtualHost)に使用されます。
HTTP/1.1で必須規定されたヘッダですが、Netscape2とかIE2の時代から普及しているので現在出回っているブラウザでこれを送ってこないものはありません。iモードブラウザ2.0も必ずこのパラメータを送ってきます。

このパラメータを確認するようにすれば、元の記事のように無理矢理別のホスト名を割り当ててアクセスしようとしても、それを拒否することが出来るようになります。

ちなみに、問題のiモードブラウザ2.0では必ずHost:を送ってきますが、パソコンを使って手動でHTTP通信をまねる場合、Host:を意図的に送信しないことも可能です。上記の例では、もしHost:が存在しない場合はアクセスを許可するようにしています。(Rewrite_Condの一行目)これは後方互換性のために残している逃げ道ですが、今時Host:に対応していないブラウザなんてありませんので、削除してしまっても良いかもしれません。

また、意図的に一つのサイトを複数のホスト名で参照させている場合もあると思いますが、その場合はアクセスを許可するホスト名をすべて列挙しておかないと、正しいアクセスまで拒絶されてしまいます。

www.example.jp, exmple.jp, jp.example.comの三つのホストでのアクセスを許可している場合なら、(且つ、Host:なしを許容しない場合)、以下のように書けばよいでしょう。
RewriteEngine On
RewriteCond %{HTTP_HOST} !=www.example.jp [NC]
RewriteCond %{HTTP_HOST} !=example.jp [NC]
RewriteCond %{HTTP_HOST} !=jp.example.com [NC]
RewriteRule .* / [F]

さて、最後にお約束のように書いておきますが、個々に書かれていることは鵜呑みにしてはいけません。この手の安全性を担保するための設定をするときは、何を許可して、何を拒否するべきなのかを自分で考えた後、その設定が意味するのがどういう事なのかを考えてから設定しなければなりません。

うっかりコピペして穴ぼろぼろだったり、必要なアクセスを間違えて拒否してしまったりしても責任取れませんよ?


久しぶりにmod_rewrite書いたなぁ。もうかなり忘れてるよ。