HTMLタグを許可するWebアプリケーションでの検査

イベントハンドラ等でのスクリプトを禁止するために、"javascript" や "vbscript" のような、ブラックリストに合致する文字列が含まれているかどうかを検査する方法では、XSS は防げません。
例えば

<div onclick="javascript:alert('xss')">aa</div>

という典型的な XSS パターンに対し、"javascript" という文字列を禁止文字列として検査対象にしている場合、以下のような入力を与えることで検査を回避し、スクリプトを動作させることができます(IE6およびFirefox 1.5で確認)。

<div onclick="alert('xss')">aa</div>
<div onclick="http:alert('xss')">aa</div>
<div onclick="http:/**/alert('xss')">aa</div>
<div onclick="http:alert&#x28;&#x27;xss&#x27;&#x29;">aa</div>
<div onclick="http:alert&#x28&#x27&#x78&#x73&#x73&#x27&#x29">aa</div>

また、"onclick"をはじめとする "onXXX" などの文字列を禁止文字列として検出することもやめたほうがいいでしょう。タグごとに利用可能な属性のみ許可し、それ以外は禁止するホワイトリスト方式としましょう。