Servlet : 最近のサーブレット定義ではweb.xmlで外部参照ができなくなっています。

Servlet2とかの時代、web.xmlでは外部xml参照が可能であった。
こういう状況 → Google検索「webxml entity

これらは、昨今のセキュリティ事情に合わせて使用不可となっている。(2015年ぐらい以降)
参考 : https://bugzilla.redhat.com/show_bug.cgi?id=1069911

脆弱性としては XXE attack で、外部xmlを任意のファイルで成りすまして悪さをするというもの。
いわゆるDLLハイジャックと同じ考え方。

■ 以前はOKで、最近は読み込めなくなっている具体例

どういうコードがNGかというと、こんなタイプ↓
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app [
  <!ENTITY test0 SYSTEM "aaa/test0.xml">
  <!ENTITY test1 SYSTEM "aaa/test1.xml">
]>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <!-- サーブレット設定 -->
    &test0;
    &test1;

</web-app>

これは、xmlパース時にエラーとなる。
以下、エラーログ↓
org.apache.catalina.startup.ContextConfig parseWebXml
重大: アプリケーションのweb.xmlファイル jndi:/localhost/xxx/WEB-INF/web.xml の解析エラーです
java.io.FileNotFoundException: Could not resolve XML resource [null] with public ID [null], system ID [aaa/test0.xml] and base URI [jndi:/localhost/xxx/WEB-INF/web.xml] to a known, local entity.

■ 対応

読み込めなくなったxmlを何とかする方法。

1 : web-fragments.xml で対応する。

詳細はぜひググってくだされ →「webxml fragment

ただしこの機能は、複数のフレームワークやライブラリ、jarを流用する際の環境定義をお助けするためにある機能で、
当件のように自機能の肥大化解消には利点が少ない。

2 : 分割を諦めてweb.xml内にすべてを展開する。

いろいろ考えると、これが一番ラク。
恐らくこの話で悩むということは、システム更改でこの状況に立ち向かっていると思われる。
分割をいったん諦めるメリット/デメリットは以下。

  • 堅牢性 : 変わらない、もしくは少し向上する。同一ファイルとなるので。
  • 可読性 : 下がる。場合によっては数千行増えたりする。
  • 動作保証 : 新技術導入でないため再テスト等が不要。

■ 補記
対応2によってweb.xmlが凄い行数になるとやりづらいので、アノテーションでinit-paramを書き直して、
web.xml内の記述をなるべく減らして可読性を上げる等はやってもいいかも。

コメント

このブログの人気の投稿

windows10 で nvidia のグラボのcode43現象を解決した

Java : processbuilder 標準出力 タイムアウト

GTX560Ti がおかしい(code 43が出る)(2018年)→解決しました(2019)