baserCMS BcMailにCloudflare Turnstileを導入するためのプラグインを作ってみました。
- 2026/5/28 追記
うっかり「BcTurnstile」の名称で公開したところ、既に同名の5系プラグインが公開されていたため、プラグイン名を「TurnstileForBcMail」に改名しました。実は、ずーっと、teckingさんのEnableReCaptchaのヘビーユーザーだったのですが、近頃、G社様から「クラウドなんちゃらディフェンス」とやらへ統合・移行するぞ!とやいのやいの言われ、ちょっと嫌気が差してしまい、引越ししようとサービスを探してみたところ「Cloudflare Turnstileがいいよ」とこぞってネットの皆さんが言っていたので変えてみたくなった、というのがプラグイン作成の不純?!な動機。
G社様のreCAPTCHAサービスから乗り換えるのに、申し訳ないことにG社様のGミニさんにチャットで聞いてみたり、おだててみたり、毒づいてみたりしながら作りました。
ひとまず、内容の紹介がてら以下、readme.mdの写し。
TurnstileForBcMail (Turnstile for BcMail プラグイン)
BcMail(メールフォーム)の確認画面に Cloudflare Turnstile スパムガードを自動挿入し、ロボットによる不正な自動送信やスパムメールを強力にブロックする baserCMS 4系専用のプラグインです。
仕様・概要
- メールフォームのスパム防御: お問い合わせフォーム等の確認画面に、Cloudflareが提供する最先端の非表示(プライバシー保護型)キャプチャ「Turnstile」を導入し、悪質なボットによる自動投稿を排除します。
- 専用の管理画面: Cloudflareから取得した「サイトキー」と「シークレットキー」をいつでもブラウザ上から入力・変更・保存することができます。
また、キーが未入力(空欄)のまま運用された場合でも、フォームが壊れてメール送信ができなくなるリスクを防ぐため、Cloudflare公式のテスト用ダミーキーが適用されます。 - 既存のメールフォームと共存: 既存のメールフォームのオリジナルテーマ(完了画面のデザイン等)や画面遷移の挙動を崩すことなく、安全に共存・動作をめざして作成しました。
インストール要件
- CMS本体: baserCMS v4.x以上 admin-third対応(おそらく admin-second でも動作すると思いますが未検証です。)
- 動作環境: PHP 7.x以上 (cURL拡張モジュール必須) /データベース: SQLite または MySQL
- その他: Cloudflare アカウントおよび Turnstile の「Site Key」と「Secret Key」があらかじめ必要です。
ファイル構成
TurnstileForBcMail/
├── config.php # プラグイン基本情報
├── README.md # 本ドキュメント
├── VERSION.txt
└── Config/
├── init.php # データベース初期化(正規フック)
├── setting.php
├── Data/
│ └── turnstile_for_bc_mail_configs.csv # ロールバック防止用初期CSV
└── Schema/
└── turnstile_for_bc_mail_configs.php # スキーマ定義ファイル(小文字)
/app/Plugin/TurnstileForBcMail/Controller/TurnstileForBcMailConfigsController.php
/app/Plugin/TurnstileForBcMail/Event/TurnstileForBcMailControllerEventListener.php
/app/Plugin/TurnstileForBcMail/Model/TurnstileForBcMailConfig.php
/app/Plugin/TurnstileForBcMail/View/TurnstileForBcMailConfigs/admin/index.php
使い方
1. プラグインの配置と有効化
- 本リポジトリをダウンロードし、フォルダ名を
TurnstileForBcMailにします(大文字小文字に注意してください)。 - baserCMSの
/app/Plugin/ディレクトリ直下に配置します。 - baserCMS管理画面の「プラグイン管理」を開き、「TurnstileForBcMail(Turnstile for BcMail)」 の 「インストール」 ボタンをクリックします。
2. キーの設定
有効化されると、管理画面の「プラグイン管理」>「プラグイン一覧」リスト内の 「TurnstileForBcMail(Turnstile for BcMail)」 プラグインの歯車マークをクリックして設定画面を開き、Cloudflareから発行された「Site Key」と「Secret Key」を入力して 「保存」 します。
3. メールフォーム側(View)への追記
お使いのテーマ内のmail_form.php(例: /theme/お使いのテーマ名/Elements/mail_form.php)をエディタ等で開き、送信ボタン(または「送信する」の記述)のすぐ上に、以下のコードを挿入(追記)します。
お使いのテーマ内にmail_form.phpが見当たらない場合は、コア側のBcMail本体(/lib/Baser/Plugin/Mail/View/Elements/mail_form.php)からコピーします。
<!-- Turnstileウィジェット表示 -->
<?php if (!empty($freezed)): ?>
<div class="cf-turnstile-container" style="margin: 25px 0; text-align: center;">
<div class="cf-turnstile"
data-sitekey="<?php echo h($turnstileSiteKey) ?>"
data-response-field-name="cf-turnstile-response"></div>
</div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<?php endif; ?>
※ data-response-field-name は必ず cf-turnstile-response のままで固定してください。
※ 例えば英語サイトなどでウィジェットの表記を英語にしたい場合などは、以下。
<!-- Turnstileウィジェット表示 -->
<?php if (!empty($freezed)): ?>
<div class="cf-turnstile-container" style="margin: 25px 0; text-align: center;">
<div class="cf-turnstile"
data-sitekey="<?php echo h($turnstileSiteKey) ?>"
data-response-field-name="cf-turnstile-response"
data-language="en"></div>
</div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<?php endif; ?>
注意事項
- デバッグモード(
debug: 1以上)時の挙動について baserCMS 4系の仕様により、デバッグモード有効時はテーマやビューのパスがキャッシュ(保存)されず、送信直後の完了画面(submit.php)が一時的にコア側の標準デザインを拾ってしまう場合がありますが、ノーマルモードでは、パスが固定されるため、正しくテーマ内の完了画面(submit.php)を表示、安定動作します。 - 他のスパムガード(KCAPTCHA / Google reCAPTCHA)との同時稼働について baserCMS標準搭載の「KCAPTCHA」や、他の「Google reCAPTCHA」プラグイン等と本プラグインを同時にON(稼働)にしても、システムがクラッシュするような致命的な不具合は起きないとおもいますが、画面遷移やユーザーの利便性の面で不都合が発生することも考えられますので、他のスパムガードと併用せず(すべて「無効(OFF)」に設定)に運用されることをお薦めします。
- テスト用キーの利用について 管理画面でキーを空欄のまま保存した場合は、自動的に「常に成功(合格)」となる公式テストキーが適用されます。また、エラー挙動(認証エラー)を検証したい場合は、常にエラーとなる公式テストキーを入力することでいつでも安全に防衛ラインをテストできます。
- アンインストール時 プラグインを削除(アンインストール)すると、データベース内の専用テーブルも自動でクリーンに消去されます。
ライセンス
本プラグインは MIT License のもとで公開されています。個人・商用問わず、自由に変形・再配布していただいて構いません。
HATTANTOCO