added imgcaptcha files

This commit is contained in:
asiekierka 2012-12-22 17:38:49 +01:00
parent 547b97ade5
commit 549ecc200e
4 changed files with 170 additions and 1 deletions

View File

@ -269,6 +269,10 @@
$config['imgcaptcha_list'] = "/sciezka/do/pliku.txt";
$config['imgcaptcha_images'] = "/sciezka/do/obrazkow"; // without a slash at the end
$config['imgcaptcha_question'] = "Was ist das?";
$config['imgcaptcha_time_limit'] = 90; // Kapcza wazna przez 90 sekund po wejsciu
$config['imgcaptcha_filler'] = "/plik/kliknijmie.png";
$config['imgcaptcha_width'] = 128;
$config['imgcaptcha_height'] = 96;
/*
* ====================
* Post settings

39
inc/ic-encrypt.php Normal file
View File

@ -0,0 +1,39 @@
<?php
// Z internetow.
class Encryption {
var $skey = $config["imgcaptcha_key"];
public function safe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_',''),$data);
return $data;
}
public function safe_b64decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}
public function encode($value){
if(!$value){return false;}
$text = $value;
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv);
return trim($this->safe_b64encode($crypttext));
}
public function decode($value){
if(!$value){return false;}
$crypttext = $this->safe_b64decode($value);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv);
return trim($decrypttext);
}
}
?>

126
inc/imgcaptcha.php Normal file
View File

@ -0,0 +1,126 @@
<?php
// Wiem, ze ten kod to czysta ohyda. Coz.
require("ic-encrypt.php");
function getImages() {
$lines = split("\n",file_get_contents($config["imgcaptcha_list"]));
for($i=0;$i<count($lines);$i++) { $lines[$i] = split(",",$lines[$i]); }
return $lines;
}
function getIPath($img) {
return $config["imgcaptcha_images"] . "/" . $img;
}
function pickImage($lines) {
$src = FALSE;
while($src == FALSE) {
$pick = rand(0,count($lines)-1);
$src = imagecreatefrompng(getIPath($lines[$pick][0]));
}
imagedestroy($src);
return $pick;
}
function ncfix($a) {
if($a>255) { return 255; }
if($a<0) { return 0; }
return $a;
}
function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+=')
{
$str = '';
$count = strlen($charset);
while ($length--) {
$str .= $charset[rand(0, $count-1)];
}
return $str;
}
function generateCaptchaHash() {
$lines = getImages();
$pick = pickImage($lines);
$enctext = $pick . ",," . time() . ",," . $_SERVER["REMOTE_ADDR"] . ",," . randString(12);
$converter = new Encryption;
return $converter->encode($enctext);
}
function ac_verifyHash($enctext, $output) {
//print "VERIFY: " . $enctext . " " . $output . "<br>";
$converter = new Encryption;
$dectext = split(",,",$converter->decode($enctext));
if(count($dectext)<4) return true;
$lines = getImages();
$pick = $dectext[0];
$time = time()-$dectext[1];
if($time>$config["imgcaptcha_time_limit"]) return true;
$lp = $lines[$pick];
for($i=1;$i<count($lp);$i++) {
if(strcasecmp($lp[$i],$output)==0) return false;
}
return true;
}
function getPick($enctext)
{
$converter = new Encryption;
$dectext = split(",,",$converter->decode($enctext));
if(count($dectext)<=1) return; //SC
$lines = getImages();
return $dectext[0];
}
function generateImage($enctext)
{
$lines = getImages();
$pick = getPick($enctext);
if(!isset($lines[$pick])) return; //SC
$src = imagecreatefrompng(getIPath($lines[$pick][0]));
if($src == FALSE) return; //SC
$maxc = 8;
$icw = $config["imgcaptcha_width"];
$ich = $config["imgcaptcha_height"];
$dst = imagecreatetruecolor($icw,$ich);
$srcxm = imagesx($src)-$icw;
$srcym = imagesy($src)-$ich;
$srcx = rand(0,$srcxm-1);
$srcy = rand(0,$srcym-1);
imagecopy($dst,$src,0,0,$srcx,$srcy,$icw,$ich);
// Obfuscation step 1
imagecopymergegray($dst,$dst,0,0,0,0,$icw,$ich,rand(20,45));
// Obfuscation step 1.5
for($i=0;$i<8;$i++) {
$w = rand(5,10); $h = rand(5,10);
$x = rand(0,$icw-1-$w); $y = rand(0,$ich-1-$h);
$x2 = rand(0,$icw-1); $y2 = rand(0,$ich-1);
imagefilledrectangle($dst,$x,$y,$x+$w,$y+$h,imagecolorat($dst,$x2,$y2));
}
for($i=0;$i<5;$i++) {
$w = rand(20,40); $h = rand(20,40);
$x = rand(0,$icw-1-$w); $y = rand(0,$ich-1-$h);
imagecopymergegray($dst,$dst,$x,$y,$x,$y,$w,$h,0);
}
// Obfuscation step 2
for($i=0;$i<$icw*$ich;$i++) {
$x = $i%$icw; $y = $i/$icw;
$c = imagecolorat($dst,$x,$y);
if(rand(0,4) == 2) { $nc = $c ^ rand(0,16777215); }
else { $nc = imagecolorat($dst,rand(0,$icw-1),rand(0,$ich-1)); }
if(rand(18,24)!=21 and $c != 0 and $c != 0xFF00FF)
{
$nc = ncfix(($c&0xFF) + rand(-16,16)) | ncfix((($c>>8)&0xFF) + rand(-8,8))<<8 | ncfix((($c>>16)&0xFF) + rand(-32,32))<<16;
$nc1 = $nc&0xFF ^ ($nc>>8)&0xFF ^ ($nc>>16)&0xFF;
} else {
$nc1 = $nc&0xFF;
if($nc1>($maxc*25)) $nc1 = $nc % ($maxc*25);
}
$nc2 = $nc1 | $nc1<<8 | $nc1<<16;
if(rand(0,1)==0) $nc2=$nc;
imagesetpixel($dst,$x,$y,$nc2);
}
// Obfuscation step 3
for($i=0;$i<rand(10,30);$i++) {
$x1 = rand(0,$icw-1); $x2 = rand(0,$icw-1); $y1 = rand(0,$ich-1); $y2 = rand(0,$ich-1);
$color = imagecolorallocate($dst, rand(0,$maxc)*25, rand(0,$maxc)*25, rand(0,$maxc)*25);
imageline($dst,$x1,$y1,$x2,$y2,$color);
}
imagepng($dst);
}
//header('Content-Type: image/png');
//$t = generateCaptchaHash();
//generateImage($t);
?>

View File

@ -66,7 +66,7 @@
</th>
<td>
<input type="hidden" name="imgcaptcha_hash" id="imgcaptcha_hash" value="kucaj stad, kucu hakierze">
<img src="" width="128px" height="96px" id="imgcaptcha_img"></img><br>
<img src="{% config.imgcaptcha_filler %}" width="{% config.imgcaptcha_width %}px" height="{% config.imgcaptcha_height %}px" id="imgcaptcha_img"></img><br>
{% config.imgcaptcha_question %} <input type="text" name="imgcaptcha_verify" id="imgcaptcha_verify" value=""></input><br>
<a href="javascript:ic_odswiezKapcze()">Odswiez</a>
{{ antibot.html() }}