$Id: readme,v 1.8.2.20 2001/05/11 22:44:32 marcsaeg Exp $ リリースノート: ======================= TOMCAT バージョン 3.2.2 ======================= 0. 目次: 1. はじめに 2. Tomact のインストールと実行 3. Tomcat を使用したアプリケーションの開発 4. Tomcat: 過去、現在、そして未来 5. このリリースの新機能 6. 既知のバグと問題点 7. アップデートでの修正と追加 ============================================================================= 1. はじめに Tomcat は、Servletコンテナと JavaServer Pages(tm)の実装の一つです。単独で動作 させたり、以下のような有名な Web サーバと一緒に動作させること ができます。 - Apache, バージョン 1.3 以降 - Microsoft Internet Information Server, バージョン 4.0 以降 - Microsoft Personal Web Server, バージョン 4.0 以降 - Netscape Enterprise Server, バージョン 3.0 以降 使用許諾契約書(トップディレクトリにある LICENSE ファイルです)を読んでくださ い 。これはこのリリースに含まれるすべてのソフトウェアに適用されます。 Tomcat 3.2.2 はバグ修正リリースです。このリリースでは新しい機能は追加されてい ません。バージョン 3.2.2 で修正される既知のバグは 7.1 章に書かれています。 ============================================================================= 2. Tomcat のインストールと実行 Tomcat には、JRE 1.1 以降に準拠している Java Runtime Environment が必要です。 これには Java2 プラットフォームシステムも含まれます。アプリケーションを開発し ようとする場合には、Java Development Kit 1.1 以降の環境に含まれるような Java コンパイラが必要です。これには Java2 に準拠した JDK も含まれます。 Tomcat のインストールと実行についての詳しい情報は、Tomcat の配布物を解凍した ディレクトリの下にある "doc/uguide/tomcat_ug.html" をブラウザでご覧ください。 (訳注: 日本語版は、"doc-jp/uguide/tomcat_ug.html"です。) ============================================================================= 3. Tomcat を使用したアプリケーションの開発 Tomcat を使用したServletや JSP ベースのアプリケーションを開発する際の補足情報 は、アプリケーション開発者用のガイドに記されています。Tomcat の配布物を解凍し たディレクトリの下にある "doc/appdev/index.html" をブラウザでご覧ください。 (訳注: 日本語版は、"doc-ja/appdev/index.html"です。) ============================================================================= 4. TOMCAT: 過去、現在、そして未来 - バージョン 3.0 (1999年12月リリース)が Tomcat の最初のリリースでした。Java ServletとJSPの仕様の実装に加え、最小限の Apache コネクタを持っていました。 - Tomcat 3.1 (2000年4月リリース) で、Apache との接続を改善し、Netscape と IIS Webサーバのコネクタをサポートしました。また、WAR ファイルのサポート、 Servletの自動再読込、そして JSP ページを事前にコンパイルしておくためのコ マンドラインツール(jspc)を追加しました。最後に、バージョン 3.1では、コード の再構成にも焦点を当てています。(モジュール化、クリーンアップ、コード構成の 見直し、使用されていないコードの削除、J2EE仕様のコードの分離) - Tomcat 3.2 は、まずパフォーマンスのチューンアップをおこないましたが、他にも いくつかの新しい機能を追加されました。 - Tomcat 3.2.1 はセキュリティのための更新でした。詳細は 7.3章を見てください。 - Tomcat 3.2.2 はバグフィックスリリースです。7.1章にこのバージョンで修正され た問題点が述べられています。 - Tomcat 4.0 は、Tomcat 3.xとは独立して開発しています。Catalina アーキテクチ ャに基づいており、Tomcat 3.x のアーキテクチャとはかなり違っています。さら に、Tomcat 4.0 は Servlet 2.3 と JSP 1.2 仕様のリファレンス実装を目指して います。 ============================================================================= 5. このリリースでの新機能 5.1 Docbase とファイルベースのローカライゼーション Tomcat 3.2.2 は、自動的にクライアントとサーバのロケールに基づいて、要求をロー カライズされたリソースへマッピングする手段をサポートします。ローカライズされ たコンテントは一つのロケールにつき一つのディレクトリを使用する(Docbase)、また は、ロケールを特定するファイル名を付けて一つのディレクトリに入れる(ファイルベ ース)ことにより構成されます。 この機能の詳しい説明は doc/tomcat-localization-how.html にあります。 ============================================================================= 6. 既知のバグと問題点 6.1 Windows 環境下での Document Root としての絶対パスの使用 TOMCAT_HOME/conf/server.xml ファイル内で、docBase 属性に相対パス名か絶対パス 名を宣言することができます。Windows システムで絶対パス名を使用したい場合に は、このプラットフォームでの Java の絶対パス名の定義に従って、ドライブ文字 を含めなければなりません。 良い例: c:\mydirectory\mydocbase 良い例: c:/mydirectory/mydocbase 悪い例: \mydirectory\mydocbase 悪い例: /mydirectory/mydocbase Unix 環境下では、絶対パスはスラッシュ('/')文字で始まらなければなりません。 6.2 コンテナ管理によるセキュリティ Tomcat 3.2 は、Servlet API仕様書 バージョン2.2 の11章で述べているコンテナ管理 によるセキュリティを実装しています。この実装に関しては、以下の記述に目を通し てください。 - BASIC認証とフォームベースの認証は正常に動作するはずです。これに関するバグを 見つけたら に報告してください。 テストアプリケーションは下のURLで定義される保護領域を持っています。 http://localhost:8080/examples/jsp/security/protected これは $TOMCAT_HOME/conf/tomcat-users.xml で適切な権限を与えるように定 義されているユーザであれば、誰でもアクセスできます。デフォルトではフォー ムベースの認証が使われています。 しかし、試してみたいと思う人のために Basic認証の設定もコメントアウトした状態で書かれています。 警告: Basic 認証は、インターネットやその他の安全でないネットワーク間で 使用する一般的なセキュリティとしては適していません。なぜならば、リクエ スト毎にユーザ名とパスワードはエンコードされても暗号化されずに送信され るからです。 - DIGEST 認証や HTTPS クライアント認証(例. SSL)はこのリリースではサポー トされていません。 6.3 Welcome ファイルにおける RequestDispatcher.include() の使用 [Bug Report #160] 下記のやり方が間違った内容のレスポンスを生じさせます: - ドキュメントルート以下にサブディレクトリをつくっている。 (例 "subdir/"). - URL でこのサブディレクトリをリクエストした時に表示 するように設定した welcome ファイルが、このサブデ ィレクトリにある。(例 "index.html") - RequestDispatcher で "/subdir" もしくは "/subdir/" をリクエストし、その中で include() を呼びだす。 "/subdir" もしくは "/subdir/" を で指定した時も、同じ問 題が起こる可能性があります。 回避方法は、RequestDispatcher に "/subdir/index.html" のように、あなた が表示したいファイルの完全な相対コンテキストパスを記述することです。 6.4 Servletの自動リロード Tomcat 3.2 は、( WEB-INF/classes ディレクトリや WEB-INF/lib ディレクト リにある JAR ファイルからロードされた)Servletクラスに対してリクエスト が来た時に、そのクラスが変更されていた場合には、自動的にリロードを行う 機能を含んでいます。この機能は実験的なものであり、完全に機能しないかも 知れません。特にリクエストするServlet以外のクラスを変更しても、クラス をリロードしません。 --これらのクラスの変更を反映させるためには、 Tomcatを再起動する必要があります。 "conf/server.xml" ファイルの 要素に reloadable="true"の属性 を加えることで、リロードを有効にすることができます。ただし、自動リロー ド機能は製品版アプリケーションにはお勧めできないことに注意してください。 なぜならば、これは実験的なものであり、リクエストごとに必要なチェックを 実行するために余計なオーバーヘッドがかかるからです。 6.5 Windows 95/98 での "Out of environment space" エラーの防止 このエラーは、デフォルトの環境変数用の容量が Tomcat を実行するために不 十分な場合によく起こります。ここでは、それを防止するいくつかの方法をい くつか書いておきます。 A. Tomcatを実行するために、MS-DOSプロンプトを使っている場合は、プログ ラム -> MS-DOS プロンプトを実行してください。タイトルバーの左にあ る MS-DOS アイコンを右クリックして、メニューの一番下にあるプロパティ を選択してください。MS-DOS プロンプトのプロパティダイアログで、メ モリータブを選択します。"Initial environment:"フィールドの中に、十 分な大きい数字を入力します。よくわからない場合は、3072 くらいで十 分です。OK をクリックして MS-DOS プロンプトウィンドウを閉じてくだ さい。プログラム -> MS-DOS プロンプトを再び実行して、Tomcat をイン ストールしたディレクトリに移動してください。まだ設定していな い場合は、JAVA_HOME 環境変数を設定してください。これで、"Out of environment space" エラーなしに、"bin\startup" と "bin\shutdown" で、Tomcat の実行と停止ができるはずです。 B. startup.batのようなバッチファイルをダブルクリックすることでTomcat を実行したい場合は、Windows Explorer でお望みのバッチファイルを右 クリックしてからプロパティを選択して、MS-DOS プロンプトのプロパティ ダイアログを開いてください。メモリータブを選んで、"Initial environment:" を上で書いたように設定します。プログラムタブの "Close on exit" も選択したいかもしれません。その後に、OK をクリック してください。これらの設定がおこなわれたショートカットが同じディレ クトリに同じ名前のバッチファイルとして作られるでしょう。これで、 "Out of environment space" エラーなしに、ショートカットやバッチファ イルをダブルクリックすることができるはずです。startup.bat と shutdown.bat をこの方式で実行したい場合には、それぞれのファイルについ て上記の設定を行う必要があります。さらにJAVA_HOMEも設定する必要があり ます。これは、autoexec.bat か startup.bat と shudown.bat ファイル自身に、"SET JAVA_HOME=JDK のパス" を追加すれ ばできます。 6.6 すべてのOS上でURLの大文字・小文字を区別するようになりました。 Tomcat 3.2 から、すべてのOS上でURLの大文字・小文字を区別するようになり ました。これは、大文字・小文字を区別しないファイルシステムを使っている WindowsなどのOSを含んでいます。 "non-portable"なWebアプリケーション、つまり大文字・小文字が一致してい ないアプリケーションは、大文字・小文字を区別しないOS上の Tomcat 3.1で は動作しますが、Tomcat 3.2では移植性に問題があることが明らかになるでしょ う。 これにより、一見正しく見えるURLが、実際には正しくないということが起こ り得ます。Windows Explorer では、MS-DOS 8.3フォーマットに従ったディレ クトリ名は、"フォーマットされた"名前を使用して表示されるかもしれません。 たとえば、"MYDIR"という名のディレクトリを、"Mydir"と表示するかもしれま せん。しかし、"http://localhost/mysite/Mydir/index.jsp" のようなURLで は、"File Not Found" を返すでしょう。なぜならば、正しいURLは "http://localhost/mysite/MYDIR/index.jsp" だからです。"not found"とな るような不思議なURLを見つけたら、大文字・小文字の間違いを確認してくだ さい。Windows Explorer のプロパティダイアログか、MS-DOS ウィンドウで、 ファイルとディレクトリ名の実際の大文字・小文字を確認してください。 IISのような大文字・小文字を区別しないWebサーバと組み合わせて、静的なコ ンテンツを提供するためTomcat を使用している場合には、さらに問題が起こ る可能性があります。Webサーバは、URLの大文字・小文字が間違っているよう な静的なページを提供することができます。しかし、その静的なページが Tomcat が提供するリソースへの相対リンクを含んでいる場合には、リンクを クリックした時に、Tomcatで大文字・小文字が間違っているために、リソース が見つからないというエラーが発生するでしょう。 6.7 生成されたWebコネクタ用の設定ファイル 起動時に、定義されたコンテクストを反映するために Tomcat は普通 "tomcat-apache.conf" のような設定ファイルを生成します。しかし、生成さ れたファイルは、Webアプリケーション配置記述ファイル(web.xml)内部のすべ ての設定を反映するわけではありません。Webサーバの設定ファイルの中に、 直接関連する設定をする必要があります。 これは Tomcat 3.2 のWebコネクタの設計の限界ですが、Tomcat 4.0では MOD_WARP コネクタを導入して対策する予定です。 6.8 フォームベースのログインの限界 で指定したページがセキュリティ制 限によって保護された領域にある場合には、Tomcat 3.2 はそれらを表示でき ません。この問題の影響としては、フォームベースのログインを使用している ときに、Webアプリケーションのすべてを保護するために "/*" というURLパター ンが使用できないことが挙げられます。 解決策としては、フォームログインページとエラーページをWebアプリケーショ ンのルートディレクトリに置き、他のすべてのページを、一つまたは複数のサ ブディレクトリ内に置き、そしてセキュリティ制限をサブディレクトリを保護 するように設定することです。 6.9 ドキュメントベースパスの限界 Tomcat 3.2 は、 ディレクティブ内では、以下のような SMB パスを サポートすることができません。 しかし、この方法はTomcat 3.1はサポートしていましたし、Tomcat 4.0もサポー トしています。回避方法は、"\\machine\share"にネットワークドライブを割 り当ててから、以下のようにコンテキストを定義することです。 "r:"が、shareを指すネットワークドライブです。 6.10 リソースパスが URL エスケープ列を含むことができない問題 javax.servlet.Context.getResource() と javax.servlet.Context.getResourceAsStream() に渡されるパスには %HH の形の URL エスケープ文字列を含むことができません。URLエスケープ文字列を含むパスに対して はnull が返されるでしょう。 6.11 AJP12 と SSL APJ12 プロトコルは安全なトランスポート(例 SSL)によるリクエストを判別する機構を 備えていません。Tomcat は 443 ポートに対するすべてのリクエストを安全なものとみ なし、URL スキームを HTTPS に設定します。他の全てのポートに対するリクエストは安 全でないものとみなし、URLスキーマを HTTP に設定するでしょう。AJP13 プロトコルに はこの問題はありません。 =============================================================================== 7. アップデートでの修正と追加 7.1 リリース 3.2.2 での修正と追加 この章はこのリリースで修正されたバグを明らかにします。これらに加えて、多くの マイナーなバグの修正が製品を通して行われました。 ドキュメント - How To ドキュメントとユーザーズガイドの更新。 Servlet - 要求されたURIにマッチするプレフィックスがなかった場合の無限ループの修正。 現在は 404 エラーを返します。 - 取り込まれたServlet内で UnavailableException を扱うようになりました。 - ユーザの原則が誤って保たれていました。 (#757) - セキュリティマネージャが使われているときに、forward() と include() に対 してアクセスコントロールを使用するようになりました。 - security-contraints の中の url-patterns を適正に解釈するようになりました。 (#567) - Interbase と Sybase ASE 11.9.2 における認証の修正。 - SSL を使用しているとき、reqest.getPort() が正しいポートを返すようになりま した。 (#743) - JSP のソースが公開される問題の修正。 (#619) - ServletRequest.getProtocol() は CRLF を含むかもしれなかった。 (#620) - psuedo-random number generator の初期化が改善され、セッションを生成する最 初のリクエストのレスポンスタイムが良くなりました。 - forward() を使用したセッショントラッキングの修正。 (#504) - getSession() がリクエストされたセッションIDを上書きしてしまう問題と、それ に関連したURL書き換え問題の修正。 (#160) - load-on-startup servler のロード失敗のエラーレポートの改善。 (#489) - 静的ファイル(例 .html)が、web.xml 内の タグの location として 使うことができるようになりました。 (#291) - Servletパスと path info 内のURLエンコードされたデータが適正にデコードされ るようになりました。 (#657) - HttpServletRequest.encodeURL() が、アンカーを含み、かつ、クエリーストリング を含まない URL を適正にエンコードするようになりました。(#1182) - バーチャルホスト環境でエラーページが動作するようになりました。 - ServletRequest.getRemoteHost() が(必要であれば)リモートホスト名を決定するた めに DNS ルックアップを行うようになりました。仕様で要求されているように、こ のルックアップが失敗した場合には、メソッドはリモートホストの IP アドレスを 返します。 Jasper - UTF-8 ではなく UTF8 を指定した時の UnsupportedEncodingException の修正。 - デバッグ情報付きのコンパイルのサポート。 - JSP ソースファイルが取り除かれた場合、生成されたファイルは取り除かれ、そ の後の要求は 404 エラーを返します。 (#698) - 同じ名前のタグの組が一つ以上あったときのコンパイルエラーの修正。 (#540) - include されるページが 8859-1 エンコーディングでない時のサポート。 - タグライブラリがないために起きるコンパイル失敗のエラーレポートの改善。 - ページの編集の失敗を引き起こすスレッド同期化問題の修正。 (#44) - デフォルトキャラクターエンコーディングの修正。デフォルトキャラクターセッ トは ISO-8859-1 になりました。 (#285) - jsp:plugin は正しく展開されていませんでした。 (#467) - jpsInit() メソッドが実行されている間、もしくは前に、その JSP ページの 本体が実行されてしまう可能性があるバグを修正しました。(#1280) コネクタ - 不正な content-length での ajp12 の無限ループの修正。 (#264) - Tomcat コネクタがコネクションを閉じた際の無限ループの修正。 (#510) - apj13 プロトコルは、マルチパートフォームエンコーディングとファイルアップ ロードのサポートが追加され、動作するようになりました。 - ロードバランサー内でクッキーからセッションIDを読むようになりました。 (#603) - クライアントからデータを受け取らなかった時に、HTTPコネクションはタイムア ウトするようになりました。 (#1006) IIS - 開始時失敗のエラー記録の改善。 NetWare - NetWare 5.1 で netbuf_getbytes() がサポートされていなかった問題の修正。 7.2 Tomcat 3.2.2 で解決されたセキュリティの脆弱性 7.2.1 プロトコルなしの HTTP 要求 プロトコルが指定されていない HTTP 要求に対して、JSP ファイルの処理されていない ソースが返されてしまうことがありました。たとえば GET /examples/jsp/num/numguess.jsp は numguess.jsp ファイルのソースを返していました。 7.2.2 Tomcat 3.2.2 ベータ3より前のリリースでは、URIコンポーネントを二度デコードするこ とを許可していました。この問題は JDK 1.3.0 以降を使っている時にのみ発生します。 二重デコード問題は以下のような URL を生成してしまいます。 http://localhost:8080/%252e%252e/%252e%252e/%00.jsp これはWebアプリケーションの外にあるディレクトリリストを晒してしまいます。同 じ二重デコード問題の他のバージョンでは、ウェブアプリケーションの外にあるファ イルの中身を見ることができてしまいます。 7.3 Tomcat 3.2.1 で解決されたセキュリティの脆弱性 7.3.1 /WEB-INF と /META-INF ディレクトリにあるリソースの保護 Servlet仕様は、 Webアプリケーションアーカイブの /WEB-INF と /META-INF ディレク トリにあるリソースを、Servletコンテナが直接クライアントに提供することを禁じて います。Tomcat 3.2 では、このことは次のような URLが、配備記述子ではなく、エラ ーページを返すことを意味していました。 http://localhost:8080/examples/WEB-INF/web.xml しかし、Tomcat 3.2には、以下のような URL をクライアントが要求した場合に、この 情報を表示する脆弱性が存在しました。 http://localhost:8080/examples//WEB-INF/web.xml ("WEB-INF" の前に、2重にスラッシュがあることに注意してください) この脆弱性は、 Tomcat 3.2.1で修正しました。 7.3.2 ソースコードを表示する脆弱性 Tomcat 3.2 と共に配布されていたサンプルアプリケーションには、JSP ページの例と してソースコードを表示するメカニズムが含まれていました。このメカニズムを、 WEB-INF と META-INF ディレクトリ内の重要な情報の表示の制限をすり抜けるため に使うことができました。この脆弱性は取り除きました。 [訳注: これは河内 崇が翻訳しました。日本語訳に対するコメントがあれば、 jajakarta-report@nekoyanagi.com に送ってください。]