Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

21.15. 驗證碼

用戶註冊,登陸等等需要驗證碼,下面的方案是,請求驗證碼生成一個隨機驗證碼,存在code中,identity可以存儲來源IP/手機號碼/Cookie等等用戶校驗, 5分鐘內如果沒有被使用就會刪除,如果5分鐘內被使用也會刪除。type 可以存放www,user,bbs,admin.....等等,將所有驗證碼放在captcha表中統一管理。

這個方案主要是考慮沒有memcache/redis/apc/xcache等等緩存環境下的解決方案,你也可以將下表改造一下,增加ttl欄位用於存放生存時間,而不是採用5分鐘一刀切的方案。

CREATE TABLE `captcha` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`type` ENUM('user','admin') NOT NULL DEFAULT 'admin' COMMENT '驗證碼類型',
	`identity` VARCHAR(32) NOT NULL COMMENT '唯一身份識別md5摘要',
	`code` VARCHAR(6) NOT NULL COMMENT '驗證碼',
	`ctime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',
	PRIMARY KEY (`id`),
	UNIQUE INDEX `code` (`code`),
	UNIQUE INDEX `identity` (`identity`)
)
COMMENT='驗證碼'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
		
		
CREATE EVENT `captcha` ON SCHEDULE
		EVERY 5 MINUTE STARTS '2013-07-08 16:27:03'
	ON COMPLETION PRESERVE
	ENABLE
	COMMENT ''
	DO BEGIN
	delete from captcha where type='myid' and ctime < DATE_ADD(now(), INTERVAL -5 MINUTE);
END