linux之mysql数据库搭建及sql注入和防御

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

mysql中文手册下载地址:http://down.51cto.com/data/2244392

sql注入各种姿势:http://wt7315.blog.51cto.com/10319657/1828167

sqlmap注入神器详解:http://wt7315.blog.51cto.com/10319657/1841241


数据库分为三种基本形式 : (其实这些都是众所周知的,只是为了知识的完整性,简单的带过)

关系型数据库

层次型数据库

网状型数据库


运行在Linux系统上的关系型数据库管理系统主要产品:

企业级服务器:OracleSybaseDB2

中小型服务器:MySQLPostgreSQL

 

一、MySQL简介和安装

总体来说,MySQL数据库管理系统具有以下主要特点:

①可以运行在不同平台上,支持多用户、多线程和多CPU,没有内存溢出漏洞;

②提供多种数据类型,支持ODBCSSL、支持多种语言利用MySQLAPI进行开发;

③是目前市场上现有产品中运行速度最快的数据库系统;

④同时访问数据库的用户数量不受限制;

⑤可以保存超过50,000,000条记录;

⑥用户权限设置简单、有效。

 

 

查看系统中是否已安装mysql软件,若无任何显示表明未安装。

1
rpm -qa  *mysql*


 

DVD安装光盘放入光驱,并将光驱挂载到/mnt目录中。

1
mount  /dev/cdrom  /mnt


由于此主机既作为服务器端又作为客户端,这里先安装MySQL的客户端安装包,该安装包的依赖软件包是perl-DBIMySQL的服务端安装包还要依赖perl-DBD-MySQL软件包


wKioL1fpIASicbIeAAGKPpZr6Ew602.png


1
2
3
4
5
6
7
8
9
10
11
MySQL服务的启动、停止、重启和查询启动状态
service  mysqld start|stop|restart|status
 
2.设置开机自动启动的功能
chkconfig  --level  35  mysqld   on
 
 
3.设置MySQL数据库root账号的密码
mysqladmin  -u 用户名  [-h 服务器主机名或IP地址] [-p]  password   '新口令'
  
root用户默认的空口令,先将root用户的密码设置为123,再将用户root的密码改为456。



wKiom1fpIDDwvANAAAARpR7t_TE611.png


1
2
登录及退出MySQL环境
mysql -h 主机名或IP地址  -u 用户名  -p 用户密码


 

wKiom1fpIE3iTZJlAABf2qgU9zY596.png


接下来就是数据库的知识了



二、数据库管理

 

MySQL命令

功能

show  databases;

查看服务器中当前有哪些数据库

use  数据库名;

选择所使用的数据库

create database 数据库名;

创建数据库

drop database 数据库名;

删除指定的数据库

 

mysql安装后默认会创建三个数据库information_schemamysqltest, 其中名为“mysql”的数据库很重要,它里面保存有MYSQL的系统信息,用户修改密码和新增用户,实际上就是针对该数据库中的有关数据表进行操作。

wKioL1fpIGuiWM6uAAAaKDEVHUg385.png


 

看到information_schema,玩过mysql的手工注入的童鞋是不是很亲切了

 

 

三、数据表结构管理

MySQL命令

功能

create table 表名 (字段设定列表);

在当前数据库中创建数据表

show  tables;

显示当前数据库中有哪些数据表

describe  [数据库名.]表名;

显示当前或指定数据库中指定数据表的结构(字段)信息

drop table [数据库名.]表名;

drop table [数据库名.]表名;

 

 

创建表的时候必须至少有一个列

wKioL1fpIIjg1fIbAABEaDFXKuI794.png


四、记录的查看、插入、修改与删除



MySQL命令

功能

insert into 表名(字段1,字段2,……) values(字段1的值字段2的值,……);

向数据表中插入新的记录

update 表名 set 字段名1=字段值1[,字段名2=字段值2]  where 条件表达式;

 

修改、更新数据表中的记录

 

select 字段名1,字段名2……from 表名where 条件表达式;

 

从数据表中查找符合条件的记录

 

select * from 表名;

 

显示当前数据库的表中的记录

 

delete from 表名 where 条件表达式;

 

在数据表中删除指定的记录

 

delete from 表名;

 

将当前数据库表中记录清空



向wt库wt表中插入id列,字段为17。

wKiom1fpIK7DtPyKAAAj4MwSMnA025.png


将wt库wt表中的id列的字段更新为117.

wKiom1fpIMiwn3t-AABKGnDfgg8873.png



五、用户与权限管理


1
创建与授权用户 grant  权限列表 on 数据库名.表名 to 用户名@来源地址 [identified by ‘密码’]



                主要用户权限

select

读取表的数据

insert

向表中插入数据

update

更新表中的数据

delete

删除表中的数据

index

创建或删除表的索引

create

创建新的数据库和表

alter

修改表的结构

grant

将自己拥有的某些权限授予其他用户

drop

删除现存的数据库和表

file

在数据库服务器上读取和写入文件

reload

重新装载授权表

process

查看当前执行的查询

shutdown

停止或关闭mysql服务

all

具有全部权限

 

1.增加一个名为testMySQL用户,允许其从本地主机(MySQL数据库所在的主机)上登录,且只能对数据库student进行查询,用户密码设置为123456


wKioL1fpIQyTMgf0AAAb10ZLsBk745.png


验证该用户能进行登录、查询,无法做其他操作,和预想的是一样的。

wKioL1fpISeDqkf_AABRk9amItk096.png


2.查看用户的权限

1
show  grants   for   用户名@域名或IP地址;


wKioL1fpIUrxW_21AAA0zP_SRcc180.png


3.撤销用户的权限

1
revoke  权限列表   on  数据库名.表名   from   用户名@域名或IP地址;


wKiom1fpIW7APQizAABHWONyuBQ152.png



六、数据库的备份与恢复

 

(1).直接备份数据库所在的目录

使用cptar等命令直接备份数据库所存放的目录

2.使用mysqldump命令备份和恢复

1
mysqldump -u 用户名 -p [密码] [选项] [数据库名] [表名] > /备份路径/备份文件名


 

wKiom1fpIYijWo0HAAB1MjYlm3M516.png


附:mysqldump的几种常用方法:

 

1)导出整个数据库(包括数据库中的数据)

mysqldump -u username -p dbname > dbname.sql    

 

2)导出数据库结构(不含数据)

mysqldump -u username -p -d dbname > dbname.sql    

 

3)导出数据库中的某张数据表(包含数据)

 mysqldump -u username -p dbname tablename > tablename.sql    

 

4)导出数据库中的某张数据表的表结构(不含数据)

mysqldump -u username -p -d dbname tablename > tablename.sql  

 

常用参数说明:

--all-databases——备份服务器中的所有数据库内容;

--opt——对备份过程进行优化,此项为默认选项

 

 

 

(2.)恢复(导入)数据

1
mysql -u root -p [数据库名] < /备份路径/备份文件名


wKioL1fpIazg1pg6AAAQKkFLykQ687.png


七、sql注入



SQL注入产生的原因,和栈溢出、XSS等很多其他的攻击方法类似,就是未经检查或者未经充分检查的用户输入数据,意外变成了代码被执行。针对于SQL注入,则是用户提交的数据,被数据库系统编译而产生了开发者预期之外的动作。也就是,SQL注入是用户输入的数据,在拼接SQL语句的过程中,超越了数据本身,成为了SQL语句查询逻辑的一部分,然后这样被拼接出来的SQL语句被数据库执行,产生了开发者预期之外的动作。

所以从根本上防止上述类型攻击的手段,还是避免数据变成代码被执行,时刻分清代码和数据的界限。而具体到SQL注入来说,被执行的恶意代码是通过数据库的SQL解释引擎编译得到的,所以只要避免用户输入的数据被数据库系统编译就可以了。

 

现在的数据库系统都提供SQL语句的预编译(prepare)和查询参数绑定功能,在SQL语句中放置占位符'?',然后将带有占位符的SQL语句传给数据库编译,执行的时候才将用户输入的数据作为执行的参数传给用户。这样的操作不仅使得SQL语句在书写的时候不再需要拼接,看起来也更直接,而且用户输入的数据也没有机会被送到数据库的SQL解释器被编译执行,也不会越权变成代码。

 

 

如何确定SQL注入漏洞

通过以上的实例,我们仍然还会有疑问:黑客并不知道我们程序代码的逻辑和SQL语句的写法,他是如何确定一个网站是否存在SQL注入漏洞呢?一般说来有以下2种途径:

 

1、错误提示

 

如果目标Web网站开启了错误显示,攻击者就可以通过反复调整发送的参数、查看页面打印的错误信息,推测出Web网站使用的数据库和开发语言等重要信息。

 

2、盲注

 

除非运维人员疏忽,否则大部分的Web运营网站应该都关闭了错误提示信息,此时攻击者一般会采用盲注的技巧来进行反复的尝试判断。


之前对sql手工注入和sql注入神器sqlmap做过很详细的介绍,这里就针对sql注入的理论做补充。详细的sql注入姿势请查看前面的文章。


防御SQL注入

对于服务器配置层面的防范,应该保证生产环境的Webserver是关闭错误信息的,比如PHP在生产环境的配置文件php.ini中的display_errors应该设置为Off,这样就关闭了错误提示,下面我们更多的从编码的角度来看看如何防范SQL注入。

 

但凡有SQL注入漏洞的程序,都是因为程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成SQL语句的一部分,对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的「外部数据不可信任」的原则,纵观Web安全领域的各种攻击方式,大多数都是因为开发者违反了这个原则而导致的,所以自然能想到的,就是从变量的检测、过滤、验证下手,确保变量是开发者所预想的。

 

1、检查变量数据类型和格式

 

如果你的SQL语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量idint类型;如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。

 

2、过滤特殊符号

 

对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。以PHP为例,通常是采用addslashes函数,它会在指定的预定义字符前添加反斜杠转义,这些预定义的字符是:单引号 (') 双引号 (") 反斜杠 (\) NULL

 

3、绑定变量,使用预编译语句

 

MySQLmysqli驱动提供了预编译语句的支持,不同的程序语言,都分别有使用预编译语句的方法


4.数据库信息加密安全

Web开发中,传统的加解密大致可以分为三种:

 

1、对称加密:即加密方和解密方都使用相同的加密算法和密钥,这种方案的密钥的保存非常关键,因为算法是公开的,而密钥是保密的,一旦密匙泄露,黑客仍然可以轻易解密。常见的对称加密算法有:AESDES等。

 

2、非对称加密:即使用不同的密钥来进行加解密,密钥被分为公钥和私钥,用私钥加密的数据必须使用公钥来解密,同样用公钥加密的数据必须用对应的私钥来解密,常见的非对称加密算法有:RSA等。

 

3、不可逆加密:利用哈希算法使数据加密之后无法解密回原数据,这样的哈希算法常用的有:md5SHA-1等。

 

sql防御总结

1、不要随意开启生产环境中Webserver的错误显示。

2、永远不要信任来自用户端的变量输入,有固定格式的变量一定要严格检查对应的格式,没有固定格式的变量需要对引号等特殊字符进行必要的过滤转义。

3、使用预编译绑定变量的SQL语句。

4、做好数据库帐号权限管理。

5、严格加密处理用户的机密信息。



本文转自 wt7315 51CTO博客,原文链接:http://blog.51cto.com/wt7315/1856845

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
13天前
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
5天前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
5天前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
1月前
|
自然语言处理 数据库 iOS开发
DBeaver Ultimate Edtion 25.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具
DBeaver Ultimate Edtion 25.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具
104 12
DBeaver Ultimate Edtion 25.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具
|
27天前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
44 16
|
29天前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
1天前
|
SQL IDE 关系型数据库
JetBrains DataGrip 2025.1 发布 - 数据库和 SQL 跨平台 IDE
JetBrains DataGrip 2025.1 (macOS, Linux, Windows) - 数据库和 SQL 跨平台 IDE
20 0
|
1月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】如何将mysql含有group by的SQL转换成崖山支持的SQL
本文探讨了在YashanDB(崖山数据库)中执行某些SQL语句时出现的报错问题,对比了MySQL的成功执行结果。问题源于SQL-92标准对非聚合列的严格限制,要求这些列必须出现在GROUP BY子句中,而SQL:1999及更高版本允许非聚合列直接出现在选择列中。YashanDB和Oracle遵循SQL-92标准,因此会报错。文章提供了两种解决方法:使用聚合函数处理非聚合列,或将GROUP BY与ORDER BY拆分为两层查询。最后总结指出,SQL-92标准更为严谨合理,建议开发者遵循此规范以避免潜在问题。
|
2月前
|
SQL 数据库
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
|
2月前
|
SQL 存储 缓存
MySQL的架构与SQL语句执行过程
MySQL架构分为Server层和存储引擎层,具有高度灵活性和可扩展性。Server层包括连接器、查询缓存(MySQL 8.0已移除)、分析器、优化器和执行器,负责处理SQL语句;存储引擎层负责数据的存储和读取,常见引擎有InnoDB、MyISAM和Memory。SQL执行过程涉及连接、解析、优化、执行和结果返回等步骤,本文详细讲解了一条SQL语句的完整执行过程。
106 3

热门文章

最新文章