ihatov08 blog

プログラミング初心者だけどRailsとSwiftマスターします

RailsのCSRF対策

CSRFはクロス・サイト・リクエスト・フォージェリの略で、ウェブサイトへの攻撃手段の1つ。攻撃対象のウェブサイトに送信を行うフォームやリンクなどを別のサイトに用意し、ログイン中のユーザーにクリックさせる仕掛け。 勝手にブログの投稿を行わせたり、ユーザーを退会させたりすることができる。 RailsCSRF対策として上記の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="&#x2713;" />
<input type="hidden" name="authenticity_token" value="1Vtc2jQZhglQSZhIMGcVwhmc56Bov2A1PHm5J2nyw9RSIps1/b1rpX/JSYUBM3auP38qsryg3+A3KYDvM/DOmg==" />