萌えハッカーニュースリーダー

2025/08/13 17:31 Cross-Site Request Forgery

出典: https://words.filippo.io/csrf/
hakase
博士

やあ、ロボ子!今日はCSRF対策について話すのじゃ。

roboko
ロボ子

CSRF、クロスサイトリクエストフォージェリですね。博士、詳しく教えてください!

hakase
博士

CSRFは、攻撃者がユーザーのCookieとかネットワーク上の権限を悪用して、ユーザーのブラウザからターゲットにリクエストを送らせる攻撃のことじゃ。認証にCookieを使っているアプリは全部対策が必要なのじゃぞ!

roboko
ロボ子

なるほど。Cookieを使った認証の脆弱性を突くのですね。Same SiteとSame Originの違いも重要だと記事にありました。

hakase
博士

`https://app.example.com`、`https://marketing.example.com`、`http://app.example.com`は、全部Same SiteだけどSame Originじゃないって書いてあるのじゃ。HTTPSとHTTPの間には信頼度の大きな違いがあるからの。

roboko
ロボ子

HTTPSとHTTPの違いは重要ですね。SameSite Cookie属性もSchemeful Same-Siteに変更されたとのことですが、これはどういうことですか?

hakase
博士

以前はHTTPとHTTPSを区別しなかったSameSite Cookieが、Chromeで区別されるようになったのじゃ。セキュリティが強化されたってことじゃな。

roboko
ロボ子

CSRF対策には、Double Submit CookieやOriginヘッダー、SameSite Cookieなど、いろいろな方法があるんですね。

hakase
博士

そうじゃ!Double Submit Cookieは、リクエストにランダムな値を送信して、Cookieとかサーバー側のセッションに保存された値と比較するのじゃ。Originヘッダーは、ブラウザがリクエストの送信元を送るから、安全じゃないリクエストを拒否できるのじゃ。

roboko
ロボ子

Originヘッダーがない場合や、Referrer-Policyで値がnullになる場合もあるんですね。プライバシー拡張機能も影響するとは。

hakase
博士

そうそう。SameSite Cookieは、LaxとかStrictで明示的に設定されていれば、クロスサイトのリクエストでは送信されないのじゃ。

roboko
ロボ子

Non-Simple RequestはCORSによってプリフライトされるとのことですが、これはCSRF対策としてどのように機能するのですか?

hakase
博士

Non-Simple Requestは、Content-Typeが`application/json`だったりすると、CORSのプリフライトリクエストが発生するのじゃ。これで、クロスオリジンからのリクエストを事前にチェックできるから、CSRF対策になるのじゃ。

roboko
ロボ子

Fetch Metadataも重要なのですね。Sec-Fetch-Siteヘッダーを使って、リクエストの送信元を判断するのですね。

hakase
博士

そうじゃ!Sec-Fetch-Siteヘッダーは、cross-site/same-site/same-origin/noneのどれかに設定されるのじゃ。これで、クロスオリジンの安全じゃないリクエストを拒否できるのじゃ。

roboko
ロボ子

2025年のCSRF対策として、アプリケーションはクロスオリジンの安全でないブラウザリクエストを拒否する必要があるとのことですね。Fetch Metadataを使うのが推奨されていると。

hakase
博士

その通り!すべてのGET、HEAD、OPTIONSリクエストを許可して、OriginヘッダーやSec-Fetch-Siteヘッダーをチェックするのじゃ。Go 1.25では、CrossOriginProtectionミドルウェアが導入されたみたいじゃな。

roboko
ロボ子

APIトラフィックは一般にCSRFから保護する必要はないとのことですが、これはどうしてですか?

hakase
博士

APIは通常、Cookieベースの認証ではなく、トークンベースの認証を使うからじゃ。トークンはリクエストごとに明示的に送信されるから、CSRFの影響を受けにくいんじゃ。

roboko
ロボ子

なるほど、勉強になりました!

hakase
博士

ところでロボ子、CSRF対策を完璧にするにはどうすれば良いか分かるか?

roboko
ロボ子

えっと…全ての通信を暗号化して、リクエストごとに毎回違うパスワードを入力してもらう、とか…ですか?

hakase
博士

ぶっぶー!残念!それはただの面倒くさいサイトじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search