Spam bots can be a real headache when it comes to online forms. One of the easiest and most effective methods to prevent spam is using a honeypot — a simple trick that doesn’t require JavaScript or CAPTCHAs.
In this tutorial, you’ll learn how to apply the honeypot technique in a contact form using just HTML and PHP — step by step.
🧠 What Is a Honeypot?
A honeypot is a hidden field in your form that users don’t see, but bots (which autofill all fields) will likely fill in. If that field contains any value, you can assume it’s spam and block the submission.
It’s invisible to real users but effective against basic bots.
🧱 Step 1: Create the HTML Form
Here’s a basic contact form with a honeypot field added.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Honeypot Form</title>
<style>
.honeypot {
display: none;
}
</style>
</head>
<body>
<h2>Contact Us</h2>
<form action="process.php" method="POST">
<label>Name:</label><br />
<input type="text" name="name" required /><br /><br />
<label>Email:</label><br />
<input type="email" name="email" required /><br /><br />
<label>Message:</label><br />
<textarea name="message" required></textarea><br /><br />
<!-- Honeypot field -->
<div class="honeypot">
<label>Leave this field empty</label>
<input type="text" name="website" />
</div>
<button type="submit">Send</button>
</form>
</body>
</html>
✅ Why the Honeypot Works:
- Real users won’t see or fill in the
website
field. - Bots that fill all fields will submit a value in
website
. - You can then block the form submission based on that.
📤 Step 2: Validate the Honeypot in PHP
In your process.php
file, add a simple check:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Honeypot check
if (!empty($_POST['website'])) {
// Spam detected
echo "Spam detected. Submission blocked.";
exit;
}
// Get form data
$name = htmlspecialchars($_POST['name']);
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
$message = htmlspecialchars($_POST['message']);
// Continue processing (e.g. send email)
echo "Message sent successfully!";
}
?>
✅ Explanation:
empty($_POST['website'])
: The field should be empty — if not, we block it.htmlspecialchars()
andfilter_var()
are used to sanitize inputs (good practice).- You can add email sending with
mail()
or PHPMailer.
🔒 Bonus: Hide the Honeypot Field Better
To avoid bots detecting the field by class name, use a more generic name like contact_time
or use CSS off-screen positioning instead of display: none
:
.honeypot {
position: absolute;
left: -9999px;
}
✅ Final Result
You now have a contact form with an invisible honeypot field that:
- Blocks basic spam bots
- Doesn’t require CAPTCHAs or JavaScript
- Works with plain HTML and PHP
- Follows best practices for validation and security