最終更新
リンドくん
先生、「CSRF攻撃」ってたまに聞くんですけど、これって何なんですか?
たなべ
確かに名前だけ聞くと難しそうだよね。でも実は、あなたのログイン状態を悪用される攻撃なんだ。
例えば、SNSにログインしたまま悪意あるサイトを見ると、知らないうちに投稿されちゃう...みたいなことが起こる可能性があるんだよ。
リンドくん
えっ、怖いですね!でもどうやって防ぐんですか?
たなべ
そこで登場するのがCSRFトークンという仕組みなんだ。今日はこれについて、初心者の方でもわかるように詳しく説明していくよ。
Webアプリケーションを開発していると、必ず直面するのがセキュリティの問題です。
その中でもCSRF(Cross-Site Request Forgery)攻撃は、開発者が理解しておくべき重要な脅威の一つです。
CSRF攻撃は日本語で「クロスサイトリクエストフォージェリ」と呼ばれ、ユーザーの意図しない操作を勝手に実行させてしまう攻撃のことを指します。
ログイン状態を悪用されることで、パスワード変更や商品購入、SNSへの投稿など、さまざまな操作が勝手に行われてしまう可能性があるのです。
この記事では、CSRF攻撃の仕組みから、CSRFトークンを使った防御方法まで、セキュリティ学習を始めたばかりの方でも理解できるよう、丁寧に解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
そもそもCSRF攻撃って、どういう仕組みで起こるんですか?
たなべ
良い質問だね。まず、Webサイトにログインすると、ブラウザにクッキー(Cookie)という情報が保存されるよね。
CSRF攻撃は、このクッキーが自動的に送信される仕組みを悪用するんだ。
CSRF攻撃がどのように行われるのか、具体的な流れを見ていきましょう。
例えば、以下のようなHTMLコードが悪意あるサイトに仕込まれていたとします。
このコードは、画面には何も表示されませんが、ページを開いた瞬間に銀行サイトへ送金リクエストを送ってしまいます。もしユーザーが銀行サイトにログインしたままこのページを見ると、知らないうちに送金が実行される可能性があるのです。
CSRF攻撃が成功してしまう主な理由は、以下の2点です。
これらの特性を悪用することで、攻撃者はユーザーの権限で様々な操作を実行できてしまうのです。
リンドくん
じゃあ、どうやって防げばいいんですか?
たなべ
そこで登場するのがCSRFトークンなんだ。
これは予測不可能なランダムな文字列を使って、リクエストが本当に正規のページから送られたものかを確認する仕組みなんだよ。
CSRFトークンは、サーバーが生成する予測不可能なランダムな文字列です。
この文字列を使って、リクエストが正規のフォームから送信されたものかを確認します。
トークンの特徴は以下の通りです。
CSRFトークンを使った防御の流れを見ていきましょう。
ユーザーがフォームページにアクセス
ユーザーがフォームを送信
サーバーがトークンを検証
実際のコード例を見てみましょう。以下はPHPでの実装例です。
次に、送信されたトークンを検証するコードです。
CSRFトークンによって攻撃が防げる理由を整理しましょう。
このように、CSRFトークンは正規のフォームから送信されたリクエストである証明として機能するのです。
リンドくん
基本的な仕組みはわかりました!でも、もっと安全にする方法ってありますか?
たなべ
いい質問だね!実は、CSRFトークンにもいくつかの実装パターンがあって、それぞれに特徴があるんだ。
状況に応じて使い分けることで、より強固なセキュリティを実現できるよ。
ワンタイムトークンは、一度使用したら無効になるトークンです。
メリット
デメリット
セッション中は同じトークンを使い続けるパターンです。
メリット
デメリット
トークンをクッキーとフォームの両方に埋め込むパターンです。
メリット
デメリット
トークンに有効期限を設けることで、セキュリティをさらに向上させることができます。
リンドくん
実際のプロジェクトでは、いつも一から実装するんですか?
たなべ
いや、実は多くのWebフレームワークには標準でCSRF対策機能が組み込まれているんだ。
それを使えば、比較的簡単に安全な実装ができるよ。
Laravelでは、CSRFトークンが自動的に生成されます。
Laravelは自動的にトークンを検証し、一致しない場合は419 Page Expiredエラーを返します。
Djangoでも同様に簡単に実装できます。
Expressではcsurfミドルウェアを使います。
フレームワークのCSRF対策機能を使うことで、以下のメリットがあります。
初心者の方は、まずフレームワークの機能を使って実装することをおすすめします。その上で、仕組みをしっかり理解することが大切です。
リンドくん
CSRFトークンを実装すれば完璧なんですか?
たなべ
残念ながら、それだけでは不十分なんだ。CSRFトークンと組み合わせて使うべきセキュリティ対策がいくつかあるんだよ。
クッキーにSameSite属性を設定することで、CSRF攻撃のリスクを大幅に減らせます。
SameSiteには3つの値があります。
Secure属性との併用が必須ですCSPヘッダを設定することで、外部サイトからのリクエスト送信を制限できます。
リクエスト元のURLを確認することで、追加の防御層を設けられます。
ただし、Refererヘッダは補助的な対策として使用してください。ブラウザやプロキシによって削除される場合があるため、これだけに頼るのは危険です。
重要な操作は必ずPOSTリクエストで行うようにしましょう。
GETリクエストはべき等(何度実行しても結果が同じ)である必要があります。状態を変更する操作には、必ずPOST、PUT、DELETEなどのメソッドを使用しましょう。
リンドくん
CSRF攻撃の仕組みとトークンによる防御方法、よくわかりました!
たなべ
素晴らしいね!最後に大事なポイントをまとめておこう。
セキュリティは一つの対策だけでは不十分で、多層防御が基本なんだ。これからWebアプリを作るときは、ぜひ意識してみてね。
この記事では、CSRF攻撃の仕組みと、CSRFトークンを使った防御方法について詳しく解説してきました。
重要なポイントを改めて整理しましょう。
セキュリティは、後から付け加えるものではなく、設計段階から組み込むべきものです。
CSRF対策は決して難しいものではありませんが、理解せずに実装すると、思わぬ脆弱性を生み出してしまう可能性があります。
今回学んだCSRF対策の知識を、ぜひあなたのプロジェクトに活かしてください。
最初は面倒に感じるかもしれませんが、ユーザーの大切なデータや資産を守るために、セキュリティ対策は欠かせません。
あなたの開発するアプリケーションが、安全で信頼されるものとなることを願っています。