《深入浅出MySQL++数据库开发,优化与管理维护》


书籍介绍

深入浅出MySQL

更新图书信息或封面

作者: 唐汉明 / 翟振兴 / 关宝军 / 王洪权
出版社: 人民邮电出版社
副标题: 数据库开发、优化与管理维护
出版年: 2014-1-1
页数: 635
定价: 99.00元
装帧: 平装
ISBN: 9787115335494

第1章 MySQL的安装

这里书中mysql是到官网下载,但是我个人推荐去下载phpstudy,lamp,wamp这些集成的软件,其中可以很方便的下载安装apache,nginx,php,mysql等。而启动/关闭mysql可以直接在phpstudy中进行启动。

mysql -h localhost -u root -p password
//这里-h后加上链接数据库的地址,因为在本地hosts文件里,lcoalhost和127.0.0.1是对应关系,-r后加上登录的数据库的用户名,-p后加上该用户登录的密码

第2章 SQL基础

这里推荐可以去菜鸟教程去了解更多。

分为三类:DDL,DML,DCL

DDL:数据定义语言,create,drop,alter等

DML:数据操作语句,用于数据的添加,删除,更新和查询,insert,delete,update,select等

DCL:数据控制语句,grant,revoke等

DDL语句

在登录成功后会显示mysql版本,以及链接的id次数

create database test1; //先创建一个叫做test1的数据库
show databases; //显示所有的数据库
其中
imformation_schema是存储了一些数据库对象信息,比如用户表信息,列信息,权限信息,字符集信息,分区信息,我们以后的sql注入也是先练习从这里查询开始
mysql储存了系统的用户权限信息
test自动创建的测试数据库,任何用户都可以使用

use test; //选择某数据库
show tables; //选择上了某数据库后可以show展示列表

drop database test;//删除test这个数据库
create table tablename(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));//创建一个叫tablename的表,表的信息如下
desc tablename;//显示表的信息
show create table tablename;//显示创建的表的过程
drop table tablename;//删除表
alter table tablename modify enname varchar(20);//修改tablename这个表中ename这个字段的type改成varchar(20)
alter table tablename add column age int(3);//增加一个字表段
alter table tablename drop column age;//删除一个表字段
alter table tablename change age age1 int(4);//修改一个表字段的名字
alter table tablename add birth date after ename;//add默认情况下是把新的数据加在最后面,也可以xxx after xxx,把新数据加在某某数据的后面或者前面(first)
alter table tablename rename tablename1;//把tablename这个表的名字改成tablename1

我们看到,除了创建表的语句外,还可以看到ENGINE=MyISAM DEFAULT CHARSET=utf8,存储引擎和字符集\G是使得记录能按照字段竖向排列

DML语句

insert into tablename(ename,hiredate,sal,deptno) values('lisa','2003-02-01','3000',2);//插入记录
没写的字段自动设置为null
select * from tablename;//显示表
insert into tablename values(5,'dept5'),(6,'dept6');//一次插入两条数据
update tablename set sal=4000 where ename='lisa';//更新表tablename的字段
delete from tablename where ename='dony';//删除记录
select username,password from tablename where id='1';//这里意思是选择这个tablename表,选择username,password这两名中id=1,也就是行等于1的数据
同样的,where后面可以配合><=and or等符号,例如
select * from tablename where deptno=1 and sal<3000;
select * from tablename order by sal;//这里是按照sal的从小到大的顺序进行排列,也可以从大到小,对于sal中相同的数值,再加上别的进行排序也可以
select * from tablename order by sal,id,deptno desc limit 1,3;//含义是从大到小排序limit显示从第二条开始后的三条记录
select count(1)/max/min/sum from tablename group by deptno with rollup having count(1);//聚合
合并两个表
select * from emp;
select * from dept;
select ename,deptname from dept,emp where emp.deptno=dept.deptno;
右连接和左连接
select enname,deptname from emp left join dept on emp.deptno=dept.deptno;
select enname,deptname from emp right join dept on emp.deptno=dept.deptno;
子查询
select * from emp where deptno in(select deptno from dept);
如果子查询数唯一,还可以用=代替in
select * from emp where deptno deptno = (select deptno from dept limit 1);
联合查询union,union all,区别是union会把重复的结果去重

DCL语句

创建一个数据库用户z1,具有对sakila数据库中所有表的select,insert权限
grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';
这里grant是赋予某种权限,sakila.* 代表这个数据库中的所有表 给 z1这个用户,地址是localhost本地,密码是123

对insert权限收回,只保留select权限
revoke insert on salika.*from 'z1'@'localhost';

? contents
显示可供查询的分类,对于列出来的分类,可以进一步查看,比如? data types

mysql提供了一个新的数据库,information_schema,用来记录mysql中的元数据信息,元数据是指数据的数据,比如表名,列名,列类型,,索引名

有一些比较常用的视图

schemata 提供了所有数据库的信息,show databases;显示所有数据库
table
columns
statistics 提供索引信息

第3章 MySQL支持的数据类型

数值类型

数据类型 字节 最小 最大
tinyint 1 有符号-128,无符号0 有符号127,无符号255
smallint 2 -32768,0 255的n次方
mediumint 3
int,integer 4
bigint 5
float,double 4,8
dec(m,d),decmal(m,d) m+2
bit 1-8
例如
create table t1(id1 int,id2 int(5)); 

insert into t1 values(1,1);

alter table t1 modify id1 int zerofill;

bin()2进制 hex()16进制

mysql中时间和日期的表示

年月日 date
年月日时分秒 datetime
时分秒 time
日期和时间 字节 例如
date 4 xxxx-xx-xx
datetime 8 xxxx-xx-xx xx:xx:xx
timestamp 4 某个具体的时刻
time 3 xx:xx:xx
year 1 xxxx
应用
create table t1(t time,d date,dt datetime);

用now()函数插入当前日期
insert into t values(now(),now(),now());

字符串类型

(1)char二号varchar

两者区别首先是在长度上,varchar可以指定长度,其次char检索数据时会自动删除空格,而varchar会保留空格

例如
create table vc (v varchar(4), c char(4));

insert into vc values('ab   ','ab   ');

select length(v),length(c) from vc;//但是最好后面拼接一个,好观看

select concat(v,'+'),concat(c,'+') from vc;
显示:ab   +,ab+

此外还有binary,varbinary类型,包含二进制字符串,而不包含非二进制字符串,enum枚举类型,范围是所枚举的个数之间

set类型,重点(在sql注入时当select被过滤时,可以配合一起使用)

set用于设置变量名和值
prepare用于预备一个语句,并赋予名称,以后可以引用该语句
execute执行语句
deallocate prepare用来释放掉预处理的语句

-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#

拆分开来如下
-1';
set @sql = CONCAT('se','lect * from `1919810931114514`;');
prepare stmt from @sql;
EXECUTE stmt;
#

第4章 MySQL中的运算符

算术运算符+,-,*,/ div,% mod

比较运算符=,<>,《》,=>,=<,is null,in ,between,is not null,like通配符匹配,regexp rlike正则表达式等

当进行数值大小于比较,字符串比较时等,正确则返回1,错误则返回0

between
select 10 between 10 and 20,9 between 10 and 20;

in
select 1 in (1,2,3), 't' in ('t','a','b','l','e'),0 in (1,2);

is null,当a的值为null返回1,否则返回0
select 0 is null,null is null;

is not null;和上面的is null相反
select 0 is null,null is null;

like通配符匹配
a like %123%,当a中含有123时返回1,否则0

regexp,rlike,正则表达式不必多说

逻辑运算符

not !逻辑非

and && 逻辑与

or || 逻辑或

xor 逻辑异或

xor 对于一个操作数为null返回null,对于两个逻辑真假值想异,则返回结果1,否则返回0.
select 1 xor 1,0 xor 0,1 xor 0,0 xor 1,null xor 1;

位运算符

对于位运算符,先转换位二进制进行与或非操作之后再返回结果

第5章 常用函数(重点)

这里的常用函数,有一些在sql注入时能很好的用上

函数 功能
concat(a,b) 把a和b拼接在一起
insert(str,a,b,instr) 把字符串str的第a的字符到第b个字符替换成instr
lower(str) 把所有字符都变成小写
upper(str) 把所有字符都变成大写
left(str,x) 返回字符串str最左边的x个字符
right(str,x) 返回字符串str最右边的x个字符
lpad(str,n,pad) 用字符串pad对str从左到右进行填充,直到第n个
rpad(str,n,pad) 用字符串pad对str从右到左进行填充,直到第n个
ltrim(str) 去掉字符串左侧的字符
rtrim(str) 去掉字符串右侧的字符
repeat(str,x) 返回str重复x次的结果
replace(str,a,b) 用字符串b替换str中所有出现的a
strcmp(a1,a2) 比较a1和a2,返回0或1
trim(str) 去掉两侧的空格
substring(str,x,y) 返回从字符串x位置起y个字符长度的字串

数值函数

函数 功能
abs(s) 返回x的绝对值
ceil(x) 返回大于x的最小整数值
floor(x) 返回大于x的最大整数值
mod(x,y) 返回x/y的模
rand() 返回0到1的随机数
round(x,y) 返回x的四舍五入有y位小数的值
truncate(x,y) 返回数字x阶段为y的小数的结果

其他函数(重点)

凡是重点,都是sql注入中会用到的

函数 功能
database() 返回当前数据库
version() 返回数据库版本
user() 返回当前登录用户名
inet_aton() 返回ip地址的数字表示
inet_nota() 返回数字代表的ip地址
password(str) 返回字符串str的加密版本
md5() 返回MD5加密后的str

第6章 MySQL图形化管理工具使用

这里我推荐用Navicat for MySQL,网上有很多的使用教程和破解版,另一个是phpmyadmin,是用php编写可以通过web形式控制mysql数据库,但是只有在php5.5+版本才能使用,

通常的配套就是php+mysql+apache+phpMyAdmin,java+oracle+tomcat。具体的使用方法可以自行搜索文章和视频,这里不过多赘述。


其实从这里开始是开发篇,对于sql注入来说已经意义不大了,但是秉承着开发+安全,ACM+CTF,审计+红队的原则,还是对此进行了解

第9章 字符集

先大致总结一下数据的传输方式,首先数据是通过二进制进行传输的,比如我输入的一个数8,可以按照不同的编码方法把他转换为8位01表示的二进制数字,当我这边发送数据后,会走(交换机+)路由器,这个过程是模电,再到光猫(也就是调制解调器),再之后是数电,把01分成高频和低频两种方式代表0和1,并把控好节奏和顺序,在传播过程中信号会衰减所以要中继放大器。

接下来不废话直接说字符集,通常编码和密码学也有联系

unicode编码,utf-8,utf-16,ascii,gbk2312,其中gbk2312是汉字编码集,utf-8更多用

btree索引和hash索引,简单来说索引数据时是一条道走到黑,再去遍历其他的,还是先遍历其他的,再挨个走。这个和网络爬虫其实道理是一样的

第15章 SQL中的安全问题

sql注入

创建用户
insert into 'user' values(1,'ange1','mypass';

很多语言都有应对方式,比如Java可以绑定变量

mysql c api:使用mysql_real_escape_string() api调用,

  • \x00
  • \n
  • \r
  • \
  • \x1a

这些字符会被转义,或者mysql_query()

mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。

对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。

mysql++:可以使用escape和quote修饰符

再或者就是自己定义字符,已知的非法字符过滤后也可以通过组合,编码,进制等攻击。


文章作者: Lightning
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lightning !
评论
  目录