AI と共に PHP コンタクトフォームを作成=セキュリティ、多言語、ダークモード対応
コンタクトフォームの作成は Web サイト運営において基本中の基本であるが、突き詰めていくと実に奥が深いものだ。最初は単純なフォームで十分かと思いきや、スパム対策、ユーザ体験、デザイン性、そして何よりセキュリティを考慮し始めると、次から次へと課題が見えてくる。
今回、AI アシスタントとの対話を通じて、セキュアで高機能、かつモダンなデザインのコンタクトフォームを目指して試行錯誤を繰り返した。その道のりは、まさにデバッグと改善の連続であった。その開発過程と、理想のフォームを一発で生成するための最終版プロンプトを忘備録として公開する。
試行錯誤の記録:主な改善ポイントとデバッグの道のり
辿ってきた道のり(主な改善点):
- 基本の表示: まずはフォームが正しく表示されること。PHP がサーバーで実行されない初歩的な問題から始まった。
- セキュリティ強化:
- 基本対策: CSRF トークン、ハニーポット
- ボット対策: Google reCAPTCHA v3 の導入と検証
- 入力値処理:
filter_input
,htmlspecialchars
によるサニタイズ - HTTP ヘッダー: CSP (Content Security Policy), HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy の設定による多層防御
- セッション管理: セキュアなセッション設定と、送信成功時のセッション ID 再生成
- 追加バリデーション: 名前やメッセージ内容に対する形式チェック
- 機能とデザイン:
- UI / UX: ダークモード / ライトモード対応、フローティングラベルによるモダンな入力欄
- 多言語対応: 日本語 / 英語の切り替え機能
- 要件変更: 電話番号フィールドの削除
- 基調色変更: デザインコンセプトに合わせたカラーカスタマイズ
- サーバー・環境設定:
- エラーハンドリング: エラーログの重要性と設定方法の確認(
display_errors=Off
,log_errors=On
) - メール到達性: 迷惑メール判定の回避。
admin_email
に独自ドメインを使う重要性、SPF / DKIM レコードの必要性
- エラーハンドリング: エラーログの重要性と設定方法の確認(
- デバッグ:
- reCAPTCHA の
execution failed
エラーの原因究明(トラッキング防止、拡張機能、CSP) - JavaScript の
TypeError: form.submit is not a function
エラーの解決(HTML 要素のname
属性衝突)
- reCAPTCHA の
これらの経験とデバッグから得られた知見をすべて注ぎ込み、「これさえ伝えれば、あの高機能でセキュアなフォームを一発で生成してくれる」という、未来の自分のための究極のプロンプトが完成した。
【最終版】理想の PHP コンタクトフォーム生成プロンプト
これらの経験とデバッグから得られた知見をすべて注ぎ込み、「これさえ伝えれば、あの高機能でセキュアなフォームを一発で生成してくれる」という、未来の自分のための究極のプロンプトが完成した。
PHP コンタクトフォームのコードを、一回の指示で出力するためのプロンプトは以下の通りだ。多くの要件を含んでいるため、AI によっては完全に意図通りにならない可能性もある。また、生成されたコードは必ずレビューして、必要に応じて微調整して欲しい。
以下の要件を満たす、単一ファイルのPHPコンタクトフォームコードを生成してください。
**1. 基本機能:**
- 入力項目: 名前、メールアドレス、件名、メッセージ。
- 必須項目チェック、メールアドレス形式チェック、文字数制限(名前・件名: 100文字、メール: 255文字、メッセージ: 5000文字)。
- フォーム送信後、管理者宛に通知メールを送信。
- フォーム送信後、ユーザー宛に自動返信メールを送信。自動返信メールには「このメールに心当たりがない場合は破棄してください」という旨の注意書きを日本語・英語で含める。
**2. セキュリティ要件:**
- CSRF対策: セッショントークンを使用。
- ハニーポットフィールドを設置。
- Google reCAPTCHA v3 を使用(サイトキー、シークレットキーは `YOUR_RECAPTCHA_V3_SITE_KEY`, `YOUR_RECAPTCHA_V3_SECRET_KEY` のプレースホルダー)。
- 入力値は `filter_input` および `htmlspecialchars` でサニタイズ。
- メールヘッダーインジェクション対策を実施。
- 以下のHTTPセキュリティヘッダーを出力:
- `Content-Security-Policy` (nonce を使用し、`script-src` に `self`, `nonce`, Google関連ドメイン、`style-src` に `self`, Google Fonts, `unsafe-inline`、`font-src` に `self`, Google Fonts関連ドメイン、`connect-src` に `self`, Google関連ドメイン、`frame-src` に Google関連ドメイン、他は制限)
- `Strict-Transport-Security` (HTTPS接続時のみ、max-age=15552000)
- `X-Frame-Options: DENY`
- `X-Content-Type-Options: nosniff`
- `Referrer-Policy: strict-origin-when-cross-origin`
- `Permissions-Policy` (主要な不要機能を無効化: accelerometer, camera, geolocation, gyroscope, magnetometer, microphone, payment, usb)
- セキュアなPHPセッション設定 (`session.cookie_httponly=1`, `session.cookie_secure=auto`, `session.use_strict_mode=1`)。
- フォーム送信成功時にセッションIDを再生成 (`session_regenerate_id(true)`)。
- 追加の入力バリデーション: 名前に文字(\p{L}\p{M})とスペース以外が含まれていないか(`preg_match('/^[\p{L}\p{M}\s]+$/u', ...)`を使用)、メッセージにURL(`http:`, `https://`)が3つ以上含まれていないかチェック。
**3. デザイン・追加機能:**
- モダンでスタイリッシュなデザインを採用。
- ダークモード/ライトモード切り替え機能(右上トグル、localStorageに設定保存)。
- 日本語(`ja`)/英語(`en`)の言語切り替え機能(右上リンク、URLパラメータ `?lang=...`、セッションに設定保存)。
- デフォルト言語は **日本語 (`ja`)** とする。
- ライトモードの基調カラー(ヘッダー背景、ボタンなど)は `#003366` とする。ダークモードの基調色はライトブルー系とする。
- **電話番号の入力フィールドは含めない**。
- フォームフィールドにはフローティングラベルを使用。
**4. コード構造・前提:**
- HTMLの送信ボタンから `name="submit"` 属性を削除する。
- PHP側のフォーム送信判定は `$_SERVER['REQUEST_METHOD'] === 'POST'` を使用する。
- `$config['admin_email']` には、ウェブサイトと同じ独自ドメインのメールアドレスが設定されることを前提とし、プレースホルダーは `your-admin-email@your-domain.com` とする。
- メール送信は `mb_send_mail` を使用する実装とするが、PHPMailer等のライブラリ使用が推奨される旨をコメントで記載。
- SPF/DKIM/DMARC レコードのDNS設定は別途必要であることを前提とする。
- セキュリティヘッダー(特にCSP)は、実際のサイト構成に合わせて調整が必要な場合があることをコメントで記載。
- 設定値(サイト名、管理者メール、reCAPTCHAキー)は `YOUR_...` 形式のプレースホルダーで示す。
- PHPのエラー表示はデフォルトでOFF (`display_errors=0`)、エラーログは有効化が推奨される旨をコメントで記載。
- 言語データはPHP配列 `$lang_data` で管理する。
**出力形式:**
- 全体を単一のPHPファイル (`.php`) として出力。
- PHP、HTML、CSS、JavaScript をすべて含む。
プロンプト / 生成コード利用時のチェックリスト (重要事項リマインダー)
このプロンプト/コードを使う上での注意点 (自分へのリマインダー):
- プレースホルダーの置換:
YOUR_...
となっている箇所 (管理者メアド、reCAPTCHA キー、サイト名) は必ず実際の値に置き換える - サーバー設定:
- PHP の
mbstring
拡張機能が有効になっているか確認する - PHP のエラーログが出力されるようにサーバーを設定する (
php.ini
or.user.ini
) - メール送信元ドメインの SPF / DKIM / DMARC レコードを DNS に正しく設定する(迷惑メール判定対策)
- PHP の
- CSP ヘッダーの調整: もし Google Fonts や reCAPTCHA 以外にも外部ドメインのリソース (CDN の JS / CSS、画像、API など) を使う場合は、
Content-Security-Policy
ヘッダーの各ディレクティブ (script-src
,style-src
,img-src
,connect-src
など) に許可するドメインを追加する必要がある - HTTPS 必須: HSTS を有効にする場合は、サイト全体が HTTPS で運用されていることが前提
- メール送信ライブラリ:
mb_send_mail
は手軽だが、サーバー環境に依存しやすく確実性に欠ける場合がある。より安定したメール送信のためには、PHPMailer などのライブラリ導入を検討する - テスト: 必ず様々な環境 (ブラウザ、デバイス、言語設定、ダーク / ライトモード) で十分にテストを行う。特にフォームの送信、メールの受信、エラー処理、表示崩れがないかを確認する
おわりに:AI との協業と基本の重要性
長い道のりであったが、このプロンプトがあれば、将来同じような高品質なコンタクトフォームが必要になった際に、格段に効率よくスタートできるはず。AI との協業による開発の可能性と、基本設定・セキュリティの重要性を再認識する良い経験となった。
コメント
コメントを投稿