DeXSSを試した

DeXSSはJavaのアンチXSSライブラリです。掲示板やWebメールなどのアプリで、HTMLタグを許容しながら、JavaScriptを除去したい場面で使用します。

XSS攻撃対策用のライブラリ - DeXSS 1.0登場 | エンタープライズ | マイコミジャーナル
DeXSS -- Java program for removing JavaScript from HTML(DeXSS開発者のページ)

ちょっと触ってみました。

概要

以下のようなシンプルな処理をします。

・TagSoupでParse
正規表現でHTML要素/属性をフィルタ

プログラムは実質数百行程度しかありません。

問題点

ソースを見たり、実際に使ってみると多くの欠陥が目に付きます。

ブラックリスト

まず最大の問題は、ホワイトリスト方式ではないことです。要素/属性名/属性値は、定義された正規表現ブラックリスト)でフィルタされます。

実際に、style属性値のチェックが甘く、簡単にXSSできてしまいます。

出力されるHTMLが汚い

TagSoupのせいなのか、出力されるHTMLが汚いです。

■入力
<p>日本語</p>
<br foo="bar">

■出力
<p xmlns="http://www.w3.org/1999/xhtml">&#26085;&#26412;&#35486;</p>
<br foo="bar" xmlns="http://www.w3.org/1999/xhtml"></br>

気になるのは、以下のようなところです。

・変な属性(br要素のfoo属性)が削除されない
・もれなくxmlns属性が追加されてしまう
・空要素(br)の表現がよろしくない
・非ASCII領域の文字が文字参照化される

設定ができない

どのようなHTML要素/属性を許可するなどは、ハードコードされています*1。変更するには、プログラムに手を入れなければなりません。

まとめ

現状では使えないと思います。現状はバージョン1.00がリリースされたばかりなので、今後に期待!と言いたい所ですが、根本的にアプローチを変える=全面的にプログラムを書き換える必要があると思いました。

誰かPHPの「HTML Purifier」をJava化してくれればよいのですが。

HTML Purifier - Filter your HTML the standards-compliant way!
T.Teradaの日記 - HTML Purifierを試した(2007/01/05)

*1:ソースのコメントには ToDo: Should be made more configurable などと書かれています。