1.初めに
脆弱性対策として、HTTPレスポンスのヘッダーに
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block
※各ヘッダーの意味と効果については割愛
を設定するのに、apacheやら.htaccessやらで設定するのが面倒(サーバーが複数台あると大変)ですし、サーバーを引っ越した時に設定を漏らすのも嫌だと思って、warの中に含めてしまう方法は無いかなと思って調べてみたらありましたのでご紹介します。
なお、本機能を使うには
Apache Tomcat 8.0.24以降
Apache Tomcat 7.0.63以降
が必要になりますのでご注意を。
2. web.xmlを設定する
WebContent/WEB-INF/web.xmlに以下の記述を追加するだけ。
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
アプリケーションサーバーを起動してアクセスしてみます。
レスポンスにきちんと追加されているのが確認できました(^^)/
3. 応用
なお、web.xmlに追加したfilterをカスタマイズすることでレスポンスヘッダーの内容をカスタマイズすることが出来ます。
■ 特定のヘッダーを無効にする
<init-param>~</init-param>
で有効無効が指定できます。
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>antiClickJackingEnabled</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
結果
クリックジャッキング対策の「X-Frame-Options:DENY」が消えました。
<param-name>
に設定する名前は以下URLを参考にすればなんとなく分かると思いますが、
https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/catalina/filters/HttpHeaderSecurityFilter.html
- antiClickJackingEnabled
→ X-Frame-Options:DENY - blockContentTypeSniffingEnabled
→ X-Content-Type-Options:nosniff - xssProtectionEnabled
→ X-XSS-Protection:1; mode=block
にそれぞれ対応するはずです(全部は試していない)。
■ ヘッダーのパラメータをカスタマイズする
例えば
X-Frame-Options:DENY
を
X-Frame-Options:SAMEORIGIN
に変えたいとき。
<init-param>~</init-param>
でオプションが指定できます。
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value>SAMEORIGIN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
結果
X-Frame-Options:SAMEORIGINが確認できました。
以上です。
<url-pattern>
を工夫すれば特定のURLや拡張子のみにフィルターをかけることも可能です。色々お試しください(^^)/