本文共 1322 字,大约阅读时间需要 4 分钟。
我们在staff表的基础上增加 token 字段
CREATE TABLE `staff` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '员工ID', `name` VARCHAR(50) NOT NULL COMMENT '员工名字', `token` VARCHAR(32) NOT NULL COMMENT 'Token 校验', PRIMARY KEY (`id`))COMMENT='员工表'COLLATE='utf8_general_ci'ENGINE=InnoDB;
插入数据的时候增加一些干扰字符串,这里使用concat(NEW.id,'+',NEW.name,'-')
CREATE DEFINER=`root`@`%` TRIGGER `staff_before_insert` BEFORE INSERT ON `staff` FOR EACH ROW BEGINif md5(concat(NEW.id,'+',NEW.name,'-')) != NEW.token then SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Permission denied', MYSQL_ERRNO = 1001; end if;END
注意表权限可以授权给用户,触发器权限不让普通用户查看。否则用户看到 concat(NEW.id,'+',NEW.name,'-') 就没有意义了。
下面开始测试:
INSERT INTO `test`.`staff` (`name`, `token`) VALUES ('John', '678797066');/* SQL错误(1001):Permission denied */
下面再测试,首先生成一个正确的tokon, 然后使用该token插入数据:
-- 通过下面语句生成一个 Tokenselect md5(concat('5','+','Jam','-')) as token;-- 使用上面的 Token 插入数据INSERT INTO `test`.`staff` (`id`, `name`, `token`) VALUES (5, 'Jam', '1b033ce21cbadacabc9f0c38fb58dbb2');SELECT * FROM `test`.`staff` WHERE `id` = 5;
开发注意事项, Token 生成算法要保密,不要使用下面SQL提交数据
INSERT INTO `test`.`staff` (`id`, `name`, `token`) VALUES (5, 'Jam', md5(concat('5','+','Jam','-')));
应该分两步,一是计算Token,二是插入数据。可以将Token计算交给程序而不是SQL,并且封装在。jar(Java)中或者。so(PHP 扩展中).
原文出处:Netkiller 系列 手札
本文作者:陈景峯 转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。