数据库安全·Token 认证

以下节选择《Netkiller Architect 手札》

作者:netkiller

地址 http://www.netkiller.cn/architect/

接下来几周的话题是数据库安全。

5.7. Token 认证

我们在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 BEGIN

if 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插入数据:

		-- 通过下面语句生成一个 Token
select 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(netkiller-ebook)

原文发表时间:2016-08-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏面朝大海春暖花开

sql

<select id="getListByWhere" parameterType="com.jiyun.beans.Employee" resultMap="...

1112
来自专栏散尽浮华

利用mk-table-checksum监测Mysql主从数据一致性操作记录

前面已经提到了mysql主从环境下数据一致性检查:mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理 今天这里再介...

3208
来自专栏西安-晁州

sqlserver - FOR XML PATH

FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活...

2120
来自专栏数据处理

hive sql 分区

将t2数据插入到t1,分区日期是‘2018-10-27’,使用overwrite会删除之前分区所有内容,into将内容追加到分区 注意SELECT必须在同一行...

912
来自专栏Netkiller

数据库记录安全解决方案

数据库记录安全解决方案 http://netkiller.github.io/journal/mysql.security.html 摘要 数据库记录防删除,放...

3836
来自专栏黑泽君的专栏

在命令行下,Mysql显示各个端所使用的字符集命令

662
来自专栏张善友的专栏

使用信息架构视图访问数据库元数据

元数据简介 元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例、图书馆目录卡和名片等都...

2266
来自专栏性能与架构

Mysql group by实现方式(一) - 临时表

当MySQL Query Optimizer无法找到可以利用的合适索引时,就不得不先读取需要的数据,然后通过临时表来完成GROUP BY操作 例如 EXPLAI...

2816
来自专栏idba

MySQL 各种SQL语句加锁分析

Locking read( SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),UPDATE以及DE...

1022
来自专栏别先生

mysql的内连接,外连接(左外连接,右外连接)巩固

1:mysql的内连接: 内连接(inner join):显示左表以及右表符合连接条件的记录; 1 select a.goods_id,a.goods_name...

1967

扫码关注云+社区