
お問い合わせフォームや資料請求フォームなど、Webサイトには欠かせないフォーム機能。ただ便利な一方で、スパムの温床になっている代物でもあります。
最近はAIや自動化ツールを活用したスパムボットも登場し、日本語サイトでも日に日に増加している傾向にあります。「突然、英語の迷惑メールが大量に届いた」「意味不明な文字列が大量に送信されていた」――そんな経験あるのではないでしょうか。
メールフォームのスパム対策として今回紹介するのが、ハニーポットと高速送信(タイムトラップ)です。それはなんぞやと言いますと…
- ハニーポット:ユーザーには見えないフィールドを仕込んでボットを引っかける
- 高速送信対策:人間の入力スピードでは不可能な高速送信をブロックする
簡単に説明するとこんな仕組みになります。この記事では、PHPで実装するハニーポット+高速送信対策の方法と注意点をわかりやすく解説します。さらにそのままコピペOKな実用的なコード例を用意しました。
「最近スパムが増えて困っている」「手軽にフォームのセキュリティを上げたい」そんな方は、ぜひこの記事を参考に、自分のサイトにも取り入れてみてください!
ハニーポットとは?なぜ有効なのか
仕組みはとてもシンプルで、ハニーポットはフォーム内に「ユーザーには見えない」ダミーの入力フィールドを入れる方法です。一般的なHTML例はこんな形になります。
<div aria-hidden="true" style="display: none;">
<label for="honeypot">自由記述欄</label>
<input type="text" id="honeypot" name="honeypot" tabindex="-1" autocomplete="off">
</div>
[display: none]が入っているため、ユーザーはこのフィールドを目にしませんが、ボットはHTMLソースを機械的に解析して全フィールドに入力する傾向があります。つまり、この honeypot
に何か入っていたらスパム投稿だと判断できるわけです。
実際にどう判定する?
PHP側でのチェック方法はとてもシンプルです。フォームが送信されたときに、「honeypot」という名前のフィールドに値が入っていないか」を確認するだけ。以下はその具体的なコード例です。
<?php
$honeypot = isset($_POST['honeypot']) ? trim($_POST['honeypot']) : '';
if (!empty($honeypot)) {
header('Location: error.html');
exit;
}
?>
このたった数行のコードで、機械的に送信してくるボットの大半をシャットアウトすることができます。軽量なので、サーバーへの負荷もほとんどありません。
高速送信(タイムトラップ)対策とは?
最近のボットはハニーポットを回避するものも登場しています。そこで追加の対策として有効なのが「高速送信チェック」です。
フォームが表示されてから送信されるまでの経過時間を測り、例えば 5秒未満 の送信はスパム判定する、という仕組みです。
HTML側の実装例
フォーム内に hiddenフィールドを追加し、JavaScriptでページ表示時のUNIXタイムを入れます。
<input type="hidden" name="FormDisplayTime" id="FormDisplayTime">
<script>
window.onload = function() {
var now = Math.floor(Date.now() / 1000); // UNIXタイム
document.getElementById("FormDisplayTime").value = now;
};
</script>
PHP側のチェック例
<?php
$formDisplayTime = isset($_POST['FormDisplayTime']) ? (int)$_POST['FormDisplayTime'] : 0;
$currentTime = time();
$elapsedSeconds = $currentTime - $formDisplayTime;
if ($elapsedSeconds < 5) {
header('Location: error.html');
exit;
}
?>
たったこれだけです。JavaScriptが有効な場合に限って動作するので、人間がちゃんと入力して送信した場合は問題ありません。
ハニーポット+高速送信対策の完全コード例
HTML
<form action="contact.php" method="post">
<input type="text" name="name" placeholder="お名前">
<input type="email" name="email" placeholder="メールアドレス">
<!-- ハニーポット -->
<div aria-hidden="true" style="display: none;">
<label for="honeypot">自由記述</label>
<input type="text" id="honeypot" name="honeypot" tabindex="-1" autocomplete="off">
</div>
<!-- タイムトラップ -->
<input type="hidden" name="FormDisplayTime" id="FormDisplayTime">
<script>
window.onload = function() {
var now = Math.floor(Date.now() / 1000); // UNIXタイム
document.getElementById("FormDisplayTime").value = now;
};
</script>
<button type="submit">送信する</button>
</form>
PHP
<?php
// ハニーポットチェック
$honeypot = isset($_POST['honeypot']) ? trim($_POST['honeypot']) : '';
if (!empty($honeypot)) {
header('Location: error.html');
exit;
}
// タイムトラップチェック
$formDisplayTime = isset($_POST['FormDisplayTime']) ? (int)$_POST['FormDisplayTime'] : 0;
$currentTime = time();
$elapsedSeconds = $currentTime - $formDisplayTime;
if ($elapsedSeconds < 5) {
header('Location: error.html');
exit;
}
// 本来の処理(メール送信など)
$to = "example@example.com";
$subject = "お問い合わせがありました";
$message = "お名前: " . $_POST['name'] . "\n";
$message .= "メールアドレス: " . $_POST['email'] . "\n";
$headers = "From: " . $_POST['email'] . "\r\n";
if (mail($to, $subject, $message, $headers)) {
header('Location: thanks.html');
} else {
header('Location: error.html');
}
exit;
?>
ハニーポットと高速送信対策フォーム導入まとめ
ハニーポットは、もっとも手軽に導入できるスパム対策です。
画像認証と違って、サイトの見た目やユーザー操作に影響せず、通常の利用者はまったく違和感なくフォームを使えるのが利点です。さらに、HTML数行を加えるだけの簡単な方法なので、初心者の方にもおすすめです。
フォーム内に「ユーザーには見えないダミーの入力欄」を用意するだけなので、サイトの見た目や操作性に一切影響を与えません。古くから使われている方法ですが、その効果は今でも高く、単純なボットはこの隠しフィールドにもデータを入力してしまうため、スパム判定が非常にしやすいのが特徴です。
ただし、最近の高性能なスパムボット(AI型やカスタマイズ型)はHTML構造を解析し、こうしたダミーフィールドをスキップするような挙動を見せるケースもあります。そのため「ハニーポットだけ」で完璧に防げるわけではありません。
一方のタイムトラップは、フォームが表示されてから送信されるまでの「人間らしい操作時間」に着目した対策です。
たとえば、通常のユーザーであればフォームを開いてから少なくとも数十秒程度はかかりますが、スパムボットは1秒以内に即座に送信することもあります。この挙動を利用して、異常に高速な送信をブロックするのがタイムトラップの役割です。
この方法は、ハニーポットのように「見える/見えない」といった仕掛けではなく、行動パターンそのものを基準に判定するため、より進化したスパムボットにも有効です。ただし、JavaScriptが無効な環境では判定が甘くなる可能性がありますし、しきい値(何秒未満をブロックするか)はフォーム内容やユーザー層に応じて調整が必要になる点に注意が必要です。
両者は性質が異なる対策なので、「ハニーポット+タイムトラップ」を併用することで、より幅広いスパム対策が実現できます。