🐡

CSRF対策の重要性と実践方法

2024/12/02に公開

CSRF対策の重要性と実践方法

こんにちは! Rehab for JAPAN リハプラン/PLF開発チームの杉本です。

Webアプリケーションを開発する上で、セキュリティ対策は避けて通れません。その中でも「CSRF(Cross-Site Request Forgery)」は見過ごされがちですが、被害が深刻化する可能性がある攻撃手法の一つです。本記事では、CSRFの仕組みとその対策について解説し、実践的なコード例を通じて理解を深めていきます。

1. CSRFとは?

CSRF(クロスサイトリクエストフォージェリ)とは、ユーザーが意図しないリクエストを信頼されたウェブアプリケーションに送信させられる攻撃のことです。この攻撃は、ユーザーのセッションを悪用して、不正な操作を実行させるものです。

例えば、ある銀行のアプリケーションでログイン中のユーザーに対し、攻撃者が次のようなリクエストを送信させる可能性があります。

<img src="https://bank.example.com/transfer?amount=100000&to=attacker_account" />

上記の例では、画像タグを通じて銀行アプリケーションにリクエストを送信するよう仕向けています。この攻撃が成功すると、ユーザーの口座から攻撃者の口座に不正送金が行われてしまいます。

2. CSRFの仕組み

CSRF攻撃は以下の条件を満たすときに成立します。

  1. ユーザーがターゲットのWebアプリケーションにログインしており、有効なセッションを保持している。
  2. 攻撃者が別のサイト(悪意のあるページ)を通じて、ターゲットアプリケーションにリクエストを送信させる。
  3. ターゲットアプリケーションがリクエストの出所を検証せず、処理を実行してしまう。

3. CSRF対策の方法

CSRF攻撃を防ぐための代表的な方法をいくつか紹介します。

(1) CSRFトークンを利用する

CSRFトークンは、一意かつ予測不可能な値を生成し、リクエストと一緒にサーバーへ送信することでリクエストの正当性を確認します。

Railsでの実装例:

Railsでは、CSRF対策がデフォルトで有効になっています。以下のようにビューにCSRFトークンを埋め込むことで、自動的にリクエストの検証が行われます。

# app/views/layouts/application.html.erb
<%= csrf_meta_tags %>

# フォームの例
<%= form_with(url: "/transfer") do |form| %>
  <%= form.text_field :amount %>
  <%= form.text_field :to_account %>
  <%= form.submit "送金" %>
<% end %>

これにより、リクエストごとにCSRFトークンが付与され、サーバー側で検証されます。

(2) SameSite Cookie属性を設定する

SameSite属性を設定することで、ブラウザがクロスサイトからのリクエストでクッキーを送信しないようにできます。

例: RailsでSameSite属性を設定

Rails.application.config.session_store :cookie_store, key: '_your_app_session', same_site: :strict

Strictモードでは完全なクロスサイトリクエストをブロックしますが、一部の正当なケース(例えば、外部リンクからのアクセス)が動作しなくなる可能性もあります。その場合はLaxを選択します。

(3) Refererヘッダーの検証

リクエスト元のURL(Refererヘッダー)をチェックし、正当なリクエスト元からのアクセスかを判断する方法です。ただし、ヘッダーは攻撃者によって簡単に偽装されるため、補助的な対策として利用するのが一般的です。

(4) 重要な操作に再認証を求める

ユーザーが特に重要な操作を行う際に、再認証(例: パスワード入力や2要素認証)を要求することで、不正リクエストを防ぐことができます。

4. CSRF対策の実践例: Railsアプリケーション

以下は、RailsアプリケーションでCSRF対策を実装した例です。

  1. CSRFトークンを有効化する Railsではprotect_from_forgeryがデフォルトで有効になっていますが、コントローラーでこれを明示的に記述することもできます。
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end
  1. フォームにトークンを埋め込む 上述のform_withヘルパーを使用すると、自動的にCSRFトークンがフォームに追加されます。

5. まとめ

CSRF攻撃はシンプルな手法でありながら、その影響は非常に深刻です。しかし、適切な対策を講じることで簡単に防ぐことができます。

  • CSRFトークンを活用する。
  • SameSite属性を設定する。
  • 重要な操作には再認証を要求する。

これらの対策を適切に組み合わせて、アプリケーションのセキュリティを強化しましょう。

参考資料

OWASP Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet

Rehab Tech Blog

Discussion