您的位置:首页 > 运维架构 > Linux

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

2016-11-04 11:16 531 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wt7315.blog.51cto.com/10319657/1856845

mysql中文手册下载地址:http://down.51cto.com/data/2244392
sql注入各种姿势:http://wt7315.blog.51cto.com/10319657/1828167
sqlmap注入神器详解:http://wt7315.blog.51cto.com/10319657/1841241

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

运行在Linux系统上的关系型数据库管理系统主要产品:
企业级服务器:Oracle、Sybase、DB2
中小型服务器:MySQL、PostgreSQL

一、MySQL简介和安装
总体来说,MySQL数据库管理系统具有以下主要特点:
①可以运行在不同平台上,支持多用户、多线程和多CPU,没有内存溢出漏洞;
②提供多种数据类型,支持ODBC、SSL、支持多种语言利用MySQL的API进行开发;
③是目前市场上现有产品中运行速度最快的数据库系统;
④同时访问数据库的用户数量不受限制;
⑤可以保存超过50,000,000条记录;
⑥用户权限设置简单、有效。

查看系统中是否已安装mysql软件,若无任何显示表明未安装。
将DVD安装光盘放入光驱,并将光驱挂载到/mnt目录中。
由于此主机既作为服务器端又作为客户端,这里先安装MySQL的客户端安装包,该安装包的依赖软件包是perl-DBI。MySQL的服务端安装包还要依赖perl-DBD-MySQL软件包













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

二、数据库管理

MySQL命令
功能
show databases;
查看服务器中当前有哪些数据库
use 数据库名;
选择所使用的数据库
create database 数据库名;
创建数据库
drop database 数据库名;
删除指定的数据库
mysql安装后默认会创建三个数据库information_schema、mysql和test, 其中名为“mysql”的数据库很重要,它里面保存有MYSQL的系统信息,用户修改密码和新增用户,实际上就是针对该数据库中的有关数据表进行操作。




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

三、数据表结构管理
MySQL命令
功能
create table 表名 (字段设定列表);
在当前数据库中创建数据表
show tables;
显示当前数据库中有哪些数据表
describe [数据库名.]表名;
显示当前或指定数据库中指定数据表的结构(字段)信息
drop table [数据库名.]表名;
drop table [数据库名.]表名;
创建表的时候必须至少有一个列




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


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。




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




五、用户与权限管理

主要用户权限
select
读取表的数据
insert
向表中插入数据
update
更新表中的数据
delete
删除表中的数据
index
创建或删除表的索引
create
创建新的数据库和表
alter
修改表的结构
grant
将自己拥有的某些权限授予其他用户
drop
删除现存的数据库和表
file
在数据库服务器上读取和写入文件
reload
重新装载授权表
process
查看当前执行的查询
shutdown
停止或关闭mysql服务
all
具有全部权限
1.增加一个名为test的MySQL用户,允许其从本地主机(即MySQL数据库所在的主机)上登录,且只能对数据库student进行查询,用户密码设置为123456。





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




2.查看用户的权限




3.撤销用户的权限




六、数据库的备份与恢复

(1).直接备份数据库所在的目录
使用cp、tar等命令直接备份数据库所存放的目录
2.使用mysqldump命令备份和恢复




附: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.)恢复(导入)数据




七、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被执行前,检查确保变量id是int类型;如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入***。

2、过滤特殊符号

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

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

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

4.数据库信息加密安全
在Web开发中,传统的加解密大致可以分为三种:

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

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

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

sql防御总结
1、不要随意开启生产环境中Webserver的错误显示。
2、永远不要信任来自用户端的变量输入,有固定格式的变量一定要严格检查对应的格式,没有固定格式的变量需要对引号等特殊字符进行必要的过滤转义。
3、使用预编译绑定变量的SQL语句。
4、做好数据库帐号权限管理。
5、严格加密处理用户的机密信息。

本文出自 “罹殇” 博客,请务必保留此出处http://wt7315.blog.51cto.com/10319657/1856845
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux MySQL 服务器