▼ XSS対策
■対外部ユーザー=アカウント非保持者
- コメント欄、TBなどのtag記号<, >, "はすべてエスケープ。
- USER_AGENT, DNS逆引きホスト名内のタグ文字などをエスケープ。
- PATH_INFOなどの文字列は、エスケープなしに(表示等に)使用しない。
- CSSXSS対策。「{」を「{」に置き換える。
■対内部ユーザー=アカウント保持者
*1 : :, :, :などは":"に戻してから処理します
■スタイルシートXSS対策
日記本文内の style="" 指定
- \, @記号および、0x00〜0x1fの制御コード、0x80〜0xffまでの文字コード(全角文字など)を除去
- /*, */, &#, script, java, exp, eval, cookie, includeといった文字列が完全になくなるまで除去*2
ユーザースタイルシート内
- TAB, LF以外の制御文字を除去する。
- コメントを最初に退避し、"*/"を"*/ "に置き換える。
- "〜"といった文字列(改行を含む)を退避し、文字列内から改行を除去*3、さらに日本語文字で終わる場合はスペースを付加する。(EBXSS対策)
- ", ', *, #を除く文字の、手前に付く\ 記号を除去する。
- 0x80〜0xffのコード(全角文字など)をすべて消去する。
- /*, */, &#, script, java, exp, eval, cookie, includeといった文字列が完全になくなるまで除去する。
- TAB や LF を間に挟んだ上記の記号列が1つでも存在する場合、TABやLFの手前にスペースを1つ追加する。
- url() が正しいかチェックする。相対リンクの場合は"./"を先頭に付加する。
- 文字列を復元する。
- コメントを復元する。
*2 : 正規表現で1回マッチングするだけ不完全。例えば"javascrscriptipt:"と書かれた文字列でXSSを起こせるので、参考にする方は注意
*3 : IEではCSS内において改行を含む文字列を許可するので、注意が必要です。Firefox等で許可されません(改行で文字列が終わったことになります)。
■参考文献
- はてなダイアリーXSS対策
- はてなブックマーク - CSRF
- はてなブックマーク - XSS
- はてなブックマーク - CSSXSS
- IE における "expression" の過剰検出による XSS の 誘因
- 通常とは異なる記述の javascript: プロトコルが実行される(microsoft) … TABの代わりにスペースや改行でも同様に解釈されるので注意。
■スクリプト側で対応不可能な既知のIE脆弱性
- TB-URL http://adiary.org/man/035/tb/
※コメントによる質問は、気づくのが遅れることがあります。回答が欲しいときはメーリングリストを推奨します。