カテゴリ: CodeIgniter 更新日: 2026/06/16

CodeIgniterのCSRF対策を完全解説!フォーム処理のセキュリティ手順

CodeIgniterでCSRF対策を行う方法と設定手順
CodeIgniterでCSRF対策を行う方法と設定手順

先生と生徒の会話形式で理解しよう

生徒

「CodeIgniterでフォームを作っているのですが、CSRF対策っていうのが必要だと聞きました。それって何ですか?」

先生

「CSRFは、悪い人が本人になりすまして勝手に投稿や買い物をさせてしまう攻撃のことです。CodeIgniterには、これを防ぐための強力な機能が備わっていますよ。」

生徒

「難しそうですね…。初心者でも設定できますか?」

先生

「大丈夫です。設定ファイルを数行書き換えるだけで、自動的にガードを固めることができます。具体的な手順を一緒に見ていきましょう!」

1. CSRF対策とは?初心者にもわかりやすく解説

1. CSRF対策とは?初心者にもわかりやすく解説
1. CSRF対策とは?初心者にもわかりやすく解説

プログラミングの世界でよく耳にするCSRF(シーサーフ)とは、「Cross-Site Request Forgery(クロスサイト・リクエスト・フォージェリ)」の略称です。 日本語では「サイト間リクエスト偽造」と呼ばれます。パソコンを触り始めたばかりの方には少し難しい言葉ですが、身近な例えで考えてみましょう。

例えば、あなたが銀行の窓口で手続きをしているとします。そこに、あなたの顔にそっくりな「お面」をかぶった偽者が現れて、「私の口座から100万円を別の場所へ送ってください」と窓口の人に嘘の命令を出すようなものです。 インターネット上でも同じように、あなたがログインしている状態を悪用して、知らない間に勝手な操作をされてしまう危険があるのです。

CSRF対策とは、この「偽者からの命令」を見破るための仕組みです。CodeIgniterという便利なPHPの道具(フレームワーク)を使えば、 「合言葉」のようなトークンを発行して、正しい利用者からの送信かどうかを自動でチェックできるようになります。

2. CodeIgniterでCSRF保護を有効にする設定手順

2. CodeIgniterでCSRF保護を有効にする設定手順
2. CodeIgniterでCSRF保護を有効にする設定手順

CodeIgniterでこの守りを固めるには、まず設定ファイルを確認する必要があります。プログラムの細かい動きを決める「ルールブック」を書き換えるイメージですね。 まずは、プロジェクトの中にある app/Config/Filters.php というファイルを探してみましょう。

このファイルの中には、Webサイト全体にかける「フィルター(網目)」の設定が書かれています。ここで「csrf」という機能を有効にすることで、 サイトに送られてくるすべてのデータに対して、厳しいセキュリティチェックが行われるようになります。


// app/Config/Filters.php の設定例
public $globals = [
    'before' => [
        'csrf', // ここに csrf を追加するだけで、全てのフォーム送信がチェックされます!
        // 'honeypot',
    ],
    'after' => [
        'toolbar',
        // 'honeypot',
    ],
];

このように設定するだけで、CodeIgniterは自動的に「合言葉」を持っていない送信をエラーとして弾いてくれるようになります。 セキュリティの基本は「怪しいものは通さない」ことですから、この設定はWeb開発において非常に大切な第一歩となります。

3. フォームにセキュリティトークンを埋め込む方法

3. フォームにセキュリティトークンを埋め込む方法
3. フォームにセキュリティトークンを埋め込む方法

設定を有効にしたら、次は実際の入力画面(フォーム)に「合言葉」を埋め込む作業が必要です。 専門用語でこの合言葉をCSRFトークンと呼びます。 CodeIgniterには、このトークンを自動で作成して隠してくれる便利な命令が用意されています。

手動でHTMLを書くこともできますが、CodeIgniterの「フォームヘルパー」という機能を使うのが一番簡単で確実です。 以下のコードのように csrf_field() という命令を一行足すだけで、画面上には見えない「秘密の合言葉」がフォームの中に隠されます。


<form action="/submit" method="post">
    <?= csrf_field() ?> <label for="username">お名前:</label>
    <input type="text" name="username" id="username">
    
    <button type="submit">送信する</button>
</form>

この csrf_field() が実行されると、実際のWebブラウザ上では以下のような隠し項目(input type="hidden")に変換されて出力されます。


<input type="hidden" name="csrf_test_name" value="d1a2b3c4e5f6g7h8i9j0..." />

このランダムな長い文字列が、その時だけ有効な「一度きりの合言葉」になります。これがあるおかげで、外部からの不正な攻撃を防ぐことができるのです。

4. セキュリティ設定のカスタマイズとSecurity.php

4. セキュリティ設定のカスタマイズとSecurity.php
4. セキュリティ設定のカスタマイズとSecurity.php

CSRF対策のより細かいルールを設定したい場合は、 app/Config/Security.php というファイルを編集します。 ここでは、合言葉の有効期限や、合言葉を入れる箱の名前(トークン名)などを自由に変更することができます。

例えば、「一度フォームを送ったら、合言葉を新しいものに取り替える」という設定(Regenerate)や、「Cookie(クッキー)」というパソコン内の保存場所にどのような名前で保存するかを決めることができます。 初心者のうちは初期設定のままでも十分安全ですが、大規模なサイトを作る際にはこれらの設定を調整することもあります。


// app/Config/Security.php の主な項目
public $csrfProtection = 'cookie'; // クッキーを使って保護する
public $tokenName      = 'csrf_test_name'; // 合言葉のラベル名
public $headerName     = 'X-CSRF-TOKEN'; // 通信ヘッダーでの名前
public $cookieName     = 'csrf_cookie_name'; // クッキーの名前
public $expires        = 7200; // 合言葉の有効期限(秒)
public $regenerate     = true; // 送信するたびに合言葉を新しくする

$regenerate = true; にしておくと、セキュリティ強度は上がりますが、ブラウザの「戻る」ボタンを押したときにエラーが出やすくなるという特徴もあります。 自分のサイトの使い勝手に合わせて調整してみましょう。

5. AJAX(非同期通信)でCSRF対策を行うテクニック

5. AJAX(非同期通信)でCSRF対策を行うテクニック
5. AJAX(非同期通信)でCSRF対策を行うテクニック

最近のWebサイトでは、ページを切り替えずにデータをやり取りする「AJAX(エージャックス)」という技術がよく使われます。 この場合も、通常のフォームと同じようにCSRF対策が必要です。 JavaScriptを使ってデータを送る際には、合言葉をデータの「中身」に入れるか、「通信のヘッダー」という目立たない場所に含める必要があります。

初心者の方には少しレベルが高いかもしれませんが、 「JavaScriptでデータを送る時も、必ず合言葉をセットで送らなければならない」というルールだけ覚えておけば大丈夫です。 CodeIgniterではヘッダー情報を読み取る機能も充実しているので、スムーズに連携が可能です。


// コントローラー側でトークンの値を取得してJavaScriptに渡す例
$data = [
    'token_name'  => csrf_token(), // 合言葉の名前を取得
    'token_hash'  => csrf_hash(),  // 合言葉の正体(ハッシュ値)を取得
];
echo json_encode($data);

このように、プログラム側から現在の合言葉を教えてあげることで、JavaScriptなどの別の道具を使っている時も一貫したセキュリティを保つことができるようになります。

6. もしエラーが出た時は?CSRFエラーの対処法

6. もしエラーが出た時は?CSRFエラーの対処法
6. もしエラーが出た時は?CSRFエラーの対処法

CSRF対策を設定すると、たまに「403 Forbidden」というエラー画面が表示されることがあります。これは「アクセスが禁止されています」という意味です。 ほとんどの場合、原因は「合言葉が送られていない」か「合言葉が古くなって間違っている」かのどちらかです。

まずは、以下のチェックリストを確認してみましょう。

  • フォームの中に csrf_field() を書き忘れていないか?
  • 複数のタブを開いて操作したせいで、合言葉が更新されてしまっていないか?
  • 設定ファイルのドメイン設定(App.phpのbaseURL)が正しく記述されているか?

プログラムは非常に正直です。ルールが少しでも守られていないと、あなたのサイトを守るためにあえて「エラー」を出して止めてくれます。 エラーが出た時は、守りがしっかり働いている証拠だと思って、落ち着いてコードを見直してみてください。

7. セキュリティを意識したプログラミングの第一歩

7. セキュリティを意識したプログラミングの第一歩
7. セキュリティを意識したプログラミングの第一歩

パソコンを触ったことがない方にとって、プログラミングは魔法のように見えるかもしれません。しかし、その魔法を安全に使うためには、今回学んだCSRF対策のような「鍵」をかける習慣がとても大切です。 CodeIgniterを使うことで、本来なら非常に複雑な計算が必要なセキュリティ対策も、たった数行のコードで実現できることがわかったと思います。

最初は仕組みを完璧に理解できなくても構いません。「外から勝手に操作されないように、見えない合言葉をやり取りしているんだな」というイメージを持つだけで、あなたのエンジニアとしてのレベルは格段にアップします。 これからも、安全で楽しいWebサイト作りを目指していきましょう!

まとめ

まとめ
まとめ

CodeIgniterのCSRF対策の重要ポイント

本記事では、CodeIgniterにおけるCSRF対策の基本から実装方法、さらに応用的なカスタマイズやエラー対処までを一通り確認してきました。 Webアプリケーション開発において、フォーム処理やAPI通信は非常に頻繁に行われる処理ですが、その裏側には常に不正アクセスや攻撃のリスクが存在しています。 特にCSRF攻撃は、ユーザーが気づかないうちに操作を実行させてしまう危険な手法であり、対策を行っていないと深刻な被害につながる可能性があります。

CodeIgniterでは、このCSRF対策を非常にシンプルに導入できる点が大きな特徴です。 Filters.phpにcsrfフィルターを追加するだけで、全体に対するセキュリティチェックが自動で適用されます。 さらに、フォームにcsrf_field関数を記述することで、トークンが自動的に埋め込まれ、安全な通信が保証される仕組みとなっています。

CSRFトークンの仕組みとセキュリティ強化

CSRFトークンは、いわば一度限りの認証キーのような役割を持っています。 フォーム送信時にこのトークンが一致しているかを確認することで、正規のユーザーからのリクエストであるかどうかを判定しています。 この仕組みにより、外部サイトからの不正なリクエストはブロックされるため、安全性が大幅に向上します。

また、Security.phpの設定によってトークンの有効期限や再生成のタイミングを調整することで、さらに高度なセキュリティ設計が可能になります。 例えばトークンを毎回再生成する設定にすれば、より強固な防御が実現できますが、ユーザビリティとのバランスも考慮する必要があります。

実務で役立つCSRF対策の実装例

実際の開発現場では、通常のフォームだけでなく、JavaScriptを用いた非同期通信でもCSRF対策が必要になります。 以下は、CSRFトークンを取得して安全に利用するサンプルコードです。


$data = [
    'token_name' => csrf_token(),
    'token_hash' => csrf_hash(),
];
echo json_encode($data);

このようにトークン情報を取得し、JavaScript側で送信データに含めることで、AJAX通信でも安全性を確保することができます。 セキュリティ対策は一箇所だけではなく、すべてのデータ送信経路で一貫して実施することが重要です。

CSRFエラーを防ぐためのチェックポイント

開発中に発生しやすいCSRFエラーについても理解しておくことが重要です。 フォームにトークンが含まれていない場合や、古いトークンを送信してしまった場合にはエラーが発生します。 特に複数タブでの操作やブラウザの戻る操作によってトークンが無効になるケースはよくあるため注意が必要です。

エラーが発生した場合は、コードのミスではなく、セキュリティ機能が正しく働いている証拠です。 落ち着いてフォームや設定を見直すことで、原因を特定しやすくなります。

安全なWeb開発を実現するために

CSRF対策は、Web開発における基本中の基本でありながら、非常に重要なセキュリティ対策です。 CodeIgniterを活用することで、複雑な処理を意識せずに安全な仕組みを導入できる点は大きなメリットです。 今回学んだ内容をしっかりと理解し、日々の開発に取り入れることで、より安全で信頼性の高いWebアプリケーションを構築することができるようになります。

サンプルプログラムまとめ


<form action="/submit" method="post">
    <?= csrf_field() ?>
    <input type="text" name="username">
    <button type="submit">送信</button>
</form>

送信時にCSRFトークンが自動付与され安全に処理される
先生と生徒の振り返り会話

生徒

CSRF対策は難しそうだと思っていましたが、CodeIgniterなら簡単に導入できることがわかりました。 特にトークンを使ってリクエストを検証する仕組みが理解できました。

先生

その通りです。CSRFは見えない攻撃ですが、対策はとてもシンプルです。 フィルター設定とフォームへのトークン埋め込み、この二つが基本になります。

生徒

AJAX通信でも同じようにトークンが必要になる点が印象的でした。 すべての通信で意識する必要があるのですね。

先生

はい。セキュリティは一部だけでは意味がありません。 フォームでもAPIでも、すべての入口で対策を行うことが大切です。

生徒

エラーが出たときも怖がるのではなく、守られている証拠だと考えるようにします。

先生

その考え方はとても重要です。 セキュリティ対策を正しく理解すれば、安全なアプリケーション開発ができるようになります。 今後も意識して実装していきましょう。

カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyのサービスとは?役割と基本概念を初心者向けにやさしく解説
New2
Laravel
Laravelでリダイレクトやフラッシュメッセージをテストする方法を完全解説!初心者向けLaravelテスト入門
New4
CodeIgniter
CodeIgniterのセキュリティ対策を完全ガイド!初心者が守るべき基本設定
人気記事
No.2
Java&Spring記事人気No2
Laravel
LaravelでReactコンポーネントを組み込む方法完全ガイド!JSX対応でフロントエンド連携を学ぼう
No.3
Java&Spring記事人気No3
Laravel
LaravelのRESTfulコントローラ設計のベストプラクティスを初心者向けにわかりやすく解説
No.4
Java&Spring記事人気No4
Laravel
Laravelのold()関数でフォーム再表示時に値を保持する方法
No.5
Java&Spring記事人気No5
Symfony
Symfonyのインストール方法!CLIとComposerの導入手順まとめ
No.6
Java&Spring記事人気No6
Laravel
LaravelをDockerで動かすメリットと導入の全体像を徹底解説!初心者向け入門ガイド
No.7
Java&Spring記事人気No7
Symfony
Symfonyでバリデーションをコントローラに組み込む方法を徹底解説!初心者にもやさしい入力チェックの基本
No.8
Java&Spring記事人気No8
Laravel
Laravelのデータベース設定方法を完全ガイド!初心者でもわかる.envファイルの使い方