Open Source Desktop Web (OSDW)
Everything about Open Source and other stuff...


 

Image CAPTCHA

I saw this code in the website PHP Tricks & Skills. Pretty interesting code where you can implement CAPTCHA during forum submission.

Check it out.


<?php

/*
Image Verification without the need of use of database
Requirements:
-------------
(1)
Package includes the following:
sec_image.php -> Displays security image
font.ttf -> Font to be used to display
background.png -> Background to be used

(2)
Your PHP Settings/Server must enable the use of freetypefonts
PHP Function: imagettfbbox
*/

/*
Security Code 
(If editing, insure the same Code in place in sec_image.php)
*/
$SECURITY_CODE 'LKJSDHF*(&IY#L$KUHOYL'
;

/*
Word Length
*/
$WORD_LENGTH 5
;

/*
Two Needed Functions, encode_pass & hex2bin
*/

/*
encode_pass, I don't remember exactly where I have gotten this before
It was a long time, so please if you know the source, email me @
support@sonimager.com & I'll add it

Encode Data Function
*/
function encode_pass($data, $pwd
){
    
$pwd_length strlen($pwd
);
    for (
$i 0$i 255$i
++) {
        
$key[$i] =  ord(substr ($pwd, ( $i $pwd_length )+1 1
));
        
$counter[$i] =  $i
;
    }
    for (
$i 0$i 255$i
++) {
        
$x = ($x  $counter[ $i] + $key [$i ]) % 256
;
        
$temp_swap $counter[$i
];
        
$counter[$i] =  $counter[$x
];
        
$counter[$x] =  $temp_swap
;
    }
    for (
$i 0$i strlen($data);  $i
++) {
        
$a = ($a  1) % 256
;
        
$j = ($j  $counter[ $a]) % 256
;
        
$temp $counter[$a
];
        
$counter[$a] =  $counter[$j
];
        
$counter[$j] =  $temp
;
        
$k $counter [(($counter[ $a] + $counter [$j]) %  256
)];
        
$Zcipher ord(substr ($data$i1)) ^ $k
;
        
$Zcrypt .= chr($Zcipher
);
    }
    return 
$Zcrypt
;
}

/*
Hex2Binary Function
*/

function hex2bin($hexdata
) {
    for (
$i=0 ;$i<strlen($hexdata);$i+= 2
) {
        
$bindata.=chr (hexdec(substr($hexdata,$i, 2
)));
    }  
    return 
$bindata
;


/*
Lets create a random word consisting of the following letters:
*/
$letters = array("a","A" ,"b","B", "c","C","d" ,"D","e", "E","f","F" ,"g","G"
,
"h","H","i","I","j","J","k","K","l","L","m","M","n","N","o","O","p","P",
"q","Q","r","R","s","S","t","T","u","U","v"
,"V","w","W","x","X","y","Y",
"z","Z","1","2","3","4","5","6","7","8","9"
);

/*
Create it
*/
$the_word NULL
;
for (
$i= 0$i<$WORD_LENGTH $i
++) {
   
$the_word .= $letters[rand( 0count($letters )-1
)];
}

/*
Lets encode it
*/
$new_string encode_pass($the_word,$SECURITY_CODE
);

/*
Now lets convert the hidden word into binary
(This makes it more user friendlier and browser safe)
*/
$image_code bin2hex($new_string
);

/*
Now lets echo the image
*/
echo '<img src="sec_image.php?word=' .$image_code. '">'
;

/*******************EXAMPLE USAGE*******************************/
/*
Example Form Usage:
Form Header:
*/

echo '<form name="security" id="security" method="post" action="' .$_SERVER['PHP_SELF'].'">'
;
/*
Form hidden code in hidden tag
(coded)
*/

echo '<input name="hid_code" type="hidden" id="hid_code" value="' .$image_code. '">'
;
/*
A chance for user to enter code
*/

echo '<input name="user_guess" type="text" id="user_guess"><input name="Submit" type="submit" value="Check">'
;
/*
Form end
*/

echo '</form>'
;

/*
Example PHP Form submition check
*/

/*
If checking a user guess
*/
if($_POST ['user_guess'] !=  NULL
){
    
/*
    Convert $_GET[word] From hex to binary
    */
    
$hidden_word hex2bin($_POST['hid_code'
]);

    
/*
    Now decode the binary string
    */
    
$the_word encode_pass($hidden_word,$SECURITY_CODE
);
    
    
//Does it match?
    
if($_POST['user_guess'] != $the_word
){
        echo 
'Word entered does not match security code'
;
    } else {
        echo 
'Good Job'
;
        
//Do your thing here
    
}
}
?>


PHP Code from PHP Tricks & Skills: http://www.phptricks.com/lesson.php?id=5

 
 
 OSDW