【Java】JsoupのWhitelistは使わないほうがいい

前任者が残したコードが土壇場になって牙を剝いた。

Jsoupとは

Jsoupは、あいまいなHTMLでも確実に構文木にパースしてくれる高性能ライブラリ。

例えば<b>とだけ書いても、<html><head></head><body><b></b></body></html>まで補完してくれる。 あまつさえ、jQueryではないが、getElementByTagなどといったJavaScriptでおなじみのAPIみたいなものが使える。

Whitelistの罠

JsoupにはWhitelistクラスというフィルタールールみたいなものがあるが、結構罠を踏んだ。

  1. 単純なルールしか無理。「○○属性は必須だけど××は任意、その他全部禁止」とかできない。
  2. 致命的なのが、<html><body><head>は無条件でホワイトリストを通過すること。(任意の付きでも通過。XSSじゃん!)

2に関しては何か抜け道があると信じたいが、JsoupクラスのAPI見る限り期待できなさそう。 そもそも、厳格なルール付けには適していなさそう。

セキュアな実装をするならば、また他のHTMLパーサを探すか上記3タグについてメタいことをしたWhitelistを実装するしかない結論に至った所で帰った。