Here is my /tools/showCaptcha.php
:
<?php
session_start();
header('Content-Type: image/png');
/**
* This file generates a captcha string, writes it into the $_SESSION['captcha']
* and renders a fresh captcha graphic file to the browser.
*
* In the views you can use this by saying:
* <img src="tools/showCaptcha.php" />
*
* Check if the typed captcha is correct by saying:
* if ($_POST["captcha"] == $_SESSION['captcha']) { ... } else { ... }
*/
// target captcha string length
$iCaptchaLength = 4;
// following letters are excluded from captcha: I, O, Q, S, 0, 1, 5
$str_choice = 'ABCDEFGHJKLMNPRTUVWXYZ2346789';
$str_captcha = '';
// create target captcha with letters coming from $str_choice
for ($i = 0; $i < $iCaptchaLength; $i++)
{
do
{
$ipos = rand(0, strlen($str_choice) - 1);
// checks that each letter is used only once
}
while (stripos($str_captcha, $str_choice[$ipos]) !== false);
$str_captcha.= $str_choice[$ipos];
}
// write the captcha into a SESSION variable
$_SESSION['captcha'] = $str_captcha;
// begin to create the image with PHP's GD tools
$im = imagecreatetruecolor(150, 70);
$bg = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $bg);
// create background with 1000 short lines
/*for ($i = 0; $i < 1000; $i++)
{
$lines = imagecolorallocate($im, rand(200, 220) , rand(200, 220) , rand(200, 220));
$start_x = rand(0, 150);
$start_y = rand(0, 70);
$end_x = $start_x + rand(0, 5);
$end_y = $start_y + rand(0, 5);
imageline($im, $start_x, $start_y, $end_x, $end_y, $lines);
}
*/
// create letters. for more info on how this works, please
// @see php.net/manual/en/function.imagefttext.php
// TODO: put the font path into the config
for ($i = 0; $i < $iCaptchaLength; $i++)
{
$text_color = imagecolorallocate($im, rand(0, 100) , rand(10, 100) , rand(0, 100));
// font-path relative to this file
imagefttext($im, 35, rand(-10, 10) , 20 + ($i * 30) + rand(-5, +5) , 35 + rand(10, 30) , $text_color, '/fonts/times_new_yorker.ttf', $str_captcha[$i]);
}
// send http-header to prevent image caching (so we always see a fresh captcha image)
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, proxy-revalidate');
// send image to browser and destroy image from php "cache"
imagepng($im);
imagedestroy($im);
?>
Am I doing something wrong? I've tried all that I can think to change but reverted back to the first version. It worked before I added it all into my template file. But I can't find any reason that it would change.
All that is displayed is the little "PNG Not Found" painting.
Many thanks to tharindu_DG and any others that took a look at my question. tharindu_DG brought to my attention that GD based captchas don't work with some servers. Before I had a chance to edit this post, I switched to reCAPTCHA and it is working flawlessly.
Again, thank you to tharindu_DG!
Try using reCAPTCHA . In some hosting servers, GD based captcha doesn't work. I have experienced it. It can be used with out GD library. It loads captcha images from a external service and validates using public key cryptography. So NO internal generation of captcha images. Very easy to use.
EG:
Front End :
<html>
<body> <!-- the body tag is required or the CAPTCHA may not show on some browsers -->
<!-- your HTML content -->
<form method="post" action="verify.php">
<?php
require_once('recaptchalib.php');
$publickey = "your_public_key"; // you got this from the signup page
echo recaptcha_get_html($publickey);
?>
<input type="submit" />
</form>
<!-- more of your HTML content -->
</body>
</html>
Back End Validation :
<?php
require_once('recaptchalib.php');
$privatekey = "your_private_key";
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
// What happens when the CAPTCHA was entered incorrectly
die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
"(reCAPTCHA said: " . $resp->error . ")");
} else {
// Your code here to handle a successful verification
}
?>
For More info Visit : https://developers.google.com/recaptcha/docs/php
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.