Go4Expert (http://www.go4expert.com/)
-   PHP (http://www.go4expert.com/articles/php-tutorials/)
-   -   How to Make Your Own PHP Captcha Generator (http://www.go4expert.com/articles/php-captcha-generator-t26451/)

ManzZup 7Aug2011 15:22

How to Make Your Own PHP Captcha Generator
In this article we will create file based simple yet successful captcha generator.

3 Major Anti-spamming techniques used?
  1. Mathematical Operation like Random number + Random Number = -> The user must specify the answer
  2. Random word -> User must type the word
  3. Random question -> Obvious one which the user should answer correctly [ex: Are you human?]
How Captcha works?
  1. The captcha generator generates an IMAGE with the question and then put up a session variable storing the value.
  2. User input though an input box.
  3. Using php POST, we compare the session variable data with the user input and tell whether its a bot or human. Its coding time :)

The Code

  1. First let's write the php script which generates the captcha image. We use the simple header-content change technique, from which we can easily bring up an image from a given text.

    PHP Code:

    //This should be the first line as in the rule book :D
    //These variables store the Question and the answer
    $ques "";
    $ans "";
    //This is the MAJOR array, this holds all the random things, like the question you need to ask. You can add up new ones easily
    $words = array(
    => array("Num" => "Num"),
    => array("Are you human?" => "yes"),
    => array("Type 'one' " => "one"),
    => array("Type 'test' " => "test"),
    => array("AxHGA" => "AxHGA"),
    => array("zontek" => "zontek"),
    => array("12terd " => "12terd")
    //Now we need to pic up a random question, array_rand is the perfect thing to this
    $r array_rand($words);
    //Then we check about what we have in the select array
    //If we have the "NUM" selected, that is a special one
            //Num means the user will be prompted to doa simple addition like 5+6
    case "Num":
    //Pretty basic stuff, generate 2 random numbers and tell the user to put the addition
    $i rand(1,10);
    $j rand(1,10);
    $ans $i+$j;
    $ques "$i + $j = ";
    //If not a number, ask the user a question or ask him to type a word
    $key key($words[$r]);
    $ques $key;
    $ans $words[$r][$key];

    //NOW we put up the answer to the session variable
    $_SESSION['cap'] = strtolower($ans);
    //This would change the content type, or in english this would tell the browser that
    //what ever retuened by this script is an image
    header('Content-Type: image/png');

    //Following code is to generate the image from the test
    //We first specify colour ranges, you can refer to the php manaul for more
    $img imagecreatetruecolor(250,30);
    //In the above code, the image size is set to 250x30
    $white imagecolorallocate($img,255,255,255);
    $grey imagecolorallocate($img,128,128,128);
    $black imagecolorallocate($img,0,0,0);
    //Filling the rectangle with white as we need black text on white
    $text $ques;
    //THE below code is CRITICAL. This is the palce where we tell which font to use.
    //Choose any ttf you like and name it as font.ttf or change the following code, make sue
    //you put the path to the file correctly [i used STENCIL so that parsers will find it hard to detect]
    $font "./font.ttf";
    //Creating a PNG image, i use png cuz i <3 png [really its so small and efficient ;)]
    //And then remove the memory parts once the output is given

  2. Haa that's all :D But you still need to know how to use the thing. We make our index.php and ask the user for the input as determine whether it is a spammer or not.


    PHP Code:

    //This is the code for comparing the user input against the session variable
    $cap $_POST['captcha'];
    $_SESSION['cap']==strtolower($cap)) echo "Okay you are human :)";
            else echo 
    "Off You go BOT / SPAMMER!!";
    <title>Simple Captcha Script</title>
    <form action="index.php" method="post">
    <img src="captcha.php" align="absmiddle" />
    <!-- NOTE how the captcha.php is used as an image link, that's a whole new way to think -->
    <input type="text" size="20" name="captcha" /><br />
    <input type="submit" name="done" value="Login" />

  3. Upload the stuff and make sure you have the following files in the same directory level : index.php captcha.php font.ttf

It's done, now you have your own little cpatcha script, well this is really basic, but once you know what to do you have no limits :D

Feel free to develop the code [and be kind enough to send me one as well :)]

See the demo of the script here : http://expementa.freezoka.net/captcha/

That's all for today

See ya all with some other thing (no promises today though :D)

shabbir 7Aug2011 19:21

Re: How to Make Your Own PHP Captcha Generator
You missed the font.ttf.

ManzZup 7Aug2011 20:06

Re: How to Make Your Own PHP Captcha Generator
i used the STENCIL.ttf as i have told
but you can use any true type font

nabila1230 13Sep2011 12:49

Re: How to Make Your Own PHP Captcha Generator
thank you brother to share such a great and help full sharing, keep it up

ManzZup 16Sep2011 21:25

Re: How to Make Your Own PHP Captcha Generator
pleasurez mine :D

donor 13Jan2012 11:39

Re: How to Make Your Own PHP Captcha Generator

//Start the session so we can store what the security code actually is

//Send a generated image to the browser

function create_image()
    //Let's generate a totally random string using md5
    $md5_hash = md5(rand(0,999));
    //We don't need a 32 character long string so we trim it down to 5
    $security_code = substr($md5_hash, 15, 5);

    //Set the session to store the security code
    $_SESSION["security_code"] = $security_code;

    //Set the image width and height
    $width = 100;
    $height = 20; 

    //Create the image resource
    $image = ImageCreate($width, $height); 

    //We are making three colors, white, black and gray
    $white = ImageColorAllocate($image, 255, 255, 255);
    $black = ImageColorAllocate($image, 0, 0, 0);
    $grey = ImageColorAllocate($image, 204, 204, 204);

    //Make the background black
    ImageFill($image, 0, 0, $black);

    //Add randomly generated string in white to the image
    ImageString($image, 3, 30, 3, $security_code, $white);

    //Throw in some lines to make it a little bit harder for any bots to break
    imageline($image, 0, $height/2, $width, $height/2, $grey);
    imageline($image, $width/2, 0, $width/2, $height, $grey);
    //Tell the browser what kind of file is come in
    header("Content-Type: image/jpeg");

    //Output the newly created image in jpeg format
    //Free up resources

All times are GMT +5.5. The time now is 21:27.