« PERL5WEBDB | メイン | IIS のログを tail -f »

2006年04月11日

CSRF 対策 w. JavaScript

 CSSXSS に対して脆弱でない CSRF 対策とはどのようなものか、という議論が続いているようですが、JavaScript を用いてよいのであれば、簡単な対策手法が存在すると思います。

 CSRF 対策では、フォームの hidden パラメタに、なんらかのトークンを埋め込むことで、第三者によるフォーム偽造を防止するのが一般的です。しかし、 CSSXSS を用いて、そのトークンを第三者が読み出せてしまうという点が、問題をややこしくしているように思えます注2

 しかし、 JavaScript を用いて良い環境では、単純な対策が存在すると思います。 HTML 内にあらかじめトークンを埋め込んでおくのではなく、フォーム送信時に、ブラウザ側でトークンを埋め込むようにすればよいのではないでしょうか?

<form method="POST" onsubmit="this.csrf_key.value = get_session_id()注1">
...
<input type="hidden" name="csrf_key" value="">
</form>

 こうすれば、たとえ CSSXSS によって第三者がページを読んでしまったとしても、トークンが流出することはありません。また、複数ウィンドウの競合といった問題もありませんし、既存アプリケーションの書換も最小限で済みます。

 議論を追っていたわけではないので、既出だったらごめんなさい。

参照:
 CSRF対策に「ワンタイムトークン」方式を推奨しない理由 (高木浩光@自宅の日記)
 Re: 高木浩光@自宅の日記 - hiddenパラメタは漏れやすいのか? (めもおきば)
 CSRF と CSSXSS に関する議論について (CSRF と CSSXSS に関する議論について)


注1: document.cookie からセッション ID を読み出す関数を実装する必要があります
注2: 17:01 追記 - hidden フィールドにトークンが埋め込まれた HTML を返す手法は、(そのトークンがセッションIDであろうがなかろうが) CSSXSS + CSRF 攻撃に対しては脆弱です。

投稿者 kazuho : 2006年04月11日 16:30 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/523

このリストは、次のエントリーを参照しています: CSRF 対策 w. JavaScript:

» CSRF対策 with JavaScript from hata's LABlog
JavaScript を使った CSRF 対策の方法として、以前 Kazuho@... [続きを読む]

トラックバック時刻: 2006年06月09日 11:36

» Link/Security/CSRF from [ abs+ ] (PukiWiki/TrackBack 0.3)
Link/Security/CSRF ▲ ▼CSRF(クロスサイトリクエストフォージェリ) CSRF - クロスサイトリクエストフォー... [続きを読む]

トラックバック時刻: 2009年05月01日 21:43