さて、最初に2番目の質問:
大文字と小文字の区別がこのようなセキュリティリスクであるのはなぜですか?
大文字と小文字の区別は、それ自体がセキュリティリスクではありません。他の回答のコメントによると、問題は、特定の名前/ケースを持つディレクトリWEB-INF
(特に、機密コードまたは構成ファイルを含む可能性がある)のセキュリティ制約をバイパスする可能性があることであるように見えます。
domain.com/WEB-INFにアクセスしようとすると、Tomcatはそれをブロックしますが、domain.com / Web-Infは異なるものとして扱い、ブロックしない可能性があります(これが当てはまるかどうかを実際にテストしていません)。 。
ただし、これは実際には問題ではありません。RailoではWebルート内にWEB-INFディレクトリが必要ないためです。別の場所を指すようにRailoを構成でき、それがWebルート外の場合は問題が解消されます。
(免責事項:これは入手可能な情報に基づいています。これ以上のものがある可能性がありますが、公的にアクセス可能なWebサイトに対してセキュリティスキャン/侵入テストを実行するのはユーザーの責任です。)
大文字と小文字の区別の問題を解決するにはどうすればよいですか?
ここにはいくつかのオプションがあります...
Jettyなど、Tomcatの代わりに別のサーブレットエンジンを検討してください。
JettyにもTomcatの場合と同じことが当てはまりますが、Jettyのaliases
オプション(in {jetty}/etc/webdefault.xml
)は非推奨ではなく(Tomcatの大文字と小文字を区別するスイッチのように)、簡単なテストでは、web-inf
問題のないすべての大文字と小文字のバリエーションへのアクセスをブロックしているようです。
使用が許容される同様のオプションを持つ他のサーブレットエンジンが存在する可能性があります(例:Resin
RailoをTomcatで使用する場合は、Webサーバーを削除する必要はありません。
TomcatのCoyoteWebサーバーを使用することはできますが、必須ではありません。たとえば、Apache httpd、Nginx、またはIIS7を前面に配置すると、柔軟性が向上します。具体的には、静的リソースで大文字と小文字を区別しないようにすることができます。
これは、提供する例が画像ファイルであるため、サーブレットエンジンやRailoに移動する必要がないためです。問題となるのが静的ファイルのみの場合(すべてのリクエストがindex.cfmを通過する場合は完全に可能です)。大文字と小文字を区別しないようにWebサーバーを構成するだけで、Tomcat/Railoを使用せずにこれを解決する簡単な方法です。
一貫したケースを使用するようにファイルを修正し、URLの書き換えを使用してリクエストをリダイレクトします。
たとえば、404エラーをログに記録しながらサイトをスパイダーします。これにより、ケースの不一致のリストが表示されます。
これができたら、これらすべてのファイルの名前を小文字に変更する簡単なスクリプトを作成し、一連の書き換えルールを生成して、要求されたファイルが小文字のバリアントにリダイレクトされるようにします。
たとえば、mod_rewrite構文を使用します。
# If file exists, don't rewrite it (and stop processing further rules)
RewriteCond ${REQUEST_URI} !f
RewriteRule .* - [L]
# Requested file doesn't exist, so redirect to lowercase version
RewriteRule (?i)img/employee/greg.jpg img/employee/greg.jpg [L,R=301]
RewriteRule (?i)img/employee/bert.jpg img/employee/bert.jpg [L,R=301]
RewriteRule (?i)whatever.else whatever.else [L,R=301]
最初のルールは、存在するファイルが不必要にチェックされないことを保証し(Lフラグはそれ以上のリダイレクトの検索を停止することを示します)、(?i)は大文字と小文字を区別しない一致を実行し、正しいファイルへの301リダイレクトを実行します。
これにより当面の問題が解決され、時間の経過とともにコードを徐々に更新して、リダイレクトが不要になるまで一貫したケースを使用できます。
の書き換え構文は、Webサーバーに使用するものによって異なります。すべてのオプションがありますが、一部は他の構文よりも成熟して統合されています。