|     |    | 
	 |  |   |              Terms of Agreement:    
	 By using this article, you agree to the following terms...    
	 1) You may use 
	 this article in your own programs (and may compile it into a program and distribute it in compiled format for languages that allow it) freely and with no charge.    
	 2) You MAY NOT redistribute this article (for example to a web site) without written permission from the original author. Failure to do so is a violation of copyright laws.    
	 3) You may link to this article from another website, but ONLY if it is not wrapped in a frame.  
	 4) You will abide by any additional copyright restrictions which the author may have placed in the article or article's description.   |      
 
  Image Verification Tutorial
   
    
    
    
    
    I'm sure many of you have logged on to Yahoo!, eBay or even here on Planet 
    Source Code and have run across the verification image containing numbers and 
    letters that you must plug into an input box for verification. And maybe you 
    thought, "What the heck is this for?" or "I wish I knew how to do that."  
    You wanna know--then I will show you how. 
     
    A script like this is usually used for further security of the user's 
    information--or, like on Planet Source Code, so that "unscrupulous people" 
    cannot use "HTTP Post code in their submissions to trick people into unknowingly 
    voting for them." 
     
    Okay, enough talk--let's get started. 
     
    First, I assume that you have PHP 4 with the GD library already installed. Also, 
    we will use session functions in this code to pass a varaible from one 
    page to the next. 
     
    To create our image, we need to send a header telling the connection that we are 
    about to send an image, we do that with the header function: 
    -------------------------------------------- 
     
     /*Send header*/ Header("Content-Type: image/png"); 
     
    -------------------------------------------- 
    We are going to be working with png images in this tutorial. But if you want to 
    use "jpeg", just plug it in where "png" is in the header. (You can also call a 
    "gif" image, but because of all the money stuff, most servers don't support it.) 
     
    I know your dying to get started building images, but first, we need to 
    get a little more prep work out the way. So, let's put those session 
    functions to work.  
    --------------------------------------------- 
     
    /* initialize a session. */ 
    session_start(); 
     
    /*We'll set this variable later.*/ 
    $new_string; 
     
    /*register the session variable. */ 
    session_register('new_string'); 
     
    ------------------------------------------------- 
    All we did above was start a new session with the session start function. 
    We will call this session on a different page that we will create later. 
    Second, we created a variable called new_string that we will give a value 
    to later. Lastly, we called the session register function: this function 
    takes the variable we created as an argument minus the "$" sign, also, you 
    must put it inside single quotes only. (An argument refers to the single 
    or comma separated information inside the parenthesis of a function.) 
     
    With that out the way, we can now begin to create our image. We start this 
    process by calling the create image function, which does 
    exactly what it says: Creates an image. --------------------------------------------- 
     
    /* set up image*/ 
    /*The first number is the width and the second is the height*/ $im = ImageCreate(200, 40);   
     
    ---------------------------------------------- I set the image Create() function to the variable $im. The variable $im will be 
    our pointer to the image we just created for the rest of the tutorial. The image 
    Create function take only two arguments and the arguments can only be 
    integers (numbers). The first argument is the width of the image in pixels, the 
    second, you guessed it, is the height.  
     
    Let's give our image some color. ---------------------------------------------- 
     
    /*creates two variable to store color*/ 
    $white = ImageColorAllocate($im, 255, 255, 255); $black = ImageColorAllocate($im, 0, 0, 0); 
     
    ---------------------------------------------- 
    I called the Image Color Allocate function twice. The first time is to set the 
    color for white, the second to set the color for black. The function take 4 
    arguments: The image pointer variable $im, and the RGB (red, green, blue) 
    components that are separated by commas.  (255, 255, 255, is the code for white, while 0, 0, 0, is the code for black. You 
    can play with the numbers to produce any color you want.) 
    At this point we have a png image and two colors. Now we will create a random 
    string generator to place as the verification code inside the image. I won't 
    discuss how the random generator code works, but will only lay out the code with 
    comments. ------------------------------------------------ 
     
    /*random string generator.*/ /*The seed for the random number*/ 
    srand((double)microtime()*1000000);  
     
    /*Runs the string through the md5 function--which is a function that encrypts 
    a string, changing it into a 32 character string composed of numbers and 
    lowercase letters*/
  
    $string = md5(rand(0,9999));  
     
    /*Creates the new string. The first number is the point in 
    the 32 character string where we will pull our string from. In other words, PHP 
    will count (beginning at 0) 17 characters into the string. The 18th character in 
    will be our beginning point (remember, PHP starts counting from 0). From there, 
    PHP counts 5 characters from that point, and thus, we get our five character 
    string. The second number is the length of our string--changing this number will 
    give us different string lengths.*/ 
    $new_string = substr($string, 17, 5);  
    -------------------------------------------------
     
     
    Moving on--Now let's fill the image with color. 
    ------------------------------------------------- 
     
     /*fill image with black*/ ImageFill($im, 0, 0, $black); 
     
    --------------------------------------------------- 
    The Image Fill function is called first. It takes 4 arguments: Again we add the 
    image pointer variable $im, the second and third are x, y coordinates in 
    our image, 0, 0, being at the top left corner. Our image size is 200x40, 
    therefore, the bottom right corner would be 200, 40. The fourth argument tell 
    us with what color to fill the image with: In our case it is black. 
     
    Now, let's add the string we just created to our image.  
    ---------------------------------------------------- 
     
     /*write string at coordinates (70,10) in the color white. 
    (70, 10) puts the string almost in the middle of the image.*/ 
    ImageString($im, 4, 70, 10, $new_string, $white); 
     
    ----------------------------------------------------- 
    We have yet another function: Image String, and yes, it adds a string to our 
    image. It takes six arguments. The first is the image pointer variable, the 
    second argument can be any number from 1 to 5,(which calls for one of the built in fonts). 
    The next two arguments are the coordinates, first the x (width) then the y 
    (height). This is for the placement of our string. The next argument calls for the string 
    variable. In our case it is $new_string. The last argument is the variable containing the color, which is 
    $white. 
     
    We end the image build by outputting our image using the code below: 
    ----------------------------------------------------- 
     
     /*output to browser*/ ImagePNG($im, "verify.png"); 
    ImageDestroy($im);  
     
    ------------------------------------------------------ 
    We have the imagePNG function with two arguments: again, like always the image 
    pointer, the second argument names the image "verify.png" and saves the 
    image in 
    the current directory. If you want the image in a different directory, proceed "verify.png" 
    with the path to the directory.  
     
    Hey, we're through building the image.  
     
    Finally, 
    input the Image Destroy function, it has one argument: the pointer variable. 
    Destroying the image frees up server memory. Your server administrator will like 
    you for this. Your code should look like this: 
    ----------------------------------------------------- 
     
    <?php 
     /*header*/ Header("Content-Type: image/png"); 
     
    /* initialize a session. */ 
    session_start(); 
     
    /*We'll set this variable later.*/ 
    $new_string; 
     
    /*register the session variable. */ 
    session_register('new_string'); 
     
    /*You will need these two lines below.*/ 
    echo "<html><head><title>Verification</title></head>"; echo "<body>";
    /* set up image, the first number is the width and the 
    second is the height*/ $im = ImageCreate(200, 40);  
     /*creates two variables to store color*/ $white = ImageColorAllocate($im, 255, 255, 255); $black = ImageColorAllocate($im, 0, 0, 0); 
     /*random string generator.*/ /*The seed for the random number*/ 
    srand((double)microtime()*1000000);  
     /*Runs the string through the md5 function*/ $string = md5(rand(0,9999));  
     
    /*creates the new string. */ $new_string = substr($string, 17, 5); 
     
     /*fill image with black*/ ImageFill($im, 0, 0, $black); 
      /*writes string */ ImageString($im, 4, 96, 19, $new_string, $white); 
     
    /* output to browser*/ ImagePNG($im, "verify.png"); 
    ImageDestroy($im);  
    ?> 
    --------------------------------------------------- 
    Now place a form input box below our image (see the code below), and ask the 
    user to input the string they see in the image in the text box. Append this code 
    to the bottom of the code above, before the "?>."  
    --------------------------------------------------- 
     
    /*I plugged our image in like I would any other image.*/ 
    echo "<img src=\"verify.png\">"; echo "<br><br>"; echo "Type the code you see in the image in the box below. (case sensitive)"; 
    echo " <form action=\"formhandler.php\" method=post>"; echo "<input name=\"random\" type=\"text\" value=\"\">"; echo "<input type=\"submit\">"; echo "</form>"; echo "</body>"; echo "</html>"; 
     
     
    --------------------------------------------------- 
    With that done, we must now create a new file and name it formhandler.php. 
    We will put the code below into it. 
    --------------------------------------------------- 
     
    <?php 
    /*This starts the session that we created on the 
    last page*/ 
    session_start();  
     
    /*This trims the random variable of any white space 
    that the user may have unknowingly put in.*/ 
    $random = trim($random); 
     
    /*Below is a conditional statement: In English it reads, if 
    the string that the user put into the text box is equal to what is in the image 
    then print to the screen, "You are verified."  If they are not equal it tells the 
    user to go back and try again.*/ 
     
    /*We can use the variable $new_string because we 
    registered it into our session on the last page, it retains its value that 
    it had on the first page.*/ 
    if ($new_string == $random){ echo "You are verified"; 
    } 
    else{ echo "Please go back and get verified."; 
    } ?> 
     
    There you are. Try it out. IF you have any trouble send me an e-mail. And that's 
    that. 
     
    Thanks to comments left below, this article has been updated by the 
    Author. 
    Please Rate this Tutorial!!! 
       | 
     
     
    
     
 |    |     Other 2 submission(s) by this author
  |     |    |   |  | Report Bad Submission |     |   |   |  | Your Vote! |  | 
See Voting Log  |  |   |  | Other User Comments |  9/11/2002 2:19:51 AM:Mehdi Hanbali Bravo, EXCELLENT code. I haven't seen 
something this useful in a long time. 
Good work, totally worth a perfect 
score.  
  |  9/11/2002 10:51:06 AM: I really liked the code.  Very 
impressive.  I do mention one thing 
though that will improve the code a 
little bit.  If I understand the code 
correctly, you are passing the 
verification code back to the form as a 
form element, a hidden one, but a form 
element no less.  This would allow the 
user to write a program which looks at 
the HTML code and type in the 
verification code.  This would defeat 
the purpose.  To make it even stronger, 
it would be best to remove this from 
the code and put it in a session, or a 
hash that you load each time, but 
something that would keep it invisible 
from the user.
Thanks for sharing 
the code.  It was really good.  
  |  9/11/2002 11:34:41 AM: Very nice indeed.  
  |  9/15/2002 7:26:17 PM: This is horrible... absolutely 
worthless!  just kidding, couldn't 
complain if I had to.  Nice code!  
  |  9/15/2002 10:32:16 PM:Darryl Porter I had to pick my lip off the floor 
before I could continue to read--Thanks 
for the feedback--  
  |  9/18/2002 5:04:33 AM:david.emmo very nice! thanks! not sure i'd use it 
in the way you've described but very 
useful all the same!  
  |  9/18/2002 5:08:48 AM:david.emmo oooh...and when i rated it, guess what 
i had to do...? :)  
  |  10/6/2002 2:55:45 PM:Alex Graf Hi. I looked through your code again. 
Well, true, it only differs from mine 
in this minor detail: You use one font 
for writing the Text. I use 5 different 
ones instead. So, one could use an OCR 
program to read the string. But since 
this is quite unlikely, well.... um. I 
wrote in mail that i´m sorry, if it 
looked like i was stealing your code. I 
didn´t intend to. I think we only had 
the same idea. Please forgive me. 
:(
Alex  
  |   |      |   Add Your Feedback! |        Note:Not only will your feedback be posted, but an email will be sent to the code's author in your name.
  NOTICE: The author of this article has been kind enough to share it with you.  If you have a criticism, please state it politely or it will be deleted.
  For feedback not related to this particular article, please click here.     |       |           |