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

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软件,若无任何显示表明未安装。

rpm -qa  *mysql*

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

mount  /dev/cdrom  /mnt

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

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。

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

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

二、数据库管理


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.

五、用户与权限管理


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

主要用户权限


select


读取表的数据


insert


向表中插入数据


update


更新表中的数据


delete


删除表中的数据


index


创建或删除表的索引


create


创建新的数据库和表


alter


修改表的结构


grant


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


drop


删除现存的数据库和表


file


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


reload


重新装载授权表


process


查看当前执行的查询


shutdown


停止或关闭mysql服务


all


具有全部权限

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

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

2.查看用户的权限

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

3.撤销用户的权限

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

六、数据库的备份与恢复

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

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

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

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

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

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

七、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、严格加密处理用户的机密信息。

时间: 2024-12-21 19:14:31

linux之mysql数据库搭建及sql注入和防御的相关文章

Linux mysql数据库搭建

设共享软件包地址192.168.80.10 setenforce  0 service  iptables  stop 1.共享软件包 mount.cifs   //192.168.80.10/r   /media/                 匿名访问共享文件夹 cd   /media/ ls     查看是否挂载成功了 tar   xzvf   mysql-5.5.24.tar.gz   -C   /opt/        解压至/opt/ cd   /opt/ mysql-5.5.24

linux下mysql数据库主从同步配置

说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备篇: 说明:在两台MySQL服务器192.168.21.128和192.168.21.129上分别进行如下操作 备注: 作为主从服务器的MySQL版本建议使用同一版本! 或者必须保证主服务器的MySQL版本要高于从服务器的MySQL版本! 一.配置好IP.DNS .网关,确保使用远程连接工具能够连接

Java 之 MYSQL 数据库搭建

1.首先要去加载java的mysql驱动,将下载的mysql-connect-bin-java.jar包添加到该项目下2.然后通过 Class.forName("com.mysql.jdbc.Driver"); 加载Mysql数据驱动 3. 通过getConnection的URL模式去连接注意,有时候如果报 连接池连接数据库报Communications link failure 错误,将你的localhost换成127.0.0.1试试 1 package chp07; 2 impor

Linux下MYSQL数据库的基本操作

建立数据库: mysql> create database test; //建立一个名为"test"的数据库 建立数据库表: mysql> create table test -> (name char(16) not null, -> passwd char(16) ->); //建立一个名为"test"的表,里面有两个字段,一个字段名为"name",类型为char,大小为16,非空:另一个字段名为"pa

linux下mysql数据库的学习

转载博客:http://freedomljtt.blog.163.com/blog/static/72294949201210145441701/ ubuntu12.04 卸载和安装mysql 卸载mysql 第一步 1 sudo apt-get autoremove --purge mysql-server-5.0 2 sudo apt-get remove mysql-server 3 sudo apt-get autoremove mysql-server 4 sudo apt-get r

linux下mysql数据库 模型, 管理表 索引

1.linux下mysql数据库及其模型 1.1.SHOW TABLE STATUS LIKE 'user'\G   #查看表的存储引擎 SHOW ENGINES;   #查看数据库支持的存储引擎 客户端工具:mysql.mysqladmin.mysqldump.mysqlimport.mysqlcheck 服务器端工具:mysqld, mysqld_safe, mysqld_multi 1.2.my.cnf检查顺序: /etc/my.cnf --> /etc/mysql/my.cnf -->

mysql数据库批量执行sql文件对数据库进行操作【windows版本】

起因: 因工作需要,在本机测试环境升级mysql数据库,需逐条执行mysql数据库的sql文件对数据库进行升级,因此找了些关于mysql的文章,对批量升级数据库所需的sql文件进行升级. 整理思路: 首先,需要对所需升级的sql所在目录的sql文件进行遍历.生成新的批量执行sql文件.想到是windows系统安装的mysql,首先想到使用bat进行sql文件的生成: 生成sql文件后,还需要使用bat文件连接到数据库,并使用新生成的sql文件进行升级. 想到升级的过程中还有可能字符集出现问题,因

关于sql注入与防御,having 1=1问题

最新在看sql注入与防御这个本,在第32页上,有个说明:用于显示数据库执行语句的信息,比如having 1=1. 本人 数据库:mysql 版本:5.1.66 执行:select * from aa where id=2 having 1=1;   --将注入转化为实际的sql,简写. 结果:是有正确结果的. ----------------------------------------------------------------------------------------------

jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一个客户可以对应多个订单,一个订单只属于一个客户! * 建表原则: * 在多的一方创建一个字段,作为外键指向一的一方的主键!!! * 多对多: * 一个学生可以选择多个课程,一个课程也可以被多个学生选择! * 建表原则: * 创建第三张表,第三张表中放入两个字段,作为外键分别指向多对多双方的主键! *