Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

修改 LifeType 的 AuthImage, 使用 Better Captcha 的圖形
post by tommy @ 16 十月, 2006 14:23
在 PHPBB 有一個 Better Captcha MOD, 所產生的識別碼圖形, 並不會像 FreeCap 所產生的那般, 十分難辨識. 而 LifeType 本身的 AuthImage 所產生的圖形, 又太有規律. 所以, 打算讓 AuthImage 產生圖形的方式, 用 Better Captcha 方式來產生.

首先, 先到這兒抓取 Better Captcha. 抓回解開之後, 把 fonts 這個目錄放到 authimage 的目錄下頭. 然後修改 pluginauthimage.class.php 如下:

--- authimage.old/pluginauthimage.class.php	2006-07-05 10:19:57.000000000 +0800
+++ authimage/pluginauthimage.class.php 2006-10-16 14:20:28.744067612 +0800
@@ -8,7 +8,10 @@

define( "AUTHIMAGE_FILE", "/plugins/authimage/authimage.php" );
define( "AUTHIMAGE_BACKGROUND_FOLDER", PLOG_CLASS_PATH."plugins/authimage/backgrounds/" );
-
+// twu2 20061016 begin
+ define( "AUTHIMAGE_FONT_FOLDER", PLOG_CLASS_PATH."plugins/authimage/fonts/" );
+// twu2 20061016 end
+
/**
* Plugin that offers comment authentication image for current blog
* Original Author: Gudlyf http://www.gudlyf.com/index.php?p=376
@@ -93,8 +96,9 @@

function show() {
$authImageUrl = $this->generateImageUrl();
+ //return '<img src="'.$authImageUrl.'" style="vertical-align:middle;" width="70px" height="20px" alt="authimage" />';
if ( $authImageUrl )
- return '<img src="'.$authImageUrl.'" style="vertical-align:middle;" width="70px" height="20px" alt="authimage" />';
+ return '<img src="'.$authImageUrl.'" style="vertical-align:middle;" alt="authimage" />';
else
return 'You don\'t have GD support compiled in, we cannot create an authimage. Please activate GD Support.';
}
@@ -103,6 +107,16 @@
// Delete those cached authimage files that never used
$this->deleteExpiredAuthImage($this->expiredTime);

+// twu2 20061016 begin
+ $code = $this->generateCode();
+ $encrypt = $this->encrypt($code, $this->key);
+ if ( function_exists ( 'ImageGIF' ) )
+ $image_format = 'gif';
+ else
+ $image_format = 'png';
+ $tempFile = $this->cacheFolder."/".$encrypt.".".$image_format;
+ $this->captcha_createimage($code, $image_format, $tempFile);
+/* old method for image
$code = $this->generateCode();
$encrypt = $this->encrypt($code, $this->key);
$background = AUTHIMAGE_BACKGROUND_FOLDER.$this->default;
@@ -125,6 +139,8 @@
} else {
ImageGIF($image, $tempFile);
}
+*/
+// twu2 20061016 end
$temp = fopen($tempFile,"rb");
$buffer = fread($temp,filesize($tempFile));
fclose($temp);
@@ -137,7 +153,10 @@
// Now chmod it so it can be deleted later by the user
chmod($tempFile, 0666);

- header("Content-type: image/gif");
+// twu2 20061016 begin
+ //header("Content-type: image/gif");
+ header("Content-type: image/".$image_format);
+// twu2 20061016 end
echo $buffer;
}

@@ -150,7 +169,14 @@

function generateCode() {
$code = "";
- for($i=0; $i < $this->length; $i++) $code .= rand(0,9);
+// twu2 20061016 begin
+ //for($i=0; $i < $this->length; $i++) $code .= rand(0,9);
+ //$hash = "0123456789";
+ //$hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ $hash = "0123456789ABCDEFGHKMNPQRWXYZ";
+ $len = strlen($hash) - 1;
+ for($i=0; $i < $this->length; $i++) $code .= $hash[rand(0,$len)];
+// twu2 20061016 end
return $code;
}

@@ -168,6 +194,135 @@
closedir($handle);
}
}
+
+// twu2 20061016 begin
+ function captcha_createimage($code, $image_format, $tempFile)
+ {
+ $breedte = rand(256, 384);
+ $hoogte = rand(64, 96);
+ $img = imagecreatetruecolor($breedte,$hoogte);
+ $achtergrond = imagecolorallocate($img, $this->captcha_color("bg"), $this->captcha_color("bg"), $this->captcha_color("bg"));
+
+ imagefilledrectangle($img, 0, 0, $breedte-1, $hoogte-1, $achtergrond);
+ $hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ $hash_len = strlen($hash);
+ for($g = 0;$g < 30; $g++)
+ {
+ $t = $hash[rand(0, $hash_len)];
+
+ $ypos = rand(0,$hoogte);
+ $xpos = rand(0,$breedte);
+
+ $kleur = imagecolorallocate($img, $this->captcha_color("bgtekst"), $this->captcha_color("bgtekst"), $this->captcha_color("bgtekst"));
+
+ if (!($g % 2))
+ {
+ $scribx = rand(0,($breedte*2));
+ $scriby = rand(0,($hoogte*2));
+
+ $wibblex = rand(0,($breedte*2));
+ $wibbley = rand(0,($hoogte*2));
+
+ imageline($img, rand(0, $scribx-$xpos), rand(0, $scriby+$ypos), rand(0, $wibblex), rand(0, $wibbley), $kleur+$g);
+ imageellipse($img, rand(0, $scribx+$xpos), rand(0, $scriby-$ypos), rand(0, $scriby), rand(0, $scribx), $kleur-$g);
+ }
+
+ imagettftext($img, $this->captcha_size(), $this->captcha_move(), $xpos, $ypos, $kleur, $this->captcha_font(), $t);
+ }
+ $stukje = $breedte / (strlen($code) + 3);
+
+ for($j = 0;$j < strlen($code); $j++)
+ {
+ $tek = $code[$j];
+ $ypos = rand(32,$hoogte-8);
+ $xpos = $stukje * ($j+2);
+
+ $kleur2 = imagecolorallocate($img, $this->captcha_color("tekst"), $this->captcha_color("tekst"), $this->captcha_color("tekst"));
+
+ imagettftext($img, $this->captcha_size(), $this->captcha_move(), $xpos, $ypos, $kleur2, $this->captcha_font() , $tek);
+ }
+
+ if ($image_format == 'gif')
+ imagegif($img, $tempFile);
+ else
+ imagepng($img, $tempFile);
+ imagedestroy($img);
+ }
+
+ /**
+ * Some functions :)
+ * Also orginally written by mastercode.nl
+ **/
+ /**
+ * Function to create a random color
+ * @auteur mastercode.nl
+ * @param $type string Mode for the color
+ * @return int
+ **/
+ function captcha_color($type)
+ {
+ switch($type)
+ {
+ case "bg":
+ $kleur = rand(224,255);
+ break;
+ case "tekst":
+ $kleur = rand(0,127);
+ break;
+ case "bgtekst":
+ $kleur = rand(200,224);
+ break;
+ default:
+ $kleur = rand(0,255);
+ break;
+ }
+ return $kleur;
+ }
+ /**
+ * Function to ranom the size
+ * @auteur mastercode.nl
+ * @return int
+ **/
+ function captcha_size()
+ {
+ $grootte = rand(24,32);
+ return $grootte;
+ }
+ /**
+ * Function to random the posistion
+ * @auteur mastercode.nl
+ * @return int
+ **/
+ function captcha_move()
+ {
+ $draai = rand(-25,25);
+ return $draai;
+ }
+ /**
+ * Function to return a ttf file from fonts map
+ * @auteur mastercode.nl
+ * @return string
+ **/
+ function captcha_font()
+ {
+ $f = @opendir(AUTHIMAGE_FONT_FOLDER);
+ $ar = array();
+ while(($file = @readdir($f)) !== false)
+ {
+ if(!in_array($file,array('.','..')) && eregi('.ttf',$file))
+ {
+ $ar[] = $file;
+ }
+ }
+ if(count($ar))
+ {
+ shuffle($ar);
+ $i = rand(0,(count($ar) - 1));
+ return AUTHIMAGE_FONT_FOLDER . $ar[$i];
+ }
+ }
+// twu2 20061016 end
+
}

?>
 

patch 可以到這兒抓: http://www.teatime.com.tw/~tommy/mypatch/lifetype_authimage_better_captcha.patch

我修改了 generateCode() 的部份, 讓出現的字串為數字與大寫的英文字母, 但是把其中幾個比較容易弄錯的字母移除. 如果你想修改出現的字串, 請修改這個 function 內的 $hash 變數值就可以.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 92 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS