Question

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.

Était-ce utile?

La solution

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.

E.G:

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

Autres conseils

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top