Pergunta

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.

Foi útil?

Solução

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

Outras dicas

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top