Discuz検証コード機能解析

52310 ワード

discuz認証コード機能は主にuc_server\lib\seccode.class.phpまたは/source/class/class_seccode.phpファイルでは、ucenter serverで実行され、discuzで実行される2つのファイルのコードがほぼ一致しています.以下の解析はucenter server上の検証コード機能についてである.
discuzがサポートする認証コードのタイプは、グラフィック、flash、オーディオ、ビットマップです.サーバーにmingライブラリ(動的にflashアニメーションを生成)がインストールされている場合、discuzはデフォルトでflash検証コードを使用します.mingがインストールされていない場合、GDライブラリがインストールされている場合、discuzはピクチャ検証コードを使用します.そうでない場合はビットマップ検証コードを使用します.オーディオ検証コードはコード内で手動で構成する必要があります.
ビットマップ検証コード
discuzコードには、様々なアルファベットと数字のビットマップ符号化が事前に保存されています.
$numbers = array
			(
			'B' => array('00','fc','66','66','66','7c','66','66','fc','00'),
			'C' => array('00','38','64','c0','c0','c0','c4','64','3c','00'),
			'E' => array('00','fe','62','62','68','78','6a','62','fe','00'),
			'F' => array('00','f8','60','60','68','78','6a','62','fe','00'),
			'G' => array('00','78','cc','cc','de','c0','c4','c4','7c','00'),
			'H' => array('00','e7','66','66','66','7e','66','66','e7','00'),
			'J' => array('00','f8','cc','cc','cc','0c','0c','0c','7f','00'),
			'K' => array('00','f3','66','66','7c','78','6c','66','f7','00'),
			'M' => array('00','f7','63','6b','6b','77','77','77','e3','00'),
			'P' => array('00','f8','60','60','7c','66','66','66','fc','00'),
			'Q' => array('00','78','cc','cc','cc','cc','cc','cc','78','00'),
			'R' => array('00','f3','66','6c','7c','66','66','66','fc','00'),
			'T' => array('00','78','30','30','30','30','b4','b4','fc','00'),
			'V' => array('00','1c','1c','36','36','36','63','63','f7','00'),
			'W' => array('00','36','36','36','77','7f','6b','63','f7','00'),
			'X' => array('00','f7','66','3c','18','18','3c','66','ef','00'),
			'Y' => array('00','7e','18','18','18','3c','24','66','ef','00'),
			'2' => array('fc','c0','60','30','18','0c','cc','cc','78','00'),
			'3' => array('78','8c','0c','0c','38','0c','0c','8c','78','00'),
			'4' => array('00','3e','0c','fe','4c','6c','2c','3c','1c','1c'),
			'6' => array('78','cc','cc','cc','ec','d8','c0','60','3c','00'),
			'7' => array('30','30','38','18','18','18','1c','8c','fc','00'),
			'8' => array('78','cc','cc','cc','78','cc','cc','cc','78','00'),
			'9' => array('f0','18','0c','6c','dc','cc','cc','cc','78','00')
			);

ここで、各文字に対応するリストの各要素は、8ビットのバイナリ数字に変換することができ、1は白点、0は黒点を表す.上記のコードの各文字は10要素に対応しているので、discuzは1つの10 x 8のビットマップで1つの文字を表し、例えばB対応のリストをバイナリに変換して得られる.
00000000 11111100 01100110 01100110 01100110 01111100 01100110 01100110 11111100 00000000
0を黒い点、1を白い点と見ると、黒い底の白い字のアルファベットBが得られます.discuzがランダムに生成した4文字を組み合わせてビットマップに変換し、ノイズを挿入してフロントエンドに出力すると、検証コード機能が完了します.
オーディオ認証コード
オーディオ検証コードの実装は比較的簡単で、以下のコードのように、discuzは事前に録画した各文字に対応するmp 3ファイルを連続的に再生する.
header('Content-type: audio/mpeg');
for($i = 0;$i <= 3; $i++) {
	readfile($this->datapath.'sound/'.strtolower($this->code[$i]).'.mp3');
}

Flash認証コード
Flash検証コードの実装はビットマップ検証コードの実装と類似しており、既存の符号化を利用してランダムに生成された文字を対応付けて組み合わせ、フロントエンドに出力する.
Flash検証コード符号化フラグメント:
case 'B':$str .= 'moveTo('.$x_1.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_1.', '.$y_2.');lineTo('.$x_2.', '.$y_1_5.');lineTo('.$x_1.', '.$y_1.');lineTo('.$x_2.', '.$y_0_5.');lineTo('.$x_1.', '.$y_0.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');';break;
case 'C':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_2.', '.$y_2.');';break;
case 'E':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_2.', '.$y_2.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');';break;
case 'F':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');';break;
case 'G':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_2.', '.$y_2.');lineTo('.$x_2.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');';break;
case 'H':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');moveTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_2.', '.$y_1.');';break;

グラフィック検証コード
グラフィック検証コードはgif動図、jpg、pngをサポートします.主にGDライブラリの機能を利用して画像合成を行い、フォントはttfファイルから、背景はstatic/image/seccode/background/フォルダからの画像から、実現過程が少し煩雑であるため、ここでは深くない.