【Java】JsoupのWhitelistは使わないほうがいい
前任者が残したコードが土壇場になって牙を剝いた。
Jsoupとは
Jsoupは、あいまいなHTMLでも確実に構文木にパースしてくれる高性能ライブラリ。
例えば<b>
とだけ書いても、<html><head></head><body><b></b></body></html>
まで補完してくれる。
あまつさえ、jQueryではないが、getElementByTagなどといったJavaScriptでおなじみのAPIみたいなものが使える。
Whitelistの罠
JsoupにはWhitelistクラスというフィルタールールみたいなものがあるが、結構罠を踏んだ。
- 単純なルールしか無理。「○○属性は必須だけど××は任意、その他全部禁止」とかできない。
- 致命的なのが、
<html>
、<body>
、<head>
は無条件でホワイトリストを通過すること。(任意の付きでも通過。XSSじゃん!)
2に関しては何か抜け道があると信じたいが、JsoupクラスのAPI見る限り期待できなさそう。 そもそも、厳格なルール付けには適していなさそう。
セキュアな実装をするならば、また他のHTMLパーサを探すか上記3タグについてメタいことをしたWhitelistを実装するしかない結論に至った所で帰った。