CSRF(クロスサイトリクエストフォージェリ)とは?
Webアプリが持つ入力フォームに対して、意図しない形で別のWebアプリから意図しないデータを元のWebアプリのフォームに送信する攻撃手法(リクエストの偽造)のことです。
攻撃のきっかけや仕組み
攻撃対象のWebサイトをログインしたままの状態で、攻撃は別のWebサイトに用意したコンテンツのリンクを踏んだり画像を表示したことをきっかけにします。利用しているアプリをログインした状態であればCookie情報ができます。別サイトにてそのログイン中のCookie情報を利用して元のアプリへ不正な悪意のあるリクエストを行います。
例えば、SNSやインターネットバンキングにログインした状態で、他の悪意のあるサイトのURLをクリックした際に情報取得されたり、勝手に悪意のある情報を発信されたりすることです。なりすましで知人や友人に対して悪意のあるメッセージを広めてしまったり、ネットバンクの不正操作をされてしまったりする可能性があります。
Ruby on RailsにおけるCSRF対策
Railsは予めform_withヘルパーメソッドで生成したフォームの隠し要素として認証用のトークンをRailsアプリが起動するサーバ上でvalueを生成します。クライアントが送信された値がvalueの値と一致するか照合して一致していた場合に正しいアクセスとみなし、入力フォームの情報を元に登録更新処理等を行います。
実際に生成されているソース(form_withヘルパー)
具体的には、Railsではフォームのソースは下記のようになっています。(認証用トークンのvalueが埋め込まれています。)
1 2 3 4 |
<form action="/families" accept-charset="UTF-8" method="post"> <input type="hidden" name="authenticity_token" value="IxaTQnVhbF7QOYx0bBKu18LQhmIPW272cMKEmHN/TIPshkw0HkMDbaB0GPbDufhiB7W43Q6vqx6F+vrGp06erQ==" /> //任意の入力フォーム </form> |
認証用のトークンとは?
同じWebアプリケーションから生じたリクエストであることを証明する内容となっています。なので別のサイトからリクエストを偽装して送信しようとしても認証エラーになり安全です。
GETリクエストは使わないこと
このform_withヘルパーによるCSRF対策はPOSTリクエストのみ有効でGETリクエストには適用されません。GETリクエストは情報の読み出しのみに使うこととし、何からの情報の登録や更新等の処理は必ずPOSTリクエストを使うようにしましょう。
この記事へのコメントはありません。