圖形化的隨機驗證碼如何產生?

CodeCharge Studio 2.x, 3.x, 4.x, 5.x
回覆文章
asongo
文章: 33
註冊時間: 2006-02-13 21:24:24
來自: 高雄市
聯繫:

圖形化的隨機驗證碼如何產生?

文章 asongo »

我想製作一個註冊網頁,其中包含一個驗證碼欄位,申請註冊時需要填入該驗證碼,比對正確才能註冊,就像這裡的論壇,Google,msn...一樣,內容由0-9,a-Z大小寫等字元隨機產生6個字元(圖形化),我在官方論壇及說明文件與範例中找不到資料,不知如何著手?
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

這個已經超出 CCS 的功能了

文章 yehlu »

如題

若您用PHP的話可利用GD來產生這個東西
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

簡單的驗證碼機制

文章 yehlu »

http://www.ithome.com.tw/plog/index.php ... blogId=257

簡單的驗證碼機制

fillano | 24 Jul, 2006 11:17

為了自己網站改版,隨手寫了一個留言板。並且想了一個簡單的驗證碼機制,防止他人使用機器人在我的留言板亂倒東西。

由於是使用php,所以有一些方便的工具(GD、Session),可以整合出完整的功能。

我的想法如下:

1. 驗證碼(check_code)存放在資料庫,用一個check_id作為key
2. 留言板的留言與看留言的介面在同一個頁面,每次進入這個頁面時,驗證碼都要更換。所以不能直接使用session_id作為key
3. 每次進入頁面時,會刪除舊的check_id,產生新的check_id,同時產生一組check_code存放在資料庫
4. 用gd產生check_code的圖片,在輸入留言的form上面顯示
5. 程式之間利用session來取得check_id,check_code不會在client端出現,所以可以確保一些安全性

以下簡述一下我的程式:

第一步還是要在資料庫中建立一個資料表(我用的是mysql),我取名叫做fsession:

CREATE TABLE `fsession` (
`check_id` varchar(40) NOT NULL default '',
`check_code` varchar(8) NOT NULL default '00000000',
PRIMARY KEY (`check_id`)
) TYPE=MyISAM;

接下來是產生check_id的code:

session_start();
$sql = sprintf("SELECT * FROM fsession WHERE check_id='%s'", $_SESSION['check_id']);
$result = $db->query($sql);
$tmp = $db->num_rows($result);
if ($tmp > 0) {//如果有舊的check_id,就把他從資料庫刪掉
$sql = sprintf("DELETE FROM fsession WHERE check_id='%s'", $_SESSION['check_id']);
$db->query($sql);
}
//接下來產生新的check_id以及check_code
$_SESSION['check_id'] = md5(time().rand());
//上面產生check_id
$sql = sprintf("INSERT INTO fsession (check_id, check_code) VALUES ('%s', '%s')", $_SESSION['checkid'], mt_rand(10000000,99999999));
//上面產生一組八位數的check_code
$db->query($sql);
//ok,存入資料庫

(這個方法不太好,因為我也不太確定不同字串產生的md5摘要是否會一樣.....不過因為摘要長度是一樣的,比較方便,所以先用了:D。也許應該用auto_increment的id比較好?只要改一下程式就可以了(先存入資料庫再取得check_id,但是 check_id的type要改成int))

接下來是產生驗證碼圖片的程式(使用GD,幾乎從php manual上面的例子照抄....):

session_start();

if (!empty($_SESSION['check_id'])) {
$sql = sprintf("SELECT check_code FROM fsession WHERE check_id='%s'", $_SESSION['check_id']);
$result = $db->query($sql);
if ($db->num_rows($result) == 0) {
$code = "error! db";
} else {
list($code) = $db->fetch_row($result);
}
} else {
$code = "error! session";
}

header("Content-type: image/jpeg");
//指定輸出內容的type
$im = imagecreatefromjpeg("images/code_bg.jpg");
//用一張背景圖產生需要的背景
$color = imagecolorallocate($im, 32, 32, 32);
//指定顏色
imagettftext($im, 12, 0, 2, 13, $color, "fonts/georgiai.ttf",$code);
//利用true type字型來產生圖片
imagejpeg($im);
//輸出所產生的圖片內容到瀏覽器
imagedestroy($im);

假設這一隻程式叫做authcode.php,只要在需要圖片的地方使用<img src="authcode.php">就可以顯示圖片。另外,字型檔案與字型大小需要依照系統做調整(也可以用ps、type1等字型,尤其是在linux系統上)

最後,只要在留言存入資料庫的地方,先檢查使用者輸入的檢查碼,與存在資料庫中的檢查碼比對,就可以確認。
回覆文章

回到「CodeCharge Studio」