安全测试基础之MySQL

1 MySQL基础

1.1 MySQL安装

window中安装mysql
官⽹下载mysql5.7.25:https://dev.mysql.com/downloads/mysql/5.7.html#downloads

win10安装mysql5.7详细步骤可以看:http://www.itsoku.com/article/192

1.2 MySQL启动

⽅式1:
cmd中运⾏services.msc
打开服务窗⼜,在服务窗⼜中找到mysql服务,点击右键可以启动或者停⽌;

在这里插入图片描述
⽅式2:
以管理员⾝份运⾏cmd命令
停⽌命令:net stop mysql
启动命令:net start mysql

mysql登录命令
mysql -h ip -P 端口 -u ⽤户名 -p
mysql -h localhost -P 3306 -u root -p

注意:
-P ⼤写的P后⾯跟上端口
如果是登录本⾦ip和端⼜可以省略,如:mysql -u ⽤户名 -p

1.3 MySQL基本命令

1、查看数据库版本
未登录情况下,查看本机mysql版本:
mysql --version
mysql -V

在这里插入图片描述
登录情况下,查看链接的库版本:
select version();

在这里插入图片描述
2、显示所有数据库:
show databases;

在这里插入图片描述
3、进⼊指定的库:use 库名;

在这里插入图片描述
4、显示当前库中所有的表:show tables;

在这里插入图片描述
5、查看其他库中所有的表:show tables from 库名;

在这里插入图片描述
6、查看表的创建语句:show create table 表名;

在这里插入图片描述
7、查看表结构:desc 表名;

在这里插入图片描述
8、查看当前所在库:select database();

在这里插入图片描述
9、查看当前mysql⽀持的存储引擎:SHOW ENGINES;

在这里插入图片描述
10、查看系统变量及其值:SHOW VARIABLES;

在这里插入图片描述
11、查看某个系统变量:SHOW VARIABLES like ‘变量名’;

在这里插入图片描述

1.4 MySQL语法规范

  1. 不区分⼤⼩写,但建议关键字⼤写,表名、列名⼩写;
  2. 每条命令最好⽤英⽂分号结尾;
  3. 每条命令根据需要,可以进⾏缩进或换⾏;
  4. 注释
    – 单⾏注释:# 注释⽂字
    – 单⾏注释:-- 注释⽂字 ,注意, 这⾥需要加空格
    – 多⾏注释:/* 注释⽂字 */

1.5 SQL语⾔分类

DQL(Data Query Language):数据查询语⾔ select 相关语句
DML(Data Manipulate Language):数据操作语⾔ insert 、update、delete 语句
DDL(Data De>ine Languge):数据定义语⾔ create、drop、alter 语句
TCL(Transaction Control Language):事务控制语⾔ set autocommit=0、start transaction、savepoint、commit、rollback

2 MySQL数据类型

整数类型:bit、bool、tinyint、smallint、mediumint、int、bigint
浮点数类型:float、double、decimal
字符串类型:char、varchar、tinyblob、blob、mediumblob、longblob、
tinytext、text、mediumtext、longtext
⽇期类型:Date、DateTime、TimeStamp、Time、Year

2.1 整型

eg1:有符号类型
create table testSet( c1 tinyint );
insert into testSet values(-pow(2,7)),(pow(2,7)-1);
select * from testSet;
在这里插入图片描述
eg2:⽆符号类型
insert into testSet2 values (-1);
insert into testSet2 values (0),(pow(2,8));
insert into testSet2 values (0),(pow(2,8)-1);
select * from testSet2;
c1是⽆符号的tinyint类型的,插⼊了负数会报错。

在这里插入图片描述
类型(n)说明
例如定义整型的写法是int(11),int(N)我们只需要记住两点:
• ⽆论N等于多少,int永远占4个字节
• N表⽰的是显⽰宽度,不⾜的⽤0补⾜,超过的⽆视长度⽽直接显⽰整个数字,但这要整型设置了unsigned zero>ill才有效

eg3.int(n)
创建一个表:
CREATE TABLE test3 (
a int,
b int(5),
c int(5) unsigned,
d int(5) zerofill,
e int(5) unsigned zerofill,
f int zerofill,
g int unsigned zerofill
);

插入三条数据后,查看对应的数据:

在这里插入图片描述

表结构如下:
show create table test3; 查看表test3的创建语句,和我们原始的创建语句不⼀致了,原始的d字段⽤的是⽆符号的,可以看出当使⽤了zerofill⾃动会将⽆符号提升为有符号。
说明:
int(5)输出宽度不满5时,前⾯⽤0来进⾏填充
int(n)中的n省略的时候,宽度为对应类型⽆符号最⼤值的⼗进制的长度;

在这里插入图片描述

2.2 浮点型

[loat数值类型⽤于表⽰单精度浮点数值,⽽double数值类型⽤于表⽰双精度浮点数值,float和double都是浮点型,⽽decimal是定点型。
浮点型和定点型可以⽤类型名称后加(M,D)来表⽰,M表⽰该值的总共长度,D表示小数点后⾯的长度,M和D又称为精度和标度。
float和double在不指定精度时,默认会按照实际的精度来显⽰,⽽DECIMAL在不指定精度时,默认整数为10,⼩数为0。

eg1.带精度和标度(M,D)的浮点类型
create table test5(a float(5,2),b double(5,2),c decimal(5,2));
结果说明(重点):
c是decimal类型,认真看⼀下输⼊和输出,发现decimal采⽤的是四舍五⼊
而a和b的输⼊和输出,尽然不是四舍五⼊,float和double采
⽤的是四舍六⼊五成双
decimal插⼊的数据超过精度之后会触发警告。

什么是四舍六⼊五成双?
就是5以下舍弃5以上进位,如果需要处理数字为5的时候,需要看5后⾯是否还有不为0的任何数字,如果有,则直接进位,如果没有,需要看5前⾯的数字,若是奇数则进位,若是偶数则将5舍掉。

在这里插入图片描述
eg2.不带精度和标度(M,D)的浮点类型
create table test6(a float,b double,c decimal);
insert into test6 values (1,1,1),(1.234,1.234,1.4),(1.234,0.01,1.5);
说明:
a和b的数据正确插⼊,⽽c被截断了;
浮点数float、double如果不写精度和标度,则会按照实际显⽰;
decimal不写精度和标度,⼩数点后⾯的会进⾏四舍五⼊,并且插⼊时会有警告!

在这里插入图片描述
出float、double会存在精度问题,decimal精度正常的,⽐如
银⾏对统计结果要求⽐较精准的建议使⽤decimal。

在这里插入图片描述
char类型占⽤固定长度,如果存放的数据为固定长度的建议使⽤char类型,如:⼿机号码、⾝份证等固定长度的信息。

2.3 数据类型选择的⼀些建议

1、选⼩不选⼤:⼀般情况下选择可以正确存储数据的最⼩数据类型,越⼩的数据类型通常更快,占⽤磁盘,内存和CPU缓存更⼩。
2、简单就好:简单的数据类型的操作通常需要更少的CPU周期,例如:整型⽐字符操作代价要⼩得多,因为字符集和校对规则(排序规则)使字符⽐整型⽐较更加复杂。
3、尽量避免NULL:尽量制定列为NOT NULL,除⾮真的需要NULL类型的值,有NULL的列值会使得索引、索引统计和值⽐较更加复杂。
4、浮点类型的建议统⼀选择decimal
5、记录时间的建议使⽤int或者bigint类型,将时间转换为时间戳格式,如将时间转换为秒、毫秒,进⾏存储,⽅便⾛索引。

3 MySQL管理员常用⼀些命令

3.1 Mysql权限⼯作原理

1、mysql是如何来识别⼀个⽤户的呢?
mysql为了安全性考虑,采⽤主机名+⽤户名来判断⼀个⽤户的⾝份,因为在互联⽹中很难通过⽤户名来判断⼀个⽤户的⾝份,但是我们可以通过ip或者主机名判断⼀台机器,某个⽤户通过这个机器过来的,我们可以识别为⼀个⽤户,所以mysql中采⽤⽤户名+主机名来识别⽤户的⾝份。
当⼀个⽤户对mysql发送指令的时候,mysql就是通过⽤户名和来源(主机)来断定⽤户的权限。

2、Mysql权限验证分为2个阶段:

  1. 阶段1:连接数据库,此时mysql会根据你的⽤户名及你的来源(ip或者主机名称)判断是否有权限连接
  2. 阶段2:对mysql服务器发起请求操作,如create table、select、delete、update、create index等操作,此时mysql会判断你是否有权限操作这些指令

3、权限⽣效时间
⽤户及权限信息放在库名为mysql的库中,mysql启动时,这些内容被读进内存并且从此时⽣效,所以如果通过直接操作这些表来修改⽤户及权限信息的,需要重启mysql或者执⾏flush privileges;才可以⽣效。
⽤户登录之后,mysql会和当前⽤户之间创建⼀个连接,此时⽤户相关的权限信息都保存在这个连接中,存放在内存中,此时如果有其他地⽅修改了当前⽤户的权限,这些变更的权限会在下⼀次登录时才会⽣效。

3.2 查看mysql中所有用户

⽤户信息在mysql.user表中,如下:
use mysql;
select user,host from user;

在这里插入图片描述

3.3 创建用户

create user ⽤户名[@主机名] [identified by ‘密码’];
说明:

  1. 主机名默认值为%,表⽰这个⽤户可以从任何主机连接mysql服务器
  2. 密码可以省略,表⽰⽆密码登录

在这里插入图片描述
上⾯创建了⽤户名为test1⽆密码的⽤户,没有指定主机,可以看出host的默认值为%,
表⽰test1可以从任何机器登录到mysql中。

在这里插入图片描述
其他⽰例
create user ‘test2’@‘localhost’ identified by ‘123’;
说明:test2的主机为localhost表⽰本机,此⽤户只能登陆本机的mysql

create user ‘test3’@% identified by ‘123’;
说明:test3可以从任何机器连接到mysql服务器

create user ‘test4’@‘192.168.11.%’ identified by ‘123’;
说明:test4可以从192.168.11段的机器连接mysql

3.4 修改密码【3种方式】

⽅式1:通过管理员修改密码
SET PASSWORD FOR ‘⽤户名’@‘主机’ = PASSWORD(‘密码’);

⽅式2:create user ⽤户名[@主机名] [identi>ied by ‘密码’];
set password = password(‘密码’);

⽅式3:通过修改mysql.user表修改密码
use mysql;
update user set authentication_string = password(‘321’) where user =
‘test1’ and host = ‘%’;
flush privileges;

注意:
通过表的⽅式修改之后,需要执⾏flush privileges;才能对⽤户⽣效。
5.7中user表中的authentication_string字段表⽰密码,⽼的⼀些版本中密码字段是password。

3.5 给用户授权

grant privileges ON database.table TO ‘username’[@‘host’] [with grant option]

grant命令说明:
• priveleges (权限列表),可以是all,表⽰所有权限,也可以是select、update等权限,多个权限之间⽤逗号分开。

• ON ⽤来指定权限针对哪些库和表,格式为数据库.表名 ,点号前⾯⽤来指定数据库名,点号后⾯⽤来指定表名,. 表⽰所有数据库所有表。

• TO 表⽰将权限赋予某个⽤户, 格式为[email protected],@前⾯为⽤户名,@后⾯接限制的主机,可以是IP、IP段、域名以及%,%表⽰任何地⽅。

• WITH GRANT OPTION 这个选项表⽰该⽤户可以将⾃⼰拥有的权限授权给别⼈。

注意:经常有⼈在创建操作⽤户的时候不指定WITH GRANT OPTION选项导致后来该⽤户不能使⽤GRANT命令创建⽤户或者给其它⽤户授权。

⽰例:
grant all on . to ‘test1’@‘%’;
说明:给test1授权可以操作所有库所有权限,相当于dba

grant select on seata.* to ‘test1’@’%’;
说明:test1可以对seata库中所有的表执⾏select

grant select,update on seata.* to ‘test1’@’%’;
说明:test1可以对seata库中所有的表执⾏select、update

3.6 查看用户有哪些权限

show grants for ‘⽤户名’[@‘主机’]
主机可以省略,默认值为%,⽰例:
mysql> show grants for ‘test1’@‘localhost’;

show grants;
查看当前⽤户的权限

在这里插入图片描述

3.7 撤销用户的权限

revoke privileges ON database.table FROM ‘⽤户名’[@‘主机’];
可以先通过show grants命令查询⼀下⽤户对于的权限,然后使⽤revoke命令撤销⽤户对应的权限

3.8 删除用户【2种⽅式】

⽅式1:
drop user ‘⽤户名’[@‘主机’],⽰例:
drop user [email protected];
drop的⽅式删除⽤户之后,⽤户下次登录就会起效。

⽅式2:
通过删除mysql.user表数据的⽅式删除,如下:
delete from user where user=‘⽤户名’ and host=‘主机’;
flush privileges;
注意通过表的⽅式删除的,需要调⽤flush privileges;刷新权限信息(权限启动的时候在内存中保存着,通过表的⽅式修改之后需要刷新⼀下)。

授权原则说明
• 只授予能满⾜需要的最⼩权限,防⽌⽤户⼲坏事,⽐如⽤户只是需要查询,那就只给select权限就可以了,不要给⽤户赋予update、insert或者delete权限

• 创建⽤户的时候限制⽤户的登录主机,⼀般是限制成指定IP或者内⽹IP段

• 初始化数据库的时候删除没有密码的⽤户,安装完数据库的时候会⾃动创建⼀些⽤户,这些⽤户默认没有密码

• 为每个⽤户设置满⾜密码复杂度的密

• 定期清理不需要的⽤户,回收权限或者删除⽤户