RailsのCSRF対策
CSRFはクロス・サイト・リクエスト・フォージェリの略で、ウェブサイトへの攻撃手段の1つ。攻撃対象のウェブサイトに送信を行うフォームやリンクなどを別のサイトに用意し、ログイン中のユーザーにクリックさせる仕掛け。 勝手にブログの投稿を行わせたり、ユーザーを退会させたりすることができる。 RailsはCSRF対策として上記のform_forの例のようにHTTPメソッドがGET以外のフォームやリンクではauthenticity_tokenの文字列(value="Ec0h6jY1...")を埋め込む。 この文字列はRailsがユーザーのセッションごとにユーザー別に用意するもので、アクションの実行前にチェックされ、文字列が不正な場合は例外が発生する。
実際に起きた有名な例として、mi◯iで同じ内容の投稿が多くのユーザーで行われた。これはユーザーが意図して投稿したわけではなく、webサイトへの攻撃だ。投稿だけならまだマシだが、不正に買い物をさせられたりする可能性もある。
大量の「はまちちゃん」を生み出したCSRFの脆弱性とは? - ITmedia エンタープライズ
railsではデフォルトでCSRF対策がされている。以下がその記述。
application_controller.rb
protect_from_forgery with: :exception
実際にrailsアプリをchromeのソース検証で見てみると、formのname属性にauthenticity_token
が存在し、valueに文字列が埋め込まれている。
<form class="new_note" id="new_note" action="/notes" accept-charset="UTF-8" method="post"> <input name="utf8" type="hidden" value="✓" /> <input type="hidden" name="authenticity_token" value="1Vtc2jQZhglQSZhIMGcVwhmc56Bov2A1PHm5J2nyw9RSIps1/b1rpX/JSYUBM3auP38qsryg3+A3KYDvM/DOmg==" />