1.什么是数据库
数据库(英文Database) 是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储和管理数据的仓库,我们可以通过数据库提供的多种方法来管理数据库中的数据。
1.1.数据库的基本概念
数据库(DB):长期存储、有组织的、可共享的数据集合。
数据库管理系统(DBMS),DataBase Management System,是统一管理数据库的软件,负责数据库的建立、操作和管理以及维护的软件系统。
数据库管理人员(DBA):对数据库进行建立、调整、维护、改善。
数据库系统(DBS):由计算机系统、数据库、数据库管理系统、应用程序和数据库管理员(DBA)组成。
1.2.常见数据库
1.3.目前国内主要有三大数据库厂商
神州通用
武汉达梦
人大金仓
2.数据库主要功能
数据库管理系统是数据库系统的核心,是管理数据库的软件。数据库管理系统就是实现把用户意义下抽象的逻辑数据处理,转换成为计算机中具体的物理数据处理的软件。有了数据库管理系统,用户就可以在抽象意义下处理数据,而不必顾及这些数据在计算机中的布局和物理位置。
SQL语言
SQL语言(Structured Query Language)包含4个部分:
数据查询语言DQL-Data Query Language
数据操纵语言DML-Data Manipulation Language
数据定义语言DDL-Data Definition Language
数据控制语言DCL-Data Control Language
DQL(Data Query Language):数据查询语言。
DML(data manipulation language):数据库操纵语言。
包括如下的SQL语句:增删改查
insert :添加数据到数据库中
update : 修改数据库中的数据
delete : 删除数据库中的数据
select:查询数据库中的数据
DDL(data definition language):数据库定义语言,比如创建、修改或删除数据库对象。
create table : 创建数据库表
alter table :更改表结构、添加、删除、修改列长度
drop table :删除表
create index : 在表上创建索引
drop index :删除索引
DCL(data control language):数据库控制语言。
包括如下SQL语句:
grant : 授予访问权限
revoke :撤销访问权限
commit : 提交事务处理
rollback : 事务处理回退
3.数据库常见类型及区别
早期比较流行的数据库模型有三种,分别是层次式数据库、网络式数据库和关系型数据库。在当前的互联网中,最常用的数据库模型主要是有两种,及关系型数据库和非关系型数据库。
3.1.关系数据库
关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。
简单说,关系型数据库是由多张能互相联接的二维行列表格组成的数据库。
3.2.非关系型数据库
非关系型数据库也被称为NoSQL数据库,NoSQL的本意是“Not Olnly SQL”(不仅仅是SQL),指的是非关系型数据库,而不是No SQL”的意思。
NoSQL是对不同于传统的关系数据库的数据库管理系统的统称,泛指非关系型的数据库。
NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
3.3.两者优缺点
4.数据库可能存在的风险
网络的延伸伴随着计算机应用的范围不断扩大,人们熟识了各类别数据库配有的操作流程。但是,网络框架下的数据,往往会存留着被窃取、被黑客所毁损等弊病。为缩减数据被窃的机率,就应提升数据库的安全性,构建出防控必备的微机体系。
数据库系统作为计算机信息系统的重要组成部分,数据库文件作为信息的聚集体,担负着存储和管理数据信息的任务,其安全性将是信息安全的重中之重。
4.1.数据库在WEB中的风险
弱密码&默认密码
弱密码(Weak passwords)即容易破译的密码,多为简单的数字组合、帐号相同的数字组合、键盘上的临近键或常见姓名,例如“123456”、“abc123”、“Michael”等。终端设备出厂配置的通用密码等都属于弱密码范畴。数据库一般在刚开始安装时都会使用的默认密码,这时候就需要数据库管理人员在以后的维护过程中将默认密码修改为符合安全规范的密码,而往往有数据库管理人员因为一些原因并没有修改默认密码,导致黑客可以轻而易举的通过默认密码登录数据库。
暴力破解
密码被黑客通过其他方式获取的信息生成字典通过暴力破解穷举出。撞库
通过已收集到的在其他服务中注册的用户名和密码,对目标数据库进行访问尝试。由于很多人习惯用相同密码和账号,因此成功登陆到目标数据库的可能性大大提高,达成盗取大量敏感信息的目的。
SQL注入
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。
SQL注入的攻击原理就是攻击者通过Web应用程序利用SQL语句或字符串将非法的数据插入到服务器端数据库中,获取数据库的管理用户权限,然后将数据库管理用户权限提升至操作系统管理用户权限,控制服务器操作系统,获取重要信息及机密文件。
SQL注入能够通过构建恶意的SQL语句来实现攻击者想要达到的目的,而并不是按照开发者的意图去执行SQL语句。
通过已知漏洞
这往往是由于数据库管理人员,没有及时对于数据库进行更新,或者并没有安装最新的安全补丁,导致的。
在黑客检测到数据库版本之后,会针对性的对该版本曝出的已知漏洞进行攻击。
所以防范该攻击最有效的手段就是及时的更新数据库软件,并打最新的补丁。
4.2.DBA使数据库面临的风险
人为误操作
数据库管理人员误操作,导致删除数据、更改数据。
过于相信用户输入方法
当开发人员过于相信用户输入时,往往就会出现SQL注入漏洞。如果不对其进行验证,开发者就有可能允许黑客对数据库进行终端访问。
数据库错误消息显示给终端用户
在应用程序的SQL查询出现问题时,攻击者利用弹出的特定的错误消息,了解数据库的组织结构个应用程序查询等许多重要的信息,从而展开攻击。
将调试代码留放到生产环境中
开发人员忘记在生产环境中清除调试代码,造成打开后门的情况。
劣质加密
劣质加密比不使用加密还糟糕,错误的使用加密这种行为会给企业带来一种虚假的安全感。开发人员应当谨慎的对待加密技术方面的技能和技巧。
4.3.数据库本身存在的风险
存储文件解析后为明文
数据库的数据是存储在物理文件里,这些数据按照数据库自定义的格式组织在数据库中,但这些数据本质上都是明文存储;主流的大型数据库数据文件的组织结构主动或被动公开化,只要得到这些数据文件,存储的数据其实就是透明的。
这些存储文件包括数据库的数据文件、备份文件、日志文件等;这样只要能够访问或得到数据库存储文件,就可以获得数据库中的信息。
数据库系统存在安全漏洞
数据库往往被认为具备较为完备的安全机制,从身份认证、访问控制、到通讯加密,但事实上数据库也存在诸多的安全漏洞;
这些漏洞大多是国际上的安全专家对数据库安全状况进行研究后发现的,包括提权漏洞、缓冲区溢出漏洞、系统注入漏洞。
数据库应用访问控制缺陷
数据库应用的访问控制机制,依然是典型的三元组,也就是主体、客体和操作,其中主体主要是数据库用户或角色,客体是数据库对象,操作是典型的DDL、DML、ACL语句和某些维护操作;但对这些操作的具体内容和影响不再做控制。
5.MySQL数据库
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
数据库维护包括备份系统数据、恢复数据库系统、产生用户信息表,并为信息表授权、监视系统运行状况,及时处理系统错误、保证系统数据安全,周期更改用户口令。
当一个数据库被创建以后的工作都叫做数据库维护。数据库维护比数据库的创建和使用更难。
5.1.数据库系统表结构
数据表,简称表,由一组数据记录组成,数据库中的数据是以表为单位进行组织的。一个表是一组相关的按行排列的数据;每个表中都含有相同类型的信息。表实际上是一个二维表格。
定义表的方式:
MySQL自带的数据库以及系统表
mysql自带有四个数据库,分别是:mysql、information_schema、test、performance_schema。
1.mysql库主要存储各类权限相关信息及帮助信息。
2.information_schema库主要存储数据库对象相关概要(schema)信息。
3.test是一个测试用的空数据库。
4.performance_schema主要存储配置及性能信息。
相关命令:
MySQL自带的数据库以及系统表-MYSQL库
MySQL自带的数据库以及系统表-information_schema库
MySQL自带的数据库以及系统表-information_schema库-schemate表
MySQL自带的数据库以及系统表-information_schema库-tables表
MySQL自带的数据库以及系统表-information_schema库-columns表
Information_schema库
通过Information_schema库非法获取数据库信息的大概手段
database()通过此函数查看当前所在库
select schema_name from information_schema.schemata;查询当前数据库中的所有库,排查存有敏感信息的库。
select table_name from information_schema.tables where table_schema='mysql';查询目标数据库下的所有表。如:mysql数据库。
select column_name from information_schema.columns where table_schema='mysql' and table_name='user' ;查询目标数据库目标表的所有字段名称。 如:mysql数据库的user表。
select user from mysql.user;通过之前操作获取信息后查询表内存储的信息。
以上的查询方法并非死规定,查询命令只提供思路,在注入时可自由变形或替换以用来绕过过滤和检测。
5.2.数据库增删改查
5.2.1.准备工作
1. 安装phpstudy
2..安装navicat
登陆MySQL:
mysql -u 用户名 -p密码
mysql –u 用户名 –p 回车,密码( 安全性高 )
MySQL 在 Linux 与 window 下的大小写规则:
1、数据库名、表名、表别名严格区分大小写
2、列名、列的别名忽略大小写
3、变量名严格区分大小写
4、MySQL 在 Windows 下各个对象名都不区分大小写
5.2.2.SQL语句简介
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。sql 语句就是对数据库进行操作的一种语言。
SQL是一种特定目的程序语言,用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。
SQL基于关系代数和元组关系演算,包括一个数据定义语言和数据操纵语言。SQL的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。尽管SQL经常被描述为,而且很大程度上是一种声明式编程(4GL),但是其也含有过程式编程的元素。
5.2.3.MYSQL数据库基本操作
在数据库的操作中最基础的就是增删改查的操作,这里我们使用mysql数据库给大家讲一下增删改查这四个基础操作。
增删改查主要是指:增-create;删-delete;改-update;查-select。这四种操作,除了这四种操作,还有其他的函数也可以做到这些操作。
5.2.4.数据表简单使用
创建数据库info:
create database info;
创建字符集为utf8的数据库info:
create database info charset utf8;
进入数据库info:
use info;
查看info数据库下所有的表:
show tables;
5.2.5.mysql 数据库的字符集
5.2.6.增删改查
完整性约束条件
增-insert
指定列插入数据
INSERT INTO 表名(列1,…… 列n) VALUES(值 1,…… 值 n);
或者
直接插入数据
INSERT INTO 表名 VALUES(值 1,…… 值 n);
insert注意事项
1. 值列表的个数必须与列名数目保持一致;
2.可以进行多条添加,添加完每条数据后,用逗号隔开即可;
3. 值列表中值的数据类型、精度要与对应的列类型保持一致,例如:
不能将一个长度为80的字符串加入到长度为40的列中;
4. 可以不指定列名,但值列表中值的顺序应该与表中字段顺序保持一致;
5.字符和日期型数据应包含在单引号中。
6. 值列表中的数据项,应符合对应列的检查约束要求;
复制数据
语法: INSERT INTO <表2> [列名] SELECT <列名> FROM <表1>
1 、< 表 2> 必须事先存在,表2是新表。如果不存在,执行时将会出现错误。
2 、查询出的字段数目、数据类型、字段顺序,与插入列保持一致。
删除表中定义的数据
delete from 表名 [where 条件]
删-drop
删除数据
1. 如果不使用where子句,将删除表中所有数据。
2. Delete语句不能删除某一列的值(可使用update)
3. 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
单表修改
update 表名 set 字段名=字段内容 [where 条件];
修改表结构
1. alter table 表名 add 字段名 字段约束条件 # 增加字段
2. alter table 表名 drop 字段名 # 删除字段
3. alter table 表名 change 字段名 新字段名 字段约束条件 # 修改字段
4. alter table 表名 modify 字段名 字段约束条件 # 修改字段约束条件
选择表中的若干列
(1)查询指定的列
select id,name from student;
(2)查询所有的列
select * from student;
(3)查询经过计算的值
select id,2018-age from student;
选择结果集中的若干行
(1) 消除值重复的行
select distinct name from student;
(2) 查询满足条件的行
select name from student where 条件;
(3) 限制结果集显示的行数
select * from student limit 0,1;
show命令能够查看当前数据库,以及数据表:
show databases;能够查看所有数据库,主要database后边不要忘了加s;
show tables;能够查看当前库下的所有数据表,这个操作要用在已经通过“use 库名”进入库之后才能查到
5.3.结构化查询语言SQL
where常用的比较运算符
查询姓名为aa的学生信息
select * from stu where name=‘aa’;
查询所有女生(非男生)的学员信息
select * from stu where sex <> ’boy’;
通配符
字符匹配
select school from student where name like ‘zhang%’
select school from student where name like ‘zhang_’
例:
查询姓张的学员信息
select * from student where name LIKE ‘张%’;
select * from student where name LIKE‘王_’;
ORDER BY子句
用户可以用ORDER BY字句对结果集按照一个或多个数据列的升序(ASC)或
降序(DESC)排列,默认升序
select * from student order by name desc;
group by 语句
将结果集按照某一列或多列的值进行分组,值相等的为一组。
分组后,聚集函数将作用于结果集中的每一个组。
5.4.数据处理
concat(str1,str2..)函数直接连接
group_concat(str1,str2..)函数使用逗号做为分隔符
concat_ws(sep,str1,str2..)函数使用第一个参数做为分隔符
concat的使用限制
当concat后面连接的字符有一个是空时,整个显示为空。
5.5.联合查询
在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询叫做子查询,又叫嵌套查询。
1. 带有IN谓词的子查询
# 查询与zhangsan一个系的所有同学的名字
select name from student where dept in (
select dept from depts where name = ‘zhangsan’)
3. 带有ANY或ALL谓词子查询
查询一班学生年龄大于二班所有人年龄的人
select name from ban_1 where age>ALL (select age from ban_2)
查询一班学生年龄小于一班所有人年龄的人
select name from ban_2 where age<ALL (select age from ban_1)
内外连接
内连接
Table_a Inner join table_b on …..
内连接使用比较运算符,对两个表中的数据,进行比较,并列出与连接条件匹配的数据行,组合成新的记录。
在内连接查询中,只有满足条件的记录,才会出现在查询结果中。
左连接(左外连接)
left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
右连接(右外连接)
right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
图示:
UNION联合查询
UNION查询就是把2条或者多条查询语句的结果合并成1个结果集
使用union all显示所有数据
UNION查询注意事项:
1. UNION关键字只能连接查询语句
2. UNION关键字两侧的查询语句,结果集必须有相同的列数
5.6.Mysql维护
5.6.1.数据的备份和恢复
MySQL的数据的逻辑备份使用的mysqldump命令
1.只备份数据表,不备份数据库
也就是没有create database和user database 的语句
mysqldump -u username -p password dbName > name.sql存放路径
恢复的语句:首先需要创建好数据库,才能使用下面的命令
2.同时备份数据库
mysqldump -u username -p password -B dbName > name.sql路径
恢复语句:
mysql -uusername -ppassword[dbname]<filename.sql
username: 登录的用户名。
password : 表示用户的密码
dbname 表示要还原的数据库名称,若使用mysqldump命令备份的filename.sql文件中包含创建数据库的语句,则不需要指定数据库。
5.6.2.访问控制&用户管理
查看当前数据库下的用户
mysql 用户登录的时候需要三个认证:
1.用户名
2.密码
3.客户端
例如:
新建一个账号,用户名为u3;登录主机为192.168.76.2;密码为123456。
create user 'u3'@'192.168.76.3' identified by '123456';
用户名和登录主机合起来构成mysql的用户名。通过查询mysql数据库中的user表,我们可以清楚的看到即使用户名相同,登录主机不相同也构成了两个账号。
修改用户密码
mysql>set password for ‘user’@’host' = password(‘new_password');
修改用户账号
mysql>rename user ‘old_user’@’old_host’ to ‘new_user’@’new_host’
删除用户
mysql>drop user ‘user’@’host’;
用户权限
1. 可以限制用户访问哪些库、表、列
2. 可以限制用户可以执行哪些操作SELECT、CREATE、DELETE、ALTER等
3. 可以限制用户登陆的IP或域名
4. 可以限制用户是否可以把自己权限授予给他人
查看用户权限
mysql>show grants for ‘user’@’host’;
5.6.3.日志查看
1.错误日志(log-error)
2.查询日志(log)
3.二进制日志(log-bin)
4.慢查询日志(log-slow-queries)
5.更新日志(log-update)
1. 错误日志(log-error)
[开启方式]
my.ini配置文件[mysqld]选项下,添加log_error=路径,如D:/error.txt
[作用]
记录在启动、运行或停止mysqld时出现的致命性问题,都是系统级的错误记录。
2. 查询日志(log)
[开启方式]
my.ini配置文件[mysqld]选项下,添加log=路径,如D:/log.txt
[作用]
主要是记录数据库建立的客户端连接和执行的语句
3. 二进制日志(log-bin)
[开启方式]
my.ini配置文件[mysqld]选项下,添加log_bin=路径,如D:/bin_log.txt
[作用]
主要是记录所有的更改数据的语句
4. 慢日志(log-slow-queries)
[开启方式]
my.ini配置文件[mysqld]选项下,添加
Log_slow_queries = 路径
long_query_time = 秒 (设定慢查询的标准,单位是s/秒)
[作用]
主要是记录所有执行时间超过long_query_time的查询
5.6.4.MySQL加固
1.防止空口令/弱口令
修改用户密码
mysql>set password for ‘user’@’host' = password(‘new_password');
2. 历史命令行密码设置为不可见
在登陆mysql时,使用mysql –uroot –p的形式
[my.ini]
bind-address=127.0.0.1