Contact Form With Captcha

By Delicon on Apr 17, 2008

Do you have a contact form on your site and you get spammed by bots constantly?
With this code you create contact form with a captcha image, and that will prevent bots

######################
##### contact.php ####
######################
<?php
@session_start();
if(isset($_POST['submit'])) {

if(($_POST['security_code'] == $_SESSION['security_code']) && (!empty($_SESSION['security_code'])) ) {

$to = "YOUR_MAIL_HERE";
$subject = "Form submission";
$name_field = $_POST['name'];
$email_field = $_POST['email'];
$message = $_POST['message'];

$body = "From: $name_field\n E-Mail: $email_field\n Message:\n $message";

mail($to, $subject, $body);
echo "Email was great success! I will email you back soon.";
unset($_SESSION['security_code']);
}
else {
unset($_SESSION['security_code']);
echo "Incorrect captcha code.";
}
}
?>
<p>
<form method="POST" action="">
<p>Your Name:<br />

<input type="text" name="name" size="19">
<br>
Your Email:<br />

<input type="text" name="email" size="19">
<br>
Your Message:<br />

<textarea rows="9" name="message" cols="30"></textarea>
</p>
<p><img src="captcha.php" /> <br>

Type the letters from the image above into this box:<br />
(This prevents Bots from sending me spam.)<br />
<input id="security_code" name="security_code" type="text" />
<br>
<input type="submit" value="Submit" name="submit">
</p>
</form>

#######################
##### captcha.php #####
#######################

<?php
session_start();

class CaptchaSecurityImages {

var $font = 'monofont.ttf';

function generateCode($characters) {
/* list all possible characters, similar looking characters and vowels have been removed */
$possible = '23456789bcdfghjkmnpqrstvwxyz';
$code = '';
$i = 0;
while ($i < $characters) {
$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
$i++;
}
return $code;
}

function CaptchaSecurityImages($width='120',$height='40',$characters='6') {
$code = $this->generateCode($characters);
/* font size will be 75% of the image height */
$font_size = $height * 0.75;
$image = imagecreate($width, $height) or die('Cannot initialize new GD image stream');
/* set the colours */
$background_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 20, 40, 100);
$noise_color = imagecolorallocate($image, 100, 120, 180);
/* generate random dots in background */
for( $i=0; $i<($width*$height)/3; $i++ ) {
imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
}
/* generate random lines in background */
for( $i=0; $i<($width*$height)/150; $i++ ) {
imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
}
/* create textbox and add text */
$textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
$x = ($width - $textbox[4])/2;
$y = ($height - $textbox[5])/2;
imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');
/* output captcha image to browser */
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
$_SESSION['security_code'] = $code;
}

}

$width = isset($_GET['width']) && $_GET['height'] < 600 ? $_GET['width'] : '120';
$height = isset($_GET['height']) && $_GET['height'] < 200 ? $_GET['height'] : '40';
$characters = isset($_GET['characters']) && $_GET['characters'] > 2 ? $_GET['characters'] : '6';

$captcha = new CaptchaSecurityImages($width,$height,$characters);

?>

Comments

Sign in to comment.
gwidaz   -  Mar 20, 2010

hmmm..any scripts doesnt work for me...then i register or send refferals from my web,i get my emails..but from these scripts dont..

 Respond  
Hawkee   -  Apr 17, 2008

Cool, but you might want to mention that this requires GD and the FreeType libraries.

 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.