Cross-Site Request Forgery(CSRF)の攻撃手法と対策
概要
Cross-Site Request Forgery(CSRF)とは、意図しないリクエストを別のウェブアプリケーションに送信させる攻撃手法のこと。被害者が認証済みのセッションを保持している場合に、攻撃者が被害者の権限を悪用して不正な操作を実行させる可能性がある。
また、CSRFは被害者がリクエストを送信するため、攻撃者の追跡が難しいという特徴があり、2012年にはパソコン遠隔操作事件では被害者が誤認逮捕されている。
攻撃方法の例
フォームを利用した攻撃
攻撃者が以下のような偽フォームを設置し、被害者が操作することで意図しないリクエストが送信される。ここでは被害者のセッションが使用され、不正な送金が行われる。
<form action="https://example.com/transfer" method="POST">
<input type="hidden" name="account" value="attacker_account">
<input type="hidden" name="amount" value="1000">
<button type="submit">Click here</button>
</form>
自動的なリクエスト送信
以下のような画像タグを埋め込むことで、被害者がページにアクセスしたタイミングで意図しないGETリクエストが送信される。
<img src="https://example.com/user/{name}" />
以前のmixiにあった問題で、見えないimg要素をページに設置することで、アクセスしたときに{name}
のユーザーの足跡にアクセス履歴が残ってしまう。
CSRFの対策
1. CSRFトークンを使う
アクセスごとにランダムなトークンを生成し、リクエストしたときにサーバでCSRFトークンを検証することで正当性を確認する。
2. ワンタイムパスワードを使う
重要な操作の際に、ユーザーにワンタイムパスワードを入力してもらうことも、対策のひとつ。ただやりすぎると利便性を著しく損なうので、送金確定やアイテム削除のときなど限定して使うのが有効。
3. その他の対策
- SameSite Cookie属性を設定する
- Referrerヘッダを検証する
- CORS(Cross-Origin Resource Sharing)の設定をする
- GET処理でリソースに影響を及ぼすような操作は実装しない