长风在线-首页
 首页 >> 软件文库 >> 程序设计 >> 正文
MySQL数据库安全配置
来源: 作者: 阅读: 次 字体:

 1、前言 

  MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户

机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便

、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言

编写访问MySQL 数据库的程序,特别是与PHP更是黄金组合,运用十分广

泛。 

  由于MySQL是多平台的数据库,它的默认配置要考虑各种情况下都能

适用,所以在我们自己的使用环境下应该进行进一步的安全加固。作为

一个MySQL的系统管理员,我们有责任维护MySQL数据库系统的数据安全

性和完整性。 

  MySQL数据库的安全配置必须从两个方面入手,系统内部安全和外部

网络安全,另外我们还将简单介绍编程时要注意的一些问题以及一些小

窍门。 

  2、系统内部安全 

  首先简单介绍一下MySQL数据库目录结构。MySQL安装好,运行了

mysql_db_install脚本以后就会建立数据目录和初始化数据库。如果我

们用MySQL源码包安装,而且安装目录是/usr/local/mysql,那么数据目

录一般会是/usr/local/mysql/var。数据库系统由一系列数据库组成,

每个数据库包含一系列数据库表。MySQL是用数据库名在数据目录建立建

立一个数据库目录,各数据库表分别以数据库表名作为文件名,扩展名

分别为MYD、MYI、frm的三个文件放到数据库目录中。 

  MySQL的授权表给数据库的访问提供了灵活的权限控制,但是如果本

地用户拥有对库文件的读权限的话,攻击者只需把数据库目录打包拷走

,然后拷到自己本机的数据目录下就能访问窃取的数据库。所以MySQL所

在的主机的安全性是最首要的问题,如果主机不安全,被攻击者控制,

那么MySQL的安全性也无从谈起。其次就是数据目录和数据文件的安全性

,也就是权限设置问题。 

  从MySQL主站一些老的binary发行版来看,3.21.xx版本中数据目录

的属性是775,这样非常危险,任何本地用户都可以读数据目录,所以数

据库文件很不安全。3.22.xx版本中数据目录的属性是770,这种属性也

有些危险,本地的同组用户既能读也能写,所以数据文件也不安全。

3.23.xx版本数据目录的属性是700,这样就比较好,只有启动数据库的

用户可以读写数据库文件,保证了本地数据文件的安全。 

  如果启动MySQL数据库的用户是mysql,那么象如下的目录和文件的

是安全的,请注意数据目录及下面的属性: 

  shell>ls -l /usr/local/mysql 

  total 40 

  drwxrwxr-x 2 root root 4096 Feb 27 20:07 bin 

  drwxrwxr-x 3 root root 4096 Feb 27 20:07 include 

  drwxrwxr-x 2 root root 4096 Feb 27 20:07 info drwxrwxr-x 3

root root 4096 Feb 27 20:07 lib drwxrwxr-x 2 root root 4096 Feb

27 20:07 libexec drwxrwxr-x 3 root root 4096 Feb 27 20:07 man

drwxrwxr-x 6 root root 4096 Feb 27 20:07 mysql-test drwxrwxr-x

3 root root 4096 Feb 27 20:07 share drwxrwxr-x 7 root root 4096

Feb 27 20:07 sql-bench drwx------ 4 mysql mysql 4096 Feb 27

20:07 var

  shell>ls -l /usr/local/mysql/var 

  total 8 

  drwx------ 2 mysql mysql 4096 Feb 27 20:08 mysql 

  drwx------ 2 mysql mysql 4096 Feb 27 20:08 test 

  shell>ls -l /usr/local/mysql/var/mysql 

  total 104 

  -rw------- 1 mysql mysql 0 Feb 27 20:08 columns_priv.MYD 

  -rw------- 1 mysql mysql 1024 Feb 27 20:08 columns_priv.MYI

 

  -rw------- 1 mysql mysql 8778 Feb 27 20:08 columns_priv.frm

 

  -rw------- 1 mysql mysql 302 Feb 27 20:08 db.MYD 

  -rw------- 1 mysql mysql 3072 Feb 27 20:08 db.MYI 

  -rw------- 1 mysql mysql 8982 Feb 27 20:08 db.frm 

  -rw------- 1 mysql mysql 0 Feb 27 20:08 func.MYD 

  -rw------- 1 mysql mysql 1024 Feb 27 20:08 func.MYI 

  -rw------- 1 mysql mysql 8641 Feb 27 20:08 func.frm 

  -rw------- 1 mysql mysql 0 Feb 27 20:08 host.MYD 

  -rw------- 1 mysql mysql 1024 Feb 27 20:08 host.MYI 

  -rw------- 1 mysql mysql 8958 Feb 27 20:08 host.frm 

  -rw------- 1 mysql mysql 0 Feb 27 20:08 tables_priv.MYD 

  -rw------- 1 mysql mysql 1024 Feb 27 20:08 tables_priv.MYI 

  -rw------- 1 mysql mysql 8877 Feb 27 20:08 tables_priv.frm 

  -rw------- 1 mysql mysql 428 Feb 27 20:08 user.MYD 

  -rw------- 1 mysql mysql 2048 Feb 27 20:08 user.MYI 

  -rw------- 1 mysql mysql 9148 Feb 27 20:08 user.frm 

  如果这些文件的属主及属性不是这样,请用以下两个命令修正之: 

  shell>chown -R mysql.mysql /usr/local/mysql/var 

  shell>chmod -R go-rwx /usr/local/mysql/var 

  用root用户启动远程服务一直是安全大忌,因为如果服务程序出现

问题,远程攻击者极有可能获得主机的完全控制权。MySQL从3.23.15版

本开始时作了小小的改动,默认安装后服务要用mysql用户来启动,不允

许root用户启动。如果非要用root用户来启动,必须加上--user=root的

参数(./safe_mysqld --user=root &)。因为MySQL中有LOAD DATA

INFILE和SELECT ... INTO OUTFILE的SQL语句,如果是root用户启动了

MySQL服务器,那么,数据库用户就拥有了root用户的写权限。不过

MySQL还是做了一些限制的,比如LOAD DATA INFILE只能读全局可读的文

件,SELECT ... INTO OUTFILE不能覆盖已经存在的文件。 本地的日志

文件也不能忽视,包括shell的日志和MySQL自己的日志。有些用户在本

地登陆或备份数据库的时候为了图方便,有时会在命令行参数里直接带

了数据库的密码,如: shell>/usr/local/mysql/bin/mysqldump -

uroot -ptest test>test.sql shell>/usr/local/mysql/bin/mysql -

uroot -ptest 这些命令会被shell记录在历史文件里,比如bash会写入

用户目录的.bash_history文件,如果这些文件不慎被读,那么数据库的

密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用

户目录的.mysql_history文件里。如果数据库用户用SQL语句修改了数据

库密码,也会因.mysql_history文件而泄漏。所以我们在shell登陆及备

份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。

  另外这两个文件我们也应该不让它记录我们的操作,以防万一。 

  shell>rm .bash_history .mysql_history 

  shell>ln -s /dev/null .bash_history 

  shell>ln -s /dev/null .mysql_history 

  上门这两条命令把这两个文件链接到/dev/null,那么我们的操作就

不会被记录到这两个文件里了。 

  3、外部网络安全 

  MySQL数据库安装好以后,Unix平台的user表是这样的: 

  mysql> use mysql; 

  Database changed 

  mysql> select Host,User,Password,Select_priv,Grant_priv

from user; 

  +-----------+------+----------+-------------+------------+ 

  | Host | User | Password | Select_priv | Grant_priv | 

  +-----------+------+----------+-------------+------------+ 

  | localhost | root | | Y | Y | 

  | redhat | root | | Y | Y | 

  | localhost | | | N | N | 

  | redhat | | | N | N | 

  +-----------+------+----------+-------------+------------+ 

  4 rows in set (0.00 sec) 

  Windows平台的user表是这样的: 

  mysql> use mysql; 

  Database changed 

  mysql> select Host,User,Password,Select_priv,Grant_priv

from user; 

  +-----------+------+----------+-------------+------------+ 

  | Host | User | Password | Select_priv | Grant_priv | 

  +-----------+------+----------+-------------+------------+ 

  | localhost | root | | Y | Y | 

  | % | root | | Y | Y | 

  | localhost | | | Y | Y | 

  | % | | | N | N | 

  +-----------+------+----------+-------------+------------+ 

  4 rows in set (0.00 sec) 我们先来看Unix平台的user表。其中

redhat只是我试验机的机器名,所以实际上Unix平台的MySQL默认只允许

本机才能连接数据库。但是缺省root用户口令是空,所以当务之急是给

root用户加上口令。给数据库用户加口令有三种方法: 1)在shell提示

符下用mysqladmin命令来改root用户口令: 

  shell>mysqladmin -uroot password test 这样,MySQL数据库root

用户的口令就被改成test了。(test只是举例,我们实际使用的口令一

定不能使用这种易猜的弱口令) 

  2)用set password修改口令: 

  mysql> set password for root@localhost=password(‘test‘); 

  这时root用户的口令就被改成test了。 

  3)直接修改user表的root用户口令: 

  mysql> use mysql; 

  mysql> update user set password=password(‘test‘) where

user=‘root‘;

  mysql> flush privileges; 

  这样,MySQL数据库root用户的口令也被改成test了。其中最后一句

命令flush privileges的意思是强制刷新内存授权表,否则用的还是缓

冲中的口令,这时非法用户还可以用root用户及空口令登陆,直到重启

MySQL服务器。 

  我们还看到user为空的匿名用户,虽然它在Unix平台下没什么权限

,但为了安全起见我们应该删除它: 

  mysql> delete from user where user=‘‘; 

  Windows版本MySQL的user表有很大不同,我们看到Host字段除了

localhost还有是%。这里%的意思是允许任意的主机连接MySQL服务器,

这是非常不安全的,给攻击者造成可乘之机,我们必须删除Host字段为%

的记录: 

  mysql>delete from user where host=‘%‘; 

  默认root用户的空密码也是必须修改,三种修改方法和Unix平台一

样。 

  我们注意到Host字段为localhost的匿名用户拥有所有的权限!就是

说本地用户用空的用户名和空的口令登陆MySQL数据库服务器可以得到最

高的权限!所以匿名用户必须删除! 

  mysql> delete from user where user=‘‘; 

  对user表操作以后不要忘了用flush privileges来强制刷新内存授

权表,这样才能生效。 

  默认安装的Windows版MySQL存在的不安全因素太多,我们在安装后

一定要进一步配置! 

  MySQL的5个授权表:user, db, host, tables_priv和columns_priv

提供非常灵活的安全机制,从MySQL 3.22.11开始引入了两条语句GRANT

和REVOKE来创建和删除用户权限,可以方便的限制哪个用户可以连接服

务器,从哪里连接以及连接后可以做什么操作。作为MySQL管理员,我们

必须了解授权表的意义以及如何用GRANT和REVOKE来创建用户、授权和撤

权、删除用户。 在3.22.11版本以前的MySQL授权机制不完善,和新版本

也有较大的不同,建议升级到最新版本的MySQL。(本书的操作例子是以

MySQL 3.23.49为样本)我们先来了解授权表的结构。

  1)MySQL授权表的结构与内容: 

  mysql> desc user; 

  +-----------------+-----------------+------+-----+--------

-+-------+ | Field | Type | Null | Key | Default | Extra | +--

---------------+-----------------+------+-----+---------+-----

--+ 

  | Host | char(60) binary | | PRI | | | 

  | User | char(16) binary | | PRI | | | 

  | Password | char(16) binary | | | | | 

  | Select_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Insert_priv | enum(‘N‘,‘Y‘) | | | N | |

  | Update_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Delete_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Create_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Drop_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Reload_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Shutdown_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Process_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | File_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Grant_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | References_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Index_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Alter_priv | enum(‘N‘,‘Y‘) | | | N | | 

  +-----------------+-----------------+------+-----+--------

-+-------+ 

  17 rows in set (0.01 sec) 

  user表是5个授权表中最重要的一个,列出可以连接服务器的用户及

其加密口令,并且它指定他们有哪种全局(超级用户)权限。在user表

启用的任何权限均是全局权限,并适用于所有数据库。所以我们不能给

任何用户访问mysql.user表的权限! 

  权限说明: 

  +-----------+-------------+-------------------------------

----------------------------------------+ 

  | 权限指定符| 列名 |权限操作 | 

  +-----------+-------------+-------------------------------

----------------------------------------+ 

  | Select | Select_priv | 允许对表的访问,不对数据表进行访问

的select语句不受影响,比如select 1+1| +-----------+-----------

--+-----------------------------------------------------------

------------+ 

  | Insert | Insert_priv | 允许对表用insert语句进行写入操作。

| +-----------+-------------+---------------------------------

--------------------------------------+ 

  | Update | Update_priv | 允许用update语句修改表中现有记录。

| +-----------+-------------+---------------------------------

--------------------------------------+ | Delete | Delete_priv

| 允许用delete语句删除表中现有记录。 | +-----------+----------

---+----------------------------------------------------------

-------------+ | Create | Create_priv | 允许建立新的数据库和表

。 | +-----------+-------------+------------------------------

-----------------------------------------+

  | Drop | Drop_priv | 允许删除现有的数据库和表。 | 

  +-----------+-------------+-------------------------------

----------------------------------------+ 

  | Index | Index_priv | 允许创建、修改或删除索引。 | 

  +-----------+-------------+-------------------------------

----------------------------------------+ 

  | Alter | Alter_priv | 允许用alter语句修改表结构。 | 

  +-----------+-------------+-------------------------------

----------------------------------------+ 

  | Grant | Grant_priv | 允许将自己拥有的权限授予其它用户,包

括grant。 | 

  +-----------+-------------+-------------------------------

----------------------------------------+ 

  | Reload | Reload | 允许重载授权表,刷新服务器等命令。 | 

  +-----------+-------------+-------------------------------

----------------------------------------+ 

  | Shutdown | Shudown_priv| 允许用mysqladmin shutdown命令关

闭MySQL服务器。该权限比较危险, | 

  | | | 不应该随便授予。 | 

  +-----------+-------------+-------------------------------

----------------------------------------+ 

  | Process | Process_priv| 允许查看和终止MySQL服务器正在运行

的线程(进程)以及正在执行的查询语句 | 

  | | | ,包括执行修改密码的查询语句。该权限比较危险,不应该

随便授予。 | 

  +-----------+-------------+-------------------------------

----------------------------------------+ | File | File_priv |

允许从服务器上读全局可读文件和写文件。该权限比较危险,不应该随

便授予。| +-----------+-------------+-------------------------

----------------------------------------------+ 

  mysql> desc db; 

  +-----------------+-----------------+------+-----+--------

-+-------+ | Field | Type | Null | Key | Default | Extra | 

  +-----------------+-----------------+------+-----+--------

-+-------+ | Host | char(60) binary | | PRI | | | | Db | char

(64) binary | | PRI | | | 

  | User | char(16) binary | | PRI | | | 

  | Select_priv | enum(‘N‘,‘Y‘) | | | N | | | Insert_priv

| enum(‘N‘,‘Y‘) | | | N | | | Update_priv | enum(‘N‘,‘Y

‘) | | | N | | 

  | Delete_priv | enum(‘N‘,‘Y‘) | | | N | |

  | Create_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Drop_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Grant_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | References_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Index_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Alter_priv | enum(‘N‘,‘Y‘) | | | N | | 

  +-----------------+-----------------+------+-----+--------

-+-------+ 

  13 rows in set (0.01 sec) 

  db表列出数据库,而用户有权限访问它们。在这里指定的权限适用

于一个数据库中的所有表。 

  mysql> desc host; 

  +-----------------+-----------------+------+-----+--------

-+-------+ 

  | Field | Type | Null | Key | Default | Extra | 

  +-----------------+-----------------+------+-----+--------

-+-------+ 

  | Host | char(60) binary | | PRI | | | 

  | Db | char(64) binary | | PRI | | | 

  | Select_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Insert_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Update_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Delete_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Create_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Drop_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Grant_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | References_priv | enum(‘N‘,‘Y‘) | | | N | | |

Index_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Alter_priv | enum(‘N‘,‘Y‘) | | | N | | 

  +-----------------+-----------------+------+-----+--------

-+-------+ 

  12 rows in set (0.01 sec) 

  host表与db表结合使用在一个较好层次上控制特定主机对数据库的

访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的

影响 ,所以,你可能发觉你根本不是用它。 

  mysql> desc tables_priv; 

  +-------------+-----------------------------+------+-----+

---------+-------+ | Field | Type | Null | Key | Default |

Extra | 

  +-------------+-----------------------------+------+-----+

---------+-------+ | Host | char(60) binary | | PRI | | | | Db

| char(64) binary | | PRI | | | 

  | User | char(16) binary | | PRI | | | | Table_name | char

(60) binary | | PRI | | | | Grantor | char(77) | | MUL | | | 

  | Timestamp | timestamp(14) | YES | | NULL | |

  | Table_priv | set(‘Select‘,‘Insert‘, | | | | | 

  | | ‘Update‘,‘Delete‘,‘Create‘, | | | | | 

  | | ‘Drop‘,‘Grant‘,‘References‘,| | | | | 

  | | ‘Index‘,‘Alter‘) | | | | | 

  | Column_priv | set(‘Select‘,‘Insert‘, | | | | | 

  | | ‘Update‘,‘References‘) | | | | | 

  +-------------+-----------------------------+------+-----+

---------+-------+ 

  8 rows in set (0.01 sec) 

  tables_priv表指定表级权限。在这里指定的一个权限适用于一个表

的所有列。 

  mysql> desc columns_priv; 

  +-------------+------------------------+------+-----+-----

----+----+ 

  | Field | Type | Null | Key | Default | Extra | 

  +-------------+------------------------+------+-----+-----

----+----+ 

  | Host | char(60) binary | | PRI | | | 

  | Db | char(64) binary | | PRI | | | 

  | User | char(16) binary | | PRI | | | 

  | Table_name | char(64) binary | | PRI | | | 

  | Column_name | char(64) binary | | PRI | | | 

  | Timestamp | timestamp(14) | YES | | NULL | | 

  | Column_priv | set(‘Select‘,‘Insert‘, | | | | | 

  | | ‘Update‘,‘References‘) | | | | | +-------------+--

----------------------+------+-----+---------+-------+ 

  7 rows in set (0.00 sec) 

  columns_priv表指定列级权限。在这里指定的权限适用于一个表的

特定列。 

  2)MySQL授权表运行机制 

  MySQL的访问控制分两个步骤: 

  a)服务器检查是否允许该用户连接。 

  b)如果该用户有权连接,那么服务器还会检查它的每一个请求是否

有足够的权限。比如:用户检索数据库中的一个表需要有这个数据库的

select权限,用户删除数据库中的一个表需要有这个数据库的drop权限

。 

  授权表的user, db, host表使用这两个步骤,tables_priv和

columns_priv表只使用第二步(检查请求)。每个授权表包含决定一个

权限何时运用的范围列和决定授予哪种权限的权限列。 范围列指定表中

的权限何时运用。每个授权表条目包含User和Host列来指定权限何时运

用于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db

表包含一个Db列指出权限运用于哪个数据库。类似地,tables_priv和

columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一

个表的特定列。 下面是user表的Host字段和User字段组合的一些例子:

+-----------------------------+--------+----------------------

--------------------------+ | Host值 | User值 | 匹配的连接 | +

-----------------------------+--------+-----------------------

------------------------+

  | ‘x.y.z‘ | ‘test‘ | test用户只能从x.y.z连接数据库 | 

  +-----------------------------+--------+------------------

-----------------------------+ 

  | ‘x.y.z‘ | ‘‘ | 任何用户可以从x.y.z连接数据库 | 

  +-----------------------------+--------+------------------

-----------------------------+ 

  | ‘%‘ | ‘test‘ | test用户可以从任意主机连接数据库 | 

  +-----------------------------+--------+------------------

----------------------------+ 

  | ‘‘ | ‘‘ | 任何用户可以从任意主机连接数据库 | 

  +-----------------------------+--------+------------------

-----------------------------+ 

  | ‘%.y.z‘ | ‘test‘ | test用户可以从y.z域的任意主机连接

数据库 | 

  +-----------------------------+--------+------------------

----------------------------+ 

  | ‘x.y.% ‘ | ‘test‘ | test用户可以从x.y.net, x.y.com,

x.y.edu等主机连接数据库| +-----------------------------+------

--+----------------------------------------------+ 

  | ‘192.168.1.1‘ | ‘test‘ | test用户可以从IP地址为

192.168.1.1的主机连接数据库 | 

  +-----------------------------+--------+------------------

---------------------------+ 

  | ‘192.168.1.% ‘ | ‘test‘ | test用户可以从C类子网

192.168.1中的任意主机连接数据库 | 

  +-----------------------------+--------+------------------

---------------------------+ | ‘192.168.1.0/255.255.255.0‘ |

‘test‘ | 同上 | 

  +-----------------------------+--------+------------------

--------------------------+ 

  SQL的字符串通配符%表示匹配任意字符,可以是0个字符,通配符_

表示匹配一个字符。 

  权限列指出在范围列中指定的用户拥有何种权限。该表使用GRANT语

句的权限名称。对于绝大多数在user、db和host表中的权限列的名称与

GRANT语句中有明显的联系。如Select_priv对应于SELECT权限。 

  3)授权表使用举例 

  grant用于给增加用户和创建权限,revoke用于删除用户权限。 下

面是一些用grant增加用户和创建权限的例子: 

  mysql> grant all privileges on *.* to test@localhost

identified by ‘test‘ with grant option; 

  这句增加一个本地具有所有权限的test用户(超级用户),密码是

test。ON子句中的*.*意味着"所有数据库、所有表"。with grant

option表示它具有grant权限。

  mysql> grant select,insert,update,delete,create,drop

privileges on test.* to test1@‘192.168.1.0/255.255.255.0

identified by ‘test‘; 

  这句是增加了一个test1用户,口令是test,但是它只能从C类子网

192.168.1连接,对test库有

select,insert,update,delete,create,drop操作权限。 

  用grant语句创建权限是不需要再手工刷新授权表的,因为它已经自

动刷新了。 

  给用户创建权限还可以通过直接修改授权表: 

  mysql> insert into user values("localhost","test",password

("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y

"); 

  mysql> flush privileges; 

  这两句和上面第一句grant的效果是一样的,也是增加了一个本地的

test超级用户。我们看到用grant方便多了,而且还不需flush

privileges 。 

  mysql> insert into user (host,user,password) values

("192.168.1.0/255.255.255.0","test1",PASSWORD("test")); 

  mysql> insert into db values

("192.168.1.0/255.255.255.0","test","test1","Y","Y","Y","Y","Y"

,"Y","N","N","N","N") 

  mysql> flush privileges; 

  这三句和上面第二句grant的效果也是一样的,也是增加了一个只能

从C类子网192.168.1连接,对test库有

select,insert,update,delete,create,drop操作权限的test1用户,口

令是test。要取消一个用户的权限,使用revoke语句。revoke的语法非

常类似于grant语句,除了to用from取代并且没有identified by和with

grant option子句,下面是用revoke删除用户权限的例子: 

  mysql> revoke all on test.* from test1@

‘192.168.1.0/255.255.255.0‘; 

  这句revoke就撤消了上面第二句grant创建的权限,但是test1用户

并没有被删除,必须手工从user表删除: 

  mysql> delete from user where user=‘test1‘; mysql> flush

privileges; 

  这样,test1用户就彻底删除了。 

  这些只是MySQL授权表的简单使用,更多详细的资料请见MySQL提供

的手册。 

  3、编程需要注意的一些问题 

  不管是用哪种程序语言写连接MySQL数据库的程序,有一条准则是永

远不要相信用户提交的数据! 

  对于数字字段,我们要使用查询语句:SELECT * FROM table WHERE

ID=‘234‘,不要使用SELECT * FROM table WHERE ID=234这样的查询

语句。MySQL会自动把字串转换为数字字符并且去除非数字字符。如果用

户提交的数据经过了mysql_escape_string处理,这样我们就可以完全杜

绝了sql inject攻击,关于sql inject攻击请参考下面链接的文章:

http://www.spidynamics.com/papers/S...nWhitePaper.pdf

  http://www.ngssoftware.com/papers/a...l_injection.pdf 

  各种编程语言该注意的问题: 

  1)所有Web程序: 

  a)尝试在Web表单输入单引号和双引号来测试可能出现的错误,并找

出原因所在。 

  b)修改URL参数带的" (‘"‘), # (‘#‘), 和 ' (‘‘‘)。 

  c)对于数字字段的变量,我们的应用程序必须进行严格的检查,否

则是非常危险的。 

  d)检查用户提交的数据是否超过字段的长度。 

  e)不要给自己程序连接数据库的用户过多的访问权限。 

  2)PHP: a)检查用户提交的数据在查询之前是否经过addslashes处

理,在PHP 4.0.3以后提供了基于MySQL C API的函数

mysql_escape_string()。 

  3)MySQL C API: 

  a)检查查询字串是否用了mysql_escape_string() API调用。 

  4)MySQL++: 

  a)检查查询字串是否用了escape和quote处理。 

  5)Perl DBI: 

  a)检查查询字串是否用了quote()方法。 

  6)Java JDBC: 

  a)检查查询字串是否用了PreparedStatement对象。 

  4、一些小窍门 

  1)如果不慎忘记了MySQL的root密码,我们可以在启动MySQL服务器

时加上参数--skip-grant-tables来跳过授权表的验证 (./safe_mysqld

--skip-grant-tables &),这样我们就可以直接登陆MySQL服务器,然后

再修改root用户的口令,重启MySQL就可以用新口令登陆了。 

  2)启动MySQL服务器时加上--skip-show-database使一般数据库用户

不能浏览其它数据库。 3)启动MySQL服务器时加上--chroot=path参数,

让mysqld守护进程运行在chroot环境中。这样SQL语句LOAD DATA INFILE

和SELECT ... INTO OUTFILE就限定在chroot_path下读写文件了。这里

有一点要注意,MySQL启动后会建立一个mysql.sock文件,默认是在/tmp

目录下。使用了chroot后,MySQL会在chroot_path/tmp去建立

mysql.sock文件,如果没有chroot_path/tmp目录或启动MySQL的用户没

有这个目录写权限就不能建立mysql.sock文件,MySQL会启动失败。比如

我们加了--chroot=/usr/local/mysql/启动参数,那么最好建立一个启

动MySQL的用户能写的 

  /usr/local/mysql/tmp目录,当然我们也可以用--socket=path来指

定mysql.sock文件的路径,但这个path一定要在chroot_path里面。 

  4)启动MySQL服务器时加上--log-slow-queries[=file]参数,这样

mysqld会把SQL命令执行时间超过long_query_time的写入file文件。如

果没有指定=file,mysqld默认会写到数据目录下的hostname-slow.log

。如果只指定了filename,没有指定路径,那么mysqld也会把filename

写到数据目录下。我们通过这个日志文件可以找出执行时间超长的查询

语句,然后尽可能的优化它减轻MySQL服务器的负担。 

  5)如果我们只需本机使用MySQL服务,那么我们还可以加上--skip-

networking启动参数使MySQL不监听任何TCP/IP连接,增加安全性。(非

常推荐) 

  6)MySQL的更多mysqld启动选项请见MySQL手册4.16.4 mysqld

Command-line Options

转载本站文章请注明 来源:长风在线 http://www.CF66.Net
上一篇: asp基础教程
下一篇: JScript错误代码及相应解释大全
【投稿日期:2006-11-17 18:59:24】【责任编辑:】【会员投稿】【收藏本页
 文章评论

会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
 相关文章
 >> 站 内 搜 索
 
 >> 推 荐 阅 读
- 他与3个女人的故事:浪子,
- 我的儿媳妇,撑起摇摇欲坠
- 新素食主义者 我行我素
- 单车运动,“骑”乐无穷
- 幸福在哪里——荆门女子的
- 诗人阿翔:无声世界里的旅行
- 我们能否再回到从前 - 我的
- 不能给她幸福,只能为她祝
- 农村汉子捐肾救妻叩开生命
- 银行卡该怎样使用?——专