セキュリティ対策を重視したお問い合わせフォーム実装
- LOGZA WEB
- ホームページ制作の技術的な取り組み
- セキュリティ対策を重視したお問い合わせフォーム実装
お問い合わせフォームは、Webサイトにおいて重要な機能のひとつですが、スパム投稿や不正アクセスの対象になりやすい部分でもあります。
ここでは、LOGZA WEB(ログザウェブ)が実際の制作現場で行っている実装方法をもとに、安全性を重視したお問い合わせフォームの構成、セキュリティ対策、運用時のポイントまでをまとめています。
ファイル構成
お問い合わせフォームは、入力ページ・送信処理・完了ページの構成で実装しています。
送信処理は別ファイルとして分離するのではなく、共通処理ディレクトリ(phps)内にまとめる構成を採用しています。
index.php ← トップページ
├─ contact/
│ ├─ index.php ← お問い合わせ入力ページ
│ ├─ comp.php ← 送信完了ページ
│ └─ .htaccess ← アクセス制限設定
│
└─ phps/
└─ contact.php ← 送信処理(メール送信・バリデーション)
お問い合わせフォーム画面(入力ページ)
お問い合わせフォームは、スパム投稿や不正リクエストの対象になりやすいため、セキュリティ対策としてCSRFトークンとGoogle reCAPTCHAを実装しています。
CSRFトークンは、外部サイトからの不正なフォーム送信を防止するために使用します。
Google reCAPTCHAは、自動送信ボットによるスパム投稿を防止する目的で導入しています。
<form method="post" action="">
<!-- CSRFトークン -->
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES, 'UTF-8'); ?>">
<!-- 入力項目 -->
お名前
メールアドレス
電話番号
お問い合わせ内容
<!-- reCAPTCHA -->
<div class="g-recaptcha" data-sitekey="サイトキー" ></div>
<input type="submit" name="mailbtn" value="メール送信">
</form>
<!-- reCAPTCHA読み込みJS -->
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
送信処理(contact.php)
フォーム送信後の処理は、共通処理ファイル(phps/contact.php)にて一括管理しています。
CSRF検証・reCAPTCHA検証・入力値チェック・メール送信までを順番に処理する構成となっています。
CSRFトークンの生成と検証
CSRF対策として、セッションにランダムなトークンを生成し、フォーム送信時に同じ値かどうかを検証しています。
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
Google reCAPTCHAによるボット対策
Google reCAPTCHAを使用して、人間による操作かどうかを判定しています。
$response = file_get_contents($verify_url);
$response_keys = json_decode($response, true);
入力内容のスパム判定
URLを含む投稿や日本語を含まない投稿はスパムの可能性が高いため、独自のフィルタ処理を実装しています。
elseif (stripos($msg, 'http') !== false) {
$error_message = 'スパムの可能性があるため送信できません。';
}
PHPMailerによるSMTP送信
メール送信にはPHPMailerを使用し、SMTP認証を通した安全な送信方式を採用しています。
$mail->isSMTP();
$mail->Host = SMTP_HOST;
$mail->SMTPAuth = true;
メール送信エラー時の通知処理
メール送信処理では、万が一SMTP送信に失敗した場合でも管理者が状況を把握できるよう、エラー通知メールを送信する仕組みを実装しています。
これにより、お客様は送信完了しているにも関わらず管理者側にメールが届いていないといったトラブルを防止し、迅速な対応が可能になります。
catch (\PHPMailer\PHPMailer\Exception $e) {
$error_subject = "【LOGZAWEB】メール送信エラー通知";
mb_send_mail(
"info@logza.jp",
$error_subject,
$error_body,
"From: info@logza.jp"
);
}
.htaccessによる国外アクセス制限
お問い合わせフォームは海外からのスパム投稿が多いため、セキュリティ対策として国外アクセス制限を実装しています。
GeoIP(IPアドレスの国判定)を利用し、日本国内からのアクセスのみ許可することで、不正投稿やボットアクセスを大幅に削減しています。
また、Googleなど検索エンジンのクローラーやサイト確認ファイルについては例外として許可しています。
<IfModule mod_maxminddb.c>
MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
Order deny,allow
deny from all
# 日本のアクセスのみ許可
SetEnvIf MM_COUNTRY_CODE JP SupportCountry
# --- Google公式Bot(最新含む) ---
SetEnvIf User-Agent "Googlebot" AllowBot
SetEnvIf User-Agent "Google-InspectionTool" AllowBot
SetEnvIf User-Agent "GoogleOther" AllowBot
SetEnvIf User-Agent "Google Favicon" AllowBot
SetEnvIf User-Agent "Chrome-Lighthouse" AllowBot
SetEnvIf User-Agent "Lighthouse" AllowBot
# Yahoo / Bing
SetEnvIf User-Agent "(bing|msn)bot" AllowBot
SetEnvIf User-Agent "Y!J" AllowBot
Allow from env=SupportCountry
Allow from env=AllowBot
Allow from 127.0.0.1
</IfModule>
<IfModule mod_geoip.c>
GeoIPEnable On
Order deny,allow
deny from all
SetEnvIf GEOIP_COUNTRY_CODE JP SupportCountry
# --- Google公式Bot(最新含む) ---
SetEnvIf User-Agent "Googlebot" AllowBot
SetEnvIf User-Agent "Google-InspectionTool" AllowBot
SetEnvIf User-Agent "GoogleOther" AllowBot
SetEnvIf User-Agent "Google Favicon" AllowBot
SetEnvIf User-Agent "Chrome-Lighthouse" AllowBot
SetEnvIf User-Agent "Lighthouse" AllowBot
SetEnvIf User-Agent "(bing|msn)bot" AllowBot
SetEnvIf User-Agent "Y!J" AllowBot
Allow from env=SupportCountry
Allow from env=AllowBot
Allow from 127.0.0.1
</IfModule>
# Google Search Console の確認ファイルだけ許可
<FilesMatch "^google[0-9a-f]+\.html$">
Order allow,deny
Allow from all
</FilesMatch>
自動返信メールの仕組み
お問い合わせ送信後は、お客様へ自動返信メールを送信すると同時に、管理者へ通知メールを送信する仕組みを実装しています。
これにより、お客様は送信完了を確認でき、管理者側では新しいお問い合わせを即時把握することが可能になります。
メール送信にはPHPMailerを使用し、SMTP認証を通した安全な送信方式を採用しています。
$subject = "【LOGZAWEB】自動返信メール";
sendMail($email, $name, $subject, $body); // お客様宛
sendMail(SMTP_USER, 'LOGZAWEB', $subject, $body, true); // 管理者宛 + BCC
まとめ
お問い合わせフォームは、Webサイトの中でも特に攻撃対象になりやすい機能のひとつです。
そのため、単一の対策ではなく複数のセキュリティ対策を組み合わせて実装することが重要になります。
- CSRFトークンによる不正送信防止
- Google reCAPTCHAによるボット対策
- 入力内容の独自スパム判定
- PHPMailerによるSMTP安全送信
- 送信エラー時の通知処理
- .htaccessによる国外アクセス制限
- 自動返信メールによるユーザー通知
LOGZA WEBでは、安全性と運用性の両方を考慮したお問い合わせフォームの実装を行っています。