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)+11
));
        
$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
 
Delicious Digg Facebook Furl Reddit Spurl Stumbleupon Yahoo My Web