« 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