CSRF(クロスサイトリクエストフォージェリ)とは?
CSRF(Cross-Site Request Forgery、クロスサイトリクエストフォージェリ)は、ユーザーが意図しないリクエストを攻撃者が実行させる攻撃手法です。
簡単に言えば、「他人になりすまして勝手に操作する」ような攻撃です。
CSRFの仕組み
正常な動作
まず、通常のリクエストがどのように動くのか見てみましょう。
例:銀行の振込操作
銀行のサイトで、ユーザーが送金フォームを使ってお金を送るとします。
- ユーザーがログインした後、次のようなリクエストが送られます。
Plaintext
POST /transfer Amount=1000&ToAccount=123456
- このリクエストは、銀行が提供する正しい機能を使っています。
攻撃者の介入
攻撃者は、ユーザーがログイン中であることを利用します。
- 攻撃者が作った悪意のあるサイトにユーザーを誘導します。
- たとえば、メールやSNSでリンクを送ります。
Plaintext
http://malicious-site.com/steal-money
- 悪意のあるサイトに次のようなコードを埋め込みます。
このコードは、ユーザーのブラウザから銀行にリクエストを送ります。
HTML
<img src="http://bank.com/transfer?Amount=1000&ToAccount=987654" />
- ユーザーがリンクをクリックすると、自分の意図とは関係なくリクエストが送信されます。
これにより、攻撃者の口座(ToAccount=987654
)にお金が送られます。
CSRFの被害
CSRF攻撃に成功すると、以下のような被害が発生する可能性があります:
- 不正送金
- ユーザーの銀行口座から攻撃者の口座にお金が送金される。
- アカウント乗っ取り
- ユーザーのアカウント設定が攻撃者によって変更される。
- データの削除や改ざん
- ユーザーのデータが消される、または内容が変更される。
- 商品購入の強制
- ECサイトで、ユーザーのアカウントを使って商品が勝手に購入される。
CSRFを防ぐ方法
CSRFを防ぐためには、以下の対策を実施する必要があります。
CSRFトークンの利用
CSRFトークンは、ユーザーごとにユニークな値を生成し、フォームやリクエストに埋め込みます。サーバー側でトークンを確認することで、不正なリクエストをブロックできます。
例:HTMLフォームにCSRFトークンを追加
HTML
<form method="POST" action="/transfer">
<input type="hidden" name="csrf_token" value="abc123">
<input type="text" name="amount">
<input type="text" name="to_account">
<button type="submit">送信</button>
</form>
リファラーチェック
サーバーがリクエストの送信元を確認し、信頼できるドメインからのリクエストだけを受け入れる方法です。
CookieのSameSite属性を設定
SameSite属性を設定すると、クロスサイトのリクエストでCookieが送信されなくなります。
例:HTTPレスポンスヘッダー
Plaintext
Set-Cookie: sessionid=abc123; SameSite=Strict
GETリクエストで副作用のある処理を行わない
CSRF攻撃はGETリクエストでも実行可能です。そのため、データ変更や重要な操作はすべてPOSTリクエストに限定しましょう。
CSRFの具体例と防止策の比較
攻撃例
攻撃者が以下のリンクを仕掛けます
HTML
<img src="http://example.com/transfer?Amount=1000&ToAccount=987654" />
防止策の適用
- CSRFトークンを導入すると、このリクエストには正しいトークンが含まれないため、サーバーは拒否します。
- SameSite属性を設定している場合、このリクエストにユーザーのセッション情報が送られないため、不正操作は無効になります。
まとめ
CSRF攻撃は、ユーザーの意図に反して操作を行わせる非常に危険な攻撃です。しかし、CSRFトークンやリファラーチェック、SameSite属性の設定などの基本的なセキュリティ対策を行えば、防ぐことが可能です。
重要なのは、「リクエストの正当性を確認する」という原則を徹底することです。ユーザーの安全を守るため、必ずこれらの対策を実装しましょう!
コメント