岩月と申します。
不具合ではなくて失敗談なのですが、よろしくおねがいします。
私はよく以下のようにしてHTTPサーバを用意することがあります。
require "webrick"
options = {
:BindAddress => "0.0.0.0",
:Port => 10080,
:DocumentRoot => "/data/wiki/docroot",
# その他諸々...
}
s = WEBrick::HTTPServer.new(options)
# (中略)
s.start
先日まで気付きませんでしたが、上記コードではデフォルトでユーザディレクトリ(/~user/public_html)以下のファイルが参照出来て、かつユーザディレクトリ以下のCGIも起動可能となります。しかもそのディレクトリをApacheなどと共有していた場合には.htaccessによるユーザ認証を回避した状態でCGIを起動出来ます。これにしばらく気付かなかったため自宅のCGIの一部はユーザ認証制御せずにCGIを起動出来る状態でした。例えば
http://moonrock.jp/~don/foo.cgi を
http://moonrock.jp:10080/~don/foo.cgi とすることで認証を回避出来ました。
これはHTTPServer.newのオプションに :DocumentRoot を与えると、自動的に / に FileHandler が
mountされることから始まって、FileHandler#serviceでユーザディレクトリの参照が可能となります。加えてwebrick.rbを読み込むとCGIHandlerが登録され、ユーザディレクトリ以下のCGIが起動可能となります。
対処方法は、HTTPServer.newのオプションに :DocumentRootOptions => {:UserDir =>
nil}を与える、またはWEBrick::Config::FileHandler[:UserDir]に nil
を与えることでユーザディレクトリへのアクセスを禁止出来ます。しかしこれがなかなか想像しづらく、コードの流れを追っていってようやく理解出来ました。かつ毎回上記を明示しないと回避出来ないというのもやや納得いきません。これは私がユーザディレクトリ以下の参照機能を付加要素(デフォルトでは必要ない)と思っているからかもしれません。またwebrick.rbをrequireするだけでCGIHandlerが有効になることにもあとになって気付きましたので、CGIに関しても同様(デフォルトでは不要)と考えています。
で、ここまでなら単に私が失敗したよという愚痴話で済みそう(?)なのですが、Railsに含まれるWEBrickによるHTTPサーバでも同様の問題があったためにちょっと心配になってきてしまい、こちらに投稿しました。ほかにも気付いていないだけでそのようなサーバがいくつもあるかもしれません。
できましたらこの件について皆さんになにかコメントをいただけないでしょうか。私は今回の件をWEBrickの不具合とは思っていませんが、何らかの形でもうすこし安心して使えたらなあとは思っています。
以上です。よろしくお願いします。長文乱筆失礼しました。
# なんとなく「そんなことは既知(もしくは当たり前)なんだから自己責任だろう」と言われるような気もしてます。
--
IWATSUKI Hiroyuki <URL:mailto:don@na.rim.or.jp>